@swoff/cli 0.3.6 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +375 -91
- package/bin/swoff +8 -14
- package/dist/__tests__/assemble-sw.test.js +2 -2
- package/dist/__tests__/assemble-sw.test.js.map +1 -1
- package/dist/__tests__/cli-integration.test.js +0 -1
- package/dist/__tests__/cli-integration.test.js.map +1 -1
- package/dist/__tests__/config-types.test.js +4 -3
- package/dist/__tests__/config-types.test.js.map +1 -1
- package/dist/__tests__/file-generators.test.js +12 -23
- package/dist/__tests__/file-generators.test.js.map +1 -1
- package/dist/__tests__/loader.test.js +0 -1
- package/dist/__tests__/loader.test.js.map +1 -1
- package/dist/__tests__/validator.test.js +0 -1
- package/dist/__tests__/validator.test.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/commands/add.js +4 -4
- package/dist/lib/commands/add.js.map +1 -1
- package/dist/lib/commands/generate-guide.js +33 -6
- package/dist/lib/commands/generate-guide.js.map +1 -1
- package/dist/lib/commands/info.js +18 -4
- package/dist/lib/commands/info.js.map +1 -1
- package/dist/lib/commands/init.js +6 -2
- package/dist/lib/commands/init.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-fetch.js +3 -3
- package/dist/lib/generators/file-generators/auth-fetch.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-store.js +114 -5
- package/dist/lib/generators/file-generators/auth-store.js.map +1 -1
- package/dist/lib/generators/file-generators/auth-user.js +2 -2
- package/dist/lib/generators/file-generators/auth-user.js.map +1 -1
- package/dist/lib/generators/file-generators/cache.js +1 -3
- package/dist/lib/generators/file-generators/cache.js.map +1 -1
- package/dist/lib/generators/file-generators/client-injector.js +4 -16
- package/dist/lib/generators/file-generators/client-injector.js.map +1 -1
- package/dist/lib/generators/file-generators/fetch-wrapper.js +40 -15
- package/dist/lib/generators/file-generators/fetch-wrapper.js.map +1 -1
- package/dist/lib/generators/file-generators/generate-hooks.js +23 -209
- package/dist/lib/generators/file-generators/generate-hooks.js.map +1 -1
- package/dist/lib/generators/file-generators/guide-generator.js +153 -36
- package/dist/lib/generators/file-generators/guide-generator.js.map +1 -1
- package/dist/lib/generators/file-generators/mutation-queue.js +31 -3
- package/dist/lib/generators/file-generators/mutation-queue.js.map +1 -1
- package/dist/lib/generators/file-generators/push.js +143 -0
- package/dist/lib/generators/file-generators/push.js.map +1 -0
- package/dist/lib/generators/file-generators/quick-readme.js +13 -3
- package/dist/lib/generators/file-generators/quick-readme.js.map +1 -1
- package/dist/lib/generators/file-generators/sw-generator-build.js +1 -1
- package/dist/lib/generators/file-generators/sw-injector.js +1 -1
- package/dist/lib/generators/file-generators/sw-push.js +67 -0
- package/dist/lib/generators/file-generators/sw-push.js.map +1 -0
- package/dist/lib/generators/file-generators/sw-template.js +2 -0
- package/dist/lib/generators/file-generators/sw-template.js.map +1 -1
- package/dist/lib/generators/file-generators/type-definitions.js +13 -13
- package/dist/lib/generators/sw-generator.js +8 -9
- package/dist/lib/generators/sw-generator.js.map +1 -1
- package/dist/lib/generators/sw-sections/activate-handler.js +6 -2
- package/dist/lib/generators/sw-sections/activate-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js +5 -1
- package/dist/lib/generators/sw-sections/assemble-sw.js.map +1 -1
- package/dist/lib/generators/sw-sections/default-template.js +1 -30
- package/dist/lib/generators/sw-sections/default-template.js.map +1 -1
- package/dist/lib/generators/sw-sections/fetch-handler.js +157 -86
- package/dist/lib/generators/sw-sections/fetch-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/install-handler.js +12 -10
- package/dist/lib/generators/sw-sections/install-handler.js.map +1 -1
- package/dist/lib/generators/sw-sections/tag-management.js +11 -0
- package/dist/lib/generators/sw-sections/tag-management.js.map +1 -1
- package/dist/lib/generators/swoff-files-generator.js +9 -9
- package/dist/lib/generators/swoff-files-generator.js.map +1 -1
- package/dist/lib/shared/config-types.js +5 -3
- package/dist/lib/shared/config-types.js.map +1 -1
- package/package.json +3 -2
- package/templates/hooks/useAuth.jsx +30 -0
- package/templates/hooks/useAuth.tsx +30 -0
- package/templates/hooks/useBackgroundSync.jsx +31 -0
- package/templates/hooks/useBackgroundSync.tsx +31 -0
- package/templates/hooks/useCacheInvalidation.jsx +19 -0
- package/templates/hooks/useCacheInvalidation.tsx +19 -0
- package/templates/hooks/useCachedFetch.jsx +55 -0
- package/templates/hooks/useCachedFetch.tsx +69 -0
- package/templates/hooks/useMutationQueue.jsx +34 -0
- package/templates/hooks/useMutationQueue.tsx +34 -0
- package/templates/hooks/useNetworkStatus.jsx +19 -0
- package/templates/hooks/useNetworkStatus.tsx +19 -0
- package/templates/hooks/usePushSubscription.jsx +67 -0
- package/templates/hooks/usePushSubscription.tsx +67 -0
- package/templates/hooks/useSWUpdate.jsx +76 -0
- package/templates/hooks/useSWUpdate.tsx +76 -0
|
@@ -1,5 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { join } from "path";
|
|
1
|
+
import { copyFileSync, existsSync, mkdirSync } from "fs";
|
|
2
|
+
import { join, dirname } from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const templatesDir = join(__dirname, "../../../../templates/hooks");
|
|
6
|
+
function copyHook(hooksDir, name, ext) {
|
|
7
|
+
const src = join(templatesDir, `${name}.${ext}x`);
|
|
8
|
+
copyFileSync(src, join(hooksDir, `${name}.${ext}x`));
|
|
9
|
+
}
|
|
3
10
|
export function generateHooks(ctx) {
|
|
4
11
|
const { config, swoffDir, ext, frameworkName } = ctx;
|
|
5
12
|
if (frameworkName !== "react")
|
|
@@ -8,218 +15,25 @@ export function generateHooks(ctx) {
|
|
|
8
15
|
if (!existsSync(hooksDir)) {
|
|
9
16
|
mkdirSync(hooksDir, { recursive: true });
|
|
10
17
|
}
|
|
18
|
+
copyHook(hooksDir, "useNetworkStatus", ext);
|
|
19
|
+
copyHook(hooksDir, "useCachedFetch", ext);
|
|
11
20
|
if (config.features.pwa.enabled) {
|
|
12
|
-
|
|
21
|
+
copyHook(hooksDir, "useSWUpdate", ext);
|
|
13
22
|
}
|
|
14
23
|
if (config.features.auth.enabled) {
|
|
15
|
-
|
|
24
|
+
copyHook(hooksDir, "useAuth", ext);
|
|
16
25
|
}
|
|
17
26
|
if (config.features.mutationQueue) {
|
|
18
|
-
|
|
27
|
+
copyHook(hooksDir, "useMutationQueue", ext);
|
|
28
|
+
}
|
|
29
|
+
if (config.features.pushNotifications?.enabled) {
|
|
30
|
+
copyHook(hooksDir, "usePushSubscription", ext);
|
|
31
|
+
}
|
|
32
|
+
if (config.features.backgroundSync) {
|
|
33
|
+
copyHook(hooksDir, "useBackgroundSync", ext);
|
|
34
|
+
}
|
|
35
|
+
if (config.features.tagInvalidation) {
|
|
36
|
+
copyHook(hooksDir, "useCacheInvalidation", ext);
|
|
19
37
|
}
|
|
20
|
-
writeCachedFetchHook(hooksDir, ext, config.features.tagInvalidation);
|
|
21
|
-
}
|
|
22
|
-
function writePWAHooks(dir, ext) {
|
|
23
|
-
writeFileSync(join(dir, `usePWAUpdate.${ext}x`), `import { useState, useEffect, useCallback } from "react";
|
|
24
|
-
import { handleUpdateApproved } from "../client-injector.${ext}";
|
|
25
|
-
|
|
26
|
-
export function usePWAUpdate() {
|
|
27
|
-
const [state, setState] = useState({
|
|
28
|
-
updateStatus: "idle",
|
|
29
|
-
currentVersion: null as string | null,
|
|
30
|
-
availableVersion: null as string | null,
|
|
31
|
-
progress: 0,
|
|
32
|
-
forceUpdate: false,
|
|
33
|
-
error: null as string | null,
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
setState((s) => ({ ...s, currentVersion: (window as any).currentSWVersion || null }));
|
|
38
|
-
|
|
39
|
-
const onAvailable = (e: CustomEvent) => setState((s) => ({
|
|
40
|
-
...s,
|
|
41
|
-
updateStatus: "available" as const,
|
|
42
|
-
availableVersion: e.detail.version,
|
|
43
|
-
forceUpdate: (window as any).swUpdateRequired || false,
|
|
44
|
-
}));
|
|
45
|
-
const onProgress = (e: CustomEvent) => setState((s) => ({
|
|
46
|
-
...s,
|
|
47
|
-
updateStatus: "downloading" as const,
|
|
48
|
-
progress: e.detail.percent,
|
|
49
|
-
}));
|
|
50
|
-
const onReady = () => setState((s) => ({ ...s, updateStatus: "idle" as const, progress: 0 }));
|
|
51
|
-
const onError = () => setState((s) => ({ ...s, error: "SW registration failed" }));
|
|
52
|
-
|
|
53
|
-
window.addEventListener("sw-update-available", onAvailable as EventListener);
|
|
54
|
-
window.addEventListener("sw-progress", onProgress as EventListener);
|
|
55
|
-
window.addEventListener("sw-ready", onReady);
|
|
56
|
-
window.addEventListener("sw-error", onError);
|
|
57
|
-
return () => {
|
|
58
|
-
window.removeEventListener("sw-update-available", onAvailable as EventListener);
|
|
59
|
-
window.removeEventListener("sw-progress", onProgress as EventListener);
|
|
60
|
-
window.removeEventListener("sw-ready", onReady);
|
|
61
|
-
window.removeEventListener("sw-error", onError);
|
|
62
|
-
};
|
|
63
|
-
}, []);
|
|
64
|
-
|
|
65
|
-
const acceptUpdate = useCallback(async () => {
|
|
66
|
-
if (!state.availableVersion) return;
|
|
67
|
-
await handleUpdateApproved(state.availableVersion);
|
|
68
|
-
}, [state.availableVersion]);
|
|
69
|
-
|
|
70
|
-
const dismissUpdate = useCallback(() => {
|
|
71
|
-
sessionStorage.setItem("sw-dismissed-update", "true");
|
|
72
|
-
setState((s) => ({ ...s, updateStatus: "idle" }));
|
|
73
|
-
}, []);
|
|
74
|
-
|
|
75
|
-
return { ...state, acceptUpdate, dismissUpdate };
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export function useSWProgress() {
|
|
79
|
-
const [state, setState] = useState({
|
|
80
|
-
status: "idle" as "idle" | "installing",
|
|
81
|
-
progress: 0,
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
useEffect(() => {
|
|
85
|
-
const onProgress = (e: CustomEvent) => setState({
|
|
86
|
-
status: "installing",
|
|
87
|
-
progress: e.detail.percent,
|
|
88
|
-
});
|
|
89
|
-
const onReady = () => setState({ status: "idle", progress: 0 });
|
|
90
|
-
|
|
91
|
-
window.addEventListener("sw-progress", onProgress as EventListener);
|
|
92
|
-
window.addEventListener("sw-ready", onReady);
|
|
93
|
-
return () => {
|
|
94
|
-
window.removeEventListener("sw-progress", onProgress as EventListener);
|
|
95
|
-
window.removeEventListener("sw-ready", onReady);
|
|
96
|
-
};
|
|
97
|
-
}, []);
|
|
98
|
-
|
|
99
|
-
return state;
|
|
100
|
-
}
|
|
101
|
-
`);
|
|
102
|
-
// useSWProgress is included in the same file
|
|
103
|
-
}
|
|
104
|
-
function writeAuthHook(dir, ext) {
|
|
105
|
-
writeFileSync(join(dir, `useAuth.${ext}x`), `import { useState, useEffect } from "react";
|
|
106
|
-
import { getAuthState } from "../auth/state.${ext}";
|
|
107
|
-
|
|
108
|
-
export function useAuth() {
|
|
109
|
-
const [state, setState] = useState({
|
|
110
|
-
authenticated: false,
|
|
111
|
-
user: null as Record<string, unknown> | null,
|
|
112
|
-
online: navigator.onLine,
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
useEffect(() => {
|
|
116
|
-
getAuthState().then(setState);
|
|
117
|
-
|
|
118
|
-
const onOnline = () => setState((s) => ({ ...s, online: true }));
|
|
119
|
-
const onOffline = () => setState((s) => ({ ...s, online: false }));
|
|
120
|
-
const onAuthChange = () => getAuthState().then(setState);
|
|
121
|
-
|
|
122
|
-
window.addEventListener("online", onOnline);
|
|
123
|
-
window.addEventListener("offline", onOffline);
|
|
124
|
-
window.addEventListener("sw-auth-state-change", onAuthChange);
|
|
125
|
-
|
|
126
|
-
return () => {
|
|
127
|
-
window.removeEventListener("online", onOnline);
|
|
128
|
-
window.removeEventListener("offline", onOffline);
|
|
129
|
-
window.removeEventListener("sw-auth-state-change", onAuthChange);
|
|
130
|
-
};
|
|
131
|
-
}, []);
|
|
132
|
-
|
|
133
|
-
return state;
|
|
134
|
-
}
|
|
135
|
-
`);
|
|
136
|
-
}
|
|
137
|
-
function writeCachedFetchHook(dir, ext, tagInvalidation) {
|
|
138
|
-
const ts = ext === "ts";
|
|
139
|
-
const extraEffect = tagInvalidation
|
|
140
|
-
? `
|
|
141
|
-
useEffect(() => {
|
|
142
|
-
const onInvalidated${ts ? ": EventListener" : ""} = (e${ts ? ": Event" : ""}) => {
|
|
143
|
-
const detail = (e as CustomEvent).detail;
|
|
144
|
-
const tags = detail?.tags;
|
|
145
|
-
if (!tags || !Array.isArray(tags)) return;
|
|
146
|
-
const urlTags = generateTags(url);
|
|
147
|
-
if (tags.some((t) => urlTags.includes(t))) {
|
|
148
|
-
setRefetchCount((c) => c + 1);
|
|
149
|
-
}
|
|
150
|
-
};
|
|
151
|
-
window.addEventListener("cache-invalidated", onInvalidated);
|
|
152
|
-
return () => window.removeEventListener("cache-invalidated", onInvalidated);
|
|
153
|
-
}, [url]);`
|
|
154
|
-
: "";
|
|
155
|
-
const importTags = tagInvalidation
|
|
156
|
-
? `import { generateTags } from "../invalidation-tags.${ext}";\n`
|
|
157
|
-
: "";
|
|
158
|
-
const stringType = ts ? ": string" : "";
|
|
159
|
-
const respType = ts ? "<Response | null>" : "";
|
|
160
|
-
writeFileSync(join(dir, `useCachedFetch.${ext}x`), `import { useState, useEffect, useCallback } from "react";
|
|
161
|
-
import { fetchWithCache } from "../fetch-wrapper.${ext}";
|
|
162
|
-
${importTags}
|
|
163
|
-
export function useCachedFetch(url${stringType}, options = {}) {
|
|
164
|
-
const [data, setData] = useState${respType}(null);
|
|
165
|
-
const [error, setError] = useState(null);
|
|
166
|
-
const [loading, setLoading] = useState(true);
|
|
167
|
-
const [refetchCount, setRefetchCount] = useState(0);
|
|
168
|
-
|
|
169
|
-
const refetch = useCallback(() => setRefetchCount((c) => c + 1), []);
|
|
170
|
-
|
|
171
|
-
useEffect(() => {
|
|
172
|
-
let cancelled = false;
|
|
173
|
-
setLoading(true);
|
|
174
|
-
fetchWithCache(url, options)
|
|
175
|
-
.then(({ response }) => {
|
|
176
|
-
if (cancelled) return;
|
|
177
|
-
setData(response);
|
|
178
|
-
setError(null);
|
|
179
|
-
})
|
|
180
|
-
.catch((err) => {
|
|
181
|
-
if (cancelled) return;
|
|
182
|
-
setError(err);
|
|
183
|
-
})
|
|
184
|
-
.finally(() => {
|
|
185
|
-
if (!cancelled) setLoading(false);
|
|
186
|
-
});
|
|
187
|
-
return () => { cancelled = true; };
|
|
188
|
-
}, [url, refetchCount]);
|
|
189
|
-
${extraEffect}
|
|
190
|
-
return { data, error, loading, refetch };
|
|
191
|
-
}
|
|
192
|
-
`);
|
|
193
|
-
}
|
|
194
|
-
function writeMutationQueueHook(dir, ext) {
|
|
195
|
-
writeFileSync(join(dir, `useMutationQueue.${ext}x`), `import { useState, useEffect } from "react";
|
|
196
|
-
import { getPendingCount } from "../mutation-queue.${ext}";
|
|
197
|
-
|
|
198
|
-
export function useMutationQueue() {
|
|
199
|
-
const [state, setState] = useState<{
|
|
200
|
-
pending: number;
|
|
201
|
-
lastSync: { succeeded: number; failed: number } | null;
|
|
202
|
-
}>({ pending: 0, lastSync: null });
|
|
203
|
-
|
|
204
|
-
useEffect(() => {
|
|
205
|
-
getPendingCount().then((count: number) => setState((s) => ({ ...s, pending: count })));
|
|
206
|
-
|
|
207
|
-
const onSync = (e: CustomEvent) => setState({
|
|
208
|
-
pending: 0,
|
|
209
|
-
lastSync: { succeeded: e.detail.succeeded, failed: e.detail.failed },
|
|
210
|
-
});
|
|
211
|
-
const onChange = async () => { const count = await getPendingCount(); setState((s) => ({ ...s, pending: count })); };
|
|
212
|
-
|
|
213
|
-
window.addEventListener("mutation-sync-complete", onSync as EventListener);
|
|
214
|
-
window.addEventListener("mutation-queue-changed", onChange);
|
|
215
|
-
return () => {
|
|
216
|
-
window.removeEventListener("mutation-sync-complete", onSync as EventListener);
|
|
217
|
-
window.removeEventListener("mutation-queue-changed", onChange);
|
|
218
|
-
};
|
|
219
|
-
}, []);
|
|
220
|
-
|
|
221
|
-
return state;
|
|
222
|
-
}
|
|
223
|
-
`);
|
|
224
38
|
}
|
|
225
39
|
//# sourceMappingURL=generate-hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-hooks.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/generate-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"generate-hooks.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/generate-hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;AAEpE,SAAS,QAAQ,CAAC,QAAgB,EAAE,IAAY,EAAE,GAAW;IAC3D,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC;IAClD,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAqB;IACjD,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,GAAG,CAAC;IACrD,IAAI,aAAa,KAAK,OAAO;QAAE,OAAO;IAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAE1C,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAChC,QAAQ,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAClC,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;QAC/C,QAAQ,CAAC,QAAQ,EAAE,qBAAqB,EAAE,GAAG,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;QACnC,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QACpC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
|
|
@@ -17,33 +17,32 @@ export function generateGuide(ctx) {
|
|
|
17
17
|
wb("## 📦 Service Worker Registration");
|
|
18
18
|
w("The service worker handles caching, offline support, background sync, and PWA installability.");
|
|
19
19
|
w("");
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
w("- `handleUpdateApproved(version)` — accepts a pending update and reloads on activation");
|
|
38
|
-
w("- `skipWaiting()` — activates a waiting SW without reloading");
|
|
39
|
-
w("");
|
|
40
|
-
}
|
|
41
|
-
}
|
|
20
|
+
w("### `client-injector.ts` — Single entry point");
|
|
21
|
+
w("This is the **only file you need to import** at app startup to enable all Swoff features.");
|
|
22
|
+
w("```ts");
|
|
23
|
+
w(`import { initServiceWorker } from "./swoff/client-injector.${ext}";`);
|
|
24
|
+
w("initServiceWorker();");
|
|
25
|
+
w("```");
|
|
26
|
+
w("It wires together: SW registration, PWA install prompt, mutation queue online listener, and cross-tab sync.");
|
|
27
|
+
w("");
|
|
28
|
+
w("### `sw/injector.ts` — SW registration logic");
|
|
29
|
+
w("Handles registering the service worker, checking for updates via version.json, and dispatching");
|
|
30
|
+
w("update-available / ready / error events on the window.");
|
|
31
|
+
w("");
|
|
32
|
+
w("**Functions:**");
|
|
33
|
+
w("- `initServiceWorker()` — registers the SW and checks for updates");
|
|
34
|
+
w("- `handleUpdateApproved(version)` — accepts a pending update and reloads on activation");
|
|
35
|
+
w("- `skipWaiting()` — activates a waiting SW without reloading");
|
|
36
|
+
w("");
|
|
42
37
|
// ── Fetch Wrapper ──
|
|
43
38
|
wb("## 🌐 fetchWithCache — API calls with caching");
|
|
44
39
|
w("A drop-in replacement for `fetch()` that communicates with the service worker about caching strategy.");
|
|
45
40
|
w("GET requests are cached by the SW for offline access; POST/PUT/DELETE pass through.");
|
|
46
41
|
w("");
|
|
42
|
+
w("**Important:** Use `fetchWithCache` for all API calls — it sets the `X-SW-Cache-Strategy` header that");
|
|
43
|
+
w("the SW uses to determine whether to apply a caching strategy. Plain `fetch()` works for uncached requests,");
|
|
44
|
+
w("but if `cacheStrategy` is set to `\"explicit-only\"`, the SW will skip plain `fetch()` calls entirely.");
|
|
45
|
+
w("");
|
|
47
46
|
w("### `fetch-wrapper.ts`");
|
|
48
47
|
w("```ts");
|
|
49
48
|
w(`import { fetchWithCache } from "./swoff/fetch-wrapper.${ext}";`);
|
|
@@ -64,7 +63,7 @@ export function generateGuide(ctx) {
|
|
|
64
63
|
w("");
|
|
65
64
|
w("**Returns** `{ response: Response, fromCache: boolean }` — `fromCache` lets the UI show stale indicators when a stale-while-revalidate fallback is served.");
|
|
66
65
|
w("");
|
|
67
|
-
w("**Note:**
|
|
66
|
+
w("**Note:** For authenticated requests, pass `{ auth: true }` — there is no separate auth fetch wrapper.");
|
|
68
67
|
w("");
|
|
69
68
|
if (ctx.frameworkName === "react") {
|
|
70
69
|
w("### React Hook: `useCachedFetch`");
|
|
@@ -72,15 +71,59 @@ export function generateGuide(ctx) {
|
|
|
72
71
|
w("```tsx");
|
|
73
72
|
w(`import { useCachedFetch } from "./swoff/hooks/useCachedFetch.${ext}x";`);
|
|
74
73
|
w("");
|
|
75
|
-
w('const { data, error, loading, refetch } = useCachedFetch("/api/todos");');
|
|
74
|
+
w('const { data, error, loading, refetch } = useCachedFetch<Todo[]>("/api/todos");');
|
|
76
75
|
w("```");
|
|
77
76
|
w("");
|
|
78
|
-
w("**Returns** `{ data:
|
|
77
|
+
w("**Returns** `{ data: T | null, error, loading, refetch }` — `data` is the parsed JSON response.");
|
|
79
78
|
w("");
|
|
80
79
|
w("The hook listens for `cache-invalidated` events (when tag invalidation is enabled) and automatically");
|
|
81
80
|
w("re-fetches if the event's tags match the URL. Call `refetch()` to manually refresh.");
|
|
82
81
|
w("");
|
|
82
|
+
w("### React Hook: `useNetworkStatus`");
|
|
83
|
+
w("Tracks online/offline state reactively.");
|
|
84
|
+
w("```tsx");
|
|
85
|
+
w(`import { useNetworkStatus } from "./swoff/hooks/useNetworkStatus.${ext}x";`);
|
|
86
|
+
w("");
|
|
87
|
+
w("const online = useNetworkStatus();");
|
|
88
|
+
w("```");
|
|
89
|
+
w("");
|
|
90
|
+
w("**Returns** `boolean` — `true` when online, `false` when offline.");
|
|
91
|
+
w("");
|
|
83
92
|
}
|
|
93
|
+
// ── Cache Strategy Resolution ──
|
|
94
|
+
wb("## 🎯 Cache Strategy Resolution");
|
|
95
|
+
w("The SW uses a 3-tier priority system to determine which caching strategy applies to each request:");
|
|
96
|
+
w("");
|
|
97
|
+
w("1. **Per-request override (highest)** — set `strategy` or `staleWhileRevalidate` on `fetchWithCache()`.");
|
|
98
|
+
w(" Sent as `X-SW-Strategy` header to the SW.");
|
|
99
|
+
w("2. **URL pattern match** — configured in `swoff.config.json` under `features.serviceWorker.strategies`.");
|
|
100
|
+
w(" e.g. `\"/api/*\": \"network-first\"` matches all paths starting with `/api/`.");
|
|
101
|
+
w("3. **Default (lowest)** — `features.serviceWorker.defaultStrategy` (default: `\"cache-first\"`).");
|
|
102
|
+
w("");
|
|
103
|
+
w("### Cache strategy mode");
|
|
104
|
+
w("The `features.serviceWorker.cacheStrategy` option controls when strategies are invoked:");
|
|
105
|
+
w("");
|
|
106
|
+
w("- `\"all\"` (default): every GET/HEAD request goes through strategy dispatch, including plain `fetch()` calls.");
|
|
107
|
+
w("- `\"explicit-only\"`: only requests with an `X-SW-Cache-Strategy` header (set automatically by `fetchWithCache()`)");
|
|
108
|
+
w(" are processed by the SW strategy system. Plain `fetch()` calls pass through unmodified.");
|
|
109
|
+
w("");
|
|
110
|
+
w("### Request dispatch flow");
|
|
111
|
+
w("Each GET/HEAD request follows this path through the SW:");
|
|
112
|
+
w("");
|
|
113
|
+
w("```");
|
|
114
|
+
w("navigation (SPA fallback) → precache check → strategy dispatch → network pass-through");
|
|
115
|
+
w("```");
|
|
116
|
+
w("");
|
|
117
|
+
w("### Available strategies");
|
|
118
|
+
w("");
|
|
119
|
+
w("| Strategy | Behavior | Best for |");
|
|
120
|
+
w("|----------|----------|----------|");
|
|
121
|
+
w("| `cache-first` | Return cached if available, else fetch + cache. Default | Static assets, images, fonts |");
|
|
122
|
+
w("| `network-first` | Try network, cache on success, fall back to cache | API endpoints, dynamic content |");
|
|
123
|
+
w("| `stale-while-revalidate` | Return cached immediately, refresh in background | Fast UI, non-critical data |");
|
|
124
|
+
w("| `cache-only` | Serve from cache only (404 if missing) | Offline-critical assets |");
|
|
125
|
+
w("| `network-only` | Always fetch, never cache | Sensitive or real-time data |");
|
|
126
|
+
w("");
|
|
84
127
|
// ── Mutation Queue ──
|
|
85
128
|
if (config.features.mutationQueue) {
|
|
86
129
|
wb("## 📝 Mutation Queue — offline writes that sync when back online");
|
|
@@ -124,6 +167,18 @@ export function generateGuide(ctx) {
|
|
|
124
167
|
w("");
|
|
125
168
|
w("> ⚠️ Background Sync is Chrome/Edge only. Not supported in Firefox or Safari.");
|
|
126
169
|
w("");
|
|
170
|
+
if (ctx.frameworkName === "react") {
|
|
171
|
+
w("### React Hook: `useBackgroundSync`");
|
|
172
|
+
w("Reactive background sync state and trigger.");
|
|
173
|
+
w("```tsx");
|
|
174
|
+
w(`import { useBackgroundSync } from "./swoff/hooks/useBackgroundSync.${ext}x";`);
|
|
175
|
+
w("");
|
|
176
|
+
w('const { supported, registered, lastSync, triggerSync } = useBackgroundSync();');
|
|
177
|
+
w("```");
|
|
178
|
+
w("");
|
|
179
|
+
w("**Returns** `{ supported, registered, lastSync, triggerSync }` — `triggerSync()` calls `syncWhenPossible()`.");
|
|
180
|
+
w("");
|
|
181
|
+
}
|
|
127
182
|
}
|
|
128
183
|
}
|
|
129
184
|
// ── Auth ──
|
|
@@ -163,29 +218,31 @@ export function generateGuide(ctx) {
|
|
|
163
218
|
w("- `isAuthValid(auth)` — check expiry");
|
|
164
219
|
w("- `createAuthFromResponse(response)` — extract AuthData from login response. **Edit this.**");
|
|
165
220
|
w("");
|
|
166
|
-
w("###
|
|
167
|
-
w("
|
|
168
|
-
w("No separate `authenticatedMutation` needed — just use `authenticatedFetch` for both reads and writes.");
|
|
221
|
+
w("### Authenticated API calls with fetchWithCache");
|
|
222
|
+
w("Use `fetchWithCache` with `auth: true` for all authenticated requests — no separate auth fetch needed.");
|
|
169
223
|
w("```ts");
|
|
170
|
-
w(`import {
|
|
224
|
+
w(`import { fetchWithCache } from "./swoff/fetch-wrapper.${ext}";`);
|
|
225
|
+
w(`import { ensureValidAuth } from "./swoff/auth/store.${ext}";`);
|
|
171
226
|
w("");
|
|
172
227
|
w("// Authenticated GET");
|
|
173
|
-
w('const
|
|
228
|
+
w('const { response } = await fetchWithCache("/api/me", { auth: true });');
|
|
229
|
+
w('const user = await response.json();');
|
|
174
230
|
w("");
|
|
175
231
|
w("// Authenticated POST (mutation)");
|
|
176
|
-
w(
|
|
232
|
+
w('await fetchWithCache("/api/todos", {');
|
|
177
233
|
w(' method: "POST",');
|
|
178
234
|
w(' body: JSON.stringify({ title: "New" }),');
|
|
235
|
+
w(' auth: true,');
|
|
179
236
|
w("});");
|
|
180
237
|
w("```");
|
|
181
238
|
w("");
|
|
182
239
|
w("**Functions:**");
|
|
183
|
-
w("- `
|
|
240
|
+
w("- `fetchWithCache(input, options)` — pass `{ auth: true }` for auth headers, cache bypass for auth endpoints, and 401 handling.");
|
|
184
241
|
w("- `ensureValidAuth()` — check expiry and refresh token if needed (uses refreshPath from config).");
|
|
185
242
|
w("");
|
|
186
243
|
w("**Where to edit:**");
|
|
187
|
-
w("- The `isAuthUrl` function in `auth/
|
|
188
|
-
w("- If your auth type is `custom`, edit the `withAuthHeaders` function.");
|
|
244
|
+
w("- The `isAuthUrl` function in `auth/store.ts` lists auth endpoints that bypass the SW cache. Edit this list if your backend uses different paths.");
|
|
245
|
+
w("- If your auth type is `custom`, edit the `withAuthHeaders` function in `auth/store.ts`.");
|
|
189
246
|
w("");
|
|
190
247
|
w("### `auth/user.ts` — User data caching");
|
|
191
248
|
w("```ts");
|
|
@@ -212,6 +269,7 @@ export function generateGuide(ctx) {
|
|
|
212
269
|
w("### React Hooks");
|
|
213
270
|
w("- `useAuth()` — returns `{ authenticated, user, online }`, listens to online/offline/auth changes");
|
|
214
271
|
w("- `useCachedFetch(url, options?)` — fetches with auto-refetch on tag invalidation, see Fetch Wrapper section");
|
|
272
|
+
w("- `useNetworkStatus()` — returns `boolean`, standalone online/offline tracker, see Fetch Wrapper section");
|
|
215
273
|
w("");
|
|
216
274
|
}
|
|
217
275
|
}
|
|
@@ -255,6 +313,18 @@ export function generateGuide(ctx) {
|
|
|
255
313
|
w("- `invalidateByTag(tag)` — invalidate a single tag. Dispatches `cache-invalidated` event.");
|
|
256
314
|
w("- `invalidateByTags(tags)` — invalidate multiple tags.");
|
|
257
315
|
w("");
|
|
316
|
+
if (ctx.frameworkName === "react") {
|
|
317
|
+
w("### React Hook: `useCacheInvalidation`");
|
|
318
|
+
w("Reactive wrapper around cache invalidation functions.");
|
|
319
|
+
w("```tsx");
|
|
320
|
+
w(`import { useCacheInvalidation } from "./swoff/hooks/useCacheInvalidation.${ext}x";`);
|
|
321
|
+
w("");
|
|
322
|
+
w('const { invalidateByTag, invalidateByTags, invalidateUrl } = useCacheInvalidation();');
|
|
323
|
+
w("```");
|
|
324
|
+
w("");
|
|
325
|
+
w("Returns stable `useCallback`-wrapped versions of each invalidation function.");
|
|
326
|
+
w("");
|
|
327
|
+
}
|
|
258
328
|
}
|
|
259
329
|
// ── Cross-tab Sync ──
|
|
260
330
|
if (config.features.crossTabSync) {
|
|
@@ -270,6 +340,51 @@ export function generateGuide(ctx) {
|
|
|
270
340
|
w("");
|
|
271
341
|
}
|
|
272
342
|
}
|
|
343
|
+
// ── Push Notifications ──
|
|
344
|
+
if (config.features.pushNotifications?.enabled) {
|
|
345
|
+
wb("## 🔔 Push Notifications — subscription management");
|
|
346
|
+
w("Swoff generates a push notification subscription client with IndexedDB persistence");
|
|
347
|
+
w("and the service worker push event handlers.");
|
|
348
|
+
w("");
|
|
349
|
+
w("### `push.ts` — Client-side subscription management");
|
|
350
|
+
w("```ts");
|
|
351
|
+
w(`import { subscribeToPush, unsubscribeFromPush, isSubscribed } from "./swoff/push.${ext}";`);
|
|
352
|
+
w("");
|
|
353
|
+
w("// Subscribe (triggers permission prompt)");
|
|
354
|
+
w('const sub = await subscribeToPush("YOUR_VAPID_PUBLIC_KEY");');
|
|
355
|
+
w("if (sub) {");
|
|
356
|
+
w(' await fetch("/api/push/subscribe", {');
|
|
357
|
+
w(' method: "POST",');
|
|
358
|
+
w(" body: JSON.stringify(sub.toJSON()),");
|
|
359
|
+
w(" });");
|
|
360
|
+
w("}");
|
|
361
|
+
w("");
|
|
362
|
+
w("// Unsubscribe");
|
|
363
|
+
w("await unsubscribeFromPush();");
|
|
364
|
+
w("```");
|
|
365
|
+
w("");
|
|
366
|
+
w("**Functions:**");
|
|
367
|
+
w("- `subscribeToPush(vapidPublicKey)` — request permission and subscribe");
|
|
368
|
+
w("- `unsubscribeFromPush()` — unsubscribe and clear stored subscription");
|
|
369
|
+
w("- `isSubscribed()` — check if subscribed");
|
|
370
|
+
w("- `getPushSubscription()` — get current PushSubscription object");
|
|
371
|
+
w("- `requestNotificationPermission()` — request permission only (returns boolean)");
|
|
372
|
+
w("");
|
|
373
|
+
if (ctx.frameworkName === "react") {
|
|
374
|
+
w("### React Hook: `usePushSubscription`");
|
|
375
|
+
w("```tsx");
|
|
376
|
+
w(`import { usePushSubscription } from "./swoff/hooks/usePushSubscription.${ext}x";`);
|
|
377
|
+
w("");
|
|
378
|
+
w('const { subscribed, subscription, permission, loading, subscribe, unsubscribe } =');
|
|
379
|
+
w(' usePushSubscription("YOUR_VAPID_PUBLIC_KEY");');
|
|
380
|
+
w("```");
|
|
381
|
+
w("");
|
|
382
|
+
w("**Returns** `{ subscribed, subscription, permission, loading, subscribe, unsubscribe }`");
|
|
383
|
+
w("The hook listens for push-subscription-changed and push-permission-changed events.");
|
|
384
|
+
w("Use `subscribe()` and `unsubscribe()` to toggle push notifications.");
|
|
385
|
+
w("");
|
|
386
|
+
}
|
|
387
|
+
}
|
|
273
388
|
// ── PWA ──
|
|
274
389
|
if (config.features.pwa.enabled) {
|
|
275
390
|
wb("## 📱 PWA — installable web app");
|
|
@@ -298,7 +413,7 @@ export function generateGuide(ctx) {
|
|
|
298
413
|
w("");
|
|
299
414
|
if (ctx.frameworkName === "react") {
|
|
300
415
|
w("### React Hooks");
|
|
301
|
-
w("- `
|
|
416
|
+
w("- `useSWUpdate()` — returns `{ updateStatus, currentVersion, availableVersion, forceUpdate, error, acceptUpdate, dismissUpdate }`");
|
|
302
417
|
w("- `useSWProgress()` — returns `{ status, progress }` for download progress during SW update");
|
|
303
418
|
w("- `useCachedFetch(url, options?)` — fetches with auto-refetch on tag invalidation, see Fetch Wrapper section");
|
|
304
419
|
w("");
|
|
@@ -324,8 +439,10 @@ export function generateGuide(ctx) {
|
|
|
324
439
|
w("- `auth.enabled` — auth module (bearer/cookie/custom)");
|
|
325
440
|
w("- `crossTabSync` — broadcast changes across tabs");
|
|
326
441
|
w("- `tagInvalidation` — cache invalidation by tags");
|
|
327
|
-
w("- `clientRegistration` — SW registration with version management");
|
|
328
442
|
w("- `pwa.enabled` — PWA install prompt and manifest");
|
|
443
|
+
w("- `serviceWorker.cacheStrategy` — caching strategy mode (`\"all\"` or `\"explicit-only\"`)");
|
|
444
|
+
w("- `serviceWorker.defaultStrategy` — default caching strategy");
|
|
445
|
+
w("- `serviceWorker.strategies` — per-route strategy overrides");
|
|
329
446
|
w("");
|
|
330
447
|
w("---");
|
|
331
448
|
writeFile(ctx, "GUIDE.md", lines.join("\n"));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"guide-generator.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/guide-generator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"guide-generator.js","sourceRoot":"","sources":["../../../../src/lib/generators/file-generators/guide-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAoB,SAAS,EAAE,MAAM,cAAc,CAAC;AAE3D,MAAM,UAAU,aAAa,CAAC,GAAqB;IACjD,MAAM,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IACvB,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;IACpB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAE5C,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC/B,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,8EAA8E,CAAC,CAAC;IAClF,CAAC,CAAC,6GAA6G,CAAC,CAAC;IACjH,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,wBAAwB;IACxB,EAAE,CAAC,mCAAmC,CAAC,CAAC;IACxC,CAAC,CAAC,+FAA+F,CAAC,CAAC;IACnG,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,CAAC,CAAC,+CAA+C,CAAC,CAAC;IACnD,CAAC,CAAC,2FAA2F,CAAC,CAAC;IAC/F,CAAC,CAAC,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,8DAA8D,GAAG,IAAI,CAAC,CAAC;IACzE,CAAC,CAAC,sBAAsB,CAAC,CAAC;IAC1B,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,CAAC,CAAC,6GAA6G,CAAC,CAAC;IACjH,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,CAAC,CAAC,8CAA8C,CAAC,CAAC;IAClD,CAAC,CAAC,gGAAgG,CAAC,CAAC;IACpG,CAAC,CAAC,wDAAwD,CAAC,CAAC;IAC5D,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACpB,CAAC,CAAC,mEAAmE,CAAC,CAAC;IACvE,CAAC,CAAC,wFAAwF,CAAC,CAAC;IAC5F,CAAC,CAAC,8DAA8D,CAAC,CAAC;IAClE,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,sBAAsB;IACtB,EAAE,CAAC,+CAA+C,CAAC,CAAC;IACpD,CAAC,CAAC,uGAAuG,CAAC,CAAC;IAC3G,CAAC,CAAC,qFAAqF,CAAC,CAAC;IACzF,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,uGAAuG,CAAC,CAAC;IAC3G,CAAC,CAAC,4GAA4G,CAAC,CAAC;IAChH,CAAC,CAAC,wGAAwG,CAAC,CAAC;IAC5G,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,CAAC,CAAC,wBAAwB,CAAC,CAAC;IAC5B,CAAC,CAAC,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,yDAAyD,GAAG,IAAI,CAAC,CAAC;IACpE,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,6BAA6B,CAAC,CAAC;IACjC,CAAC,CAAC,uEAAuE,CAAC,CAAC;IAC3E,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,oCAAoC,CAAC,CAAC;IACxC,CAAC,CAAC,wCAAwC,CAAC,CAAC;IAC5C,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACvB,CAAC,CAAC,gDAAgD,CAAC,CAAC;IACpD,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,CAAC,CAAC,gBAAgB,CAAC,CAAC;IACpB,CAAC,CAAC,kFAAkF,CAAC,CAAC;IACtF,CAAC,CAAC,oIAAoI,CAAC,CAAC;IACxI,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,4JAA4J,CAAC,CAAC;IAChK,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,CAAC,CAAC,wGAAwG,CAAC,CAAC;IAC5G,CAAC,CAAC,EAAE,CAAC,CAAC;IAEJ,IAAI,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;QAClC,CAAC,CAAC,kCAAkC,CAAC,CAAC;QACtC,CAAC,CAAC,sEAAsE,CAAC,CAAC;QAC1E,CAAC,CAAC,QAAQ,CAAC,CAAC;QACZ,CAAC,CAAC,gEAAgE,GAAG,KAAK,CAAC,CAAC;QAC5E,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,iFAAiF,CAAC,CAAC;QACrF,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,iGAAiG,CAAC,CAAC;QACrG,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,sGAAsG,CAAC,CAAC;QAC1G,CAAC,CAAC,qFAAqF,CAAC,CAAC;QACzF,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,oCAAoC,CAAC,CAAC;QACxC,CAAC,CAAC,yCAAyC,CAAC,CAAC;QAC7C,CAAC,CAAC,QAAQ,CAAC,CAAC;QACZ,CAAC,CAAC,oEAAoE,GAAG,KAAK,CAAC,CAAC;QAChF,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,oCAAoC,CAAC,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,mEAAmE,CAAC,CAAC;QACvE,CAAC,CAAC,EAAE,CAAC,CAAC;IACR,CAAC;IAEH,kCAAkC;IAClC,EAAE,CAAC,iCAAiC,CAAC,CAAC;IACtC,CAAC,CAAC,mGAAmG,CAAC,CAAC;IACvG,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,yGAAyG,CAAC,CAAC;IAC7G,CAAC,CAAC,8CAA8C,CAAC,CAAC;IAClD,CAAC,CAAC,yGAAyG,CAAC,CAAC;IAC7G,CAAC,CAAC,kFAAkF,CAAC,CAAC;IACtF,CAAC,CAAC,kGAAkG,CAAC,CAAC;IACtG,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAC7B,CAAC,CAAC,yFAAyF,CAAC,CAAC;IAC7F,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,gHAAgH,CAAC,CAAC;IACpH,CAAC,CAAC,qHAAqH,CAAC,CAAC;IACzH,CAAC,CAAC,2FAA2F,CAAC,CAAC;IAC/F,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC/B,CAAC,CAAC,yDAAyD,CAAC,CAAC;IAC7D,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,CAAC,CAAC,uFAAuF,CAAC,CAAC;IAC3F,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,0BAA0B,CAAC,CAAC;IAC9B,CAAC,CAAC,EAAE,CAAC,CAAC;IACN,CAAC,CAAC,oCAAoC,CAAC,CAAC;IACxC,CAAC,CAAC,oCAAoC,CAAC,CAAC;IACxC,CAAC,CAAC,4GAA4G,CAAC,CAAC;IAChH,CAAC,CAAC,0GAA0G,CAAC,CAAC;IAC9G,CAAC,CAAC,8GAA8G,CAAC,CAAC;IAClH,CAAC,CAAC,qFAAqF,CAAC,CAAC;IACzF,CAAC,CAAC,8EAA8E,CAAC,CAAC;IAClF,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,uBAAuB;IACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;QAClC,EAAE,CAAC,kEAAkE,CAAC,CAAC;QACvE,CAAC,CAAC,kGAAkG,CAAC,CAAC;QACtG,CAAC,CAAC,0FAA0F,CAAC,CAAC;QAC9F,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAC7B,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,gHAAgH,GAAG,IAAI,CAAC,CAAC;QAC3H,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,2BAA2B,CAAC,CAAC;QAC/B,CAAC,CAAC,uBAAuB,CAAC,CAAC;QAC3B,CAAC,CAAC,mBAAmB,CAAC,CAAC;QACvB,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAC1B,CAAC,CAAC,+BAA+B,CAAC,CAAC;QACnC,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACxB,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,4EAA4E,CAAC,CAAC;QAChF,CAAC,CAAC,yBAAyB,CAAC,CAAC;QAC7B,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC,4DAA4D,CAAC,CAAC;QAChE,CAAC,CAAC,8FAA8F,CAAC,CAAC;QAClG,CAAC,CAAC,2EAA2E,CAAC,CAAC;QAC/E,CAAC,CAAC,8DAA8D,CAAC,CAAC;QAClE,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,IAAI,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;YACnC,CAAC,CAAC,sDAAsD,CAAC,CAAC;YAC1D,CAAC,CAAC,mGAAmG,CAAC,CAAC;YACvG,CAAC,CAAC,sGAAsG,CAAC,CAAC;YAC1G,CAAC,CAAC,OAAO,CAAC,CAAC;YACX,CAAC,CAAC,6DAA6D,GAAG,IAAI,CAAC,CAAC;YACxE,CAAC,CAAC,mFAAmF,CAAC,CAAC;YACvF,CAAC,CAAC,KAAK,CAAC,CAAC;YACT,CAAC,CAAC,EAAE,CAAC,CAAC;YAEN,CAAC,CAAC,gBAAgB,CAAC,CAAC;YACpB,CAAC,CAAC,qEAAqE,CAAC,CAAC;YACzE,CAAC,CAAC,0FAA0F,CAAC,CAAC;YAC9F,CAAC,CAAC,EAAE,CAAC,CAAC;YAEN,CAAC,CAAC,+EAA+E,CAAC,CAAC;YACnF,CAAC,CAAC,EAAE,CAAC,CAAC;YAEN,IAAI,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;gBAClC,CAAC,CAAC,qCAAqC,CAAC,CAAC;gBACzC,CAAC,CAAC,6CAA6C,CAAC,CAAC;gBACjD,CAAC,CAAC,QAAQ,CAAC,CAAC;gBACZ,CAAC,CAAC,sEAAsE,GAAG,KAAK,CAAC,CAAC;gBAClF,CAAC,CAAC,EAAE,CAAC,CAAC;gBACN,CAAC,CAAC,+EAA+E,CAAC,CAAC;gBACnF,CAAC,CAAC,KAAK,CAAC,CAAC;gBACT,CAAC,CAAC,EAAE,CAAC,CAAC;gBACN,CAAC,CAAC,8GAA8G,CAAC,CAAC;gBAClH,CAAC,CAAC,EAAE,CAAC,CAAC;YACR,CAAC;QACH,CAAC;IAEH,CAAC;IAID,aAAa;IACb,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,EAAE,CAAC,0DAA0D,CAAC,CAAC;QAC/D,CAAC,CAAC,mGAAmG,CAAC,CAAC;QACvG,CAAC,CAAC,oDAAoD,CAAC,CAAC;QACxD,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAC3C,CAAC,CAAC,gBAAgB,QAAQ,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC1B,CAAC,CAAC,gFAAgF,CAAC,CAAC;YACpF,CAAC,CAAC,kFAAkF,CAAC,CAAC;YACtF,CAAC,CAAC,wFAAwF,CAAC,CAAC;YAC5F,CAAC,CAAC,EAAE,CAAC,CAAC;QACR,CAAC;QAED,CAAC,CAAC,kDAAkD,CAAC,CAAC;QACtD,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,wGAAwG,GAAG,IAAI,CAAC,CAAC;QACnH,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,4CAA4C,CAAC,CAAC;QAChD,CAAC,CAAC,4CAA4C,CAAC,CAAC;QAChD,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,iCAAiC,CAAC,CAAC;QACrC,CAAC,CAAC,+BAA+B,CAAC,CAAC;QACnC,CAAC,CAAC,qDAAqD,CAAC,CAAC;QACzD,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACxB,CAAC,CAAC,oGAAoG,CAAC,CAAC;QACxG,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC,qEAAqE,CAAC,CAAC;QACzE,CAAC,CAAC,8DAA8D,CAAC,CAAC;QAClE,CAAC,CAAC,yDAAyD,CAAC,CAAC;QAC7D,CAAC,CAAC,sCAAsC,CAAC,CAAC;QAC1C,CAAC,CAAC,6FAA6F,CAAC,CAAC;QACjG,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,iDAAiD,CAAC,CAAC;QACrD,CAAC,CAAC,wGAAwG,CAAC,CAAC;QAC5G,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,yDAAyD,GAAG,IAAI,CAAC,CAAC;QACpE,CAAC,CAAC,uDAAuD,GAAG,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAC1B,CAAC,CAAC,uEAAuE,CAAC,CAAC;QAC3E,CAAC,CAAC,qCAAqC,CAAC,CAAC;QACzC,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,kCAAkC,CAAC,CAAC;QACtC,CAAC,CAAC,sCAAsC,CAAC,CAAC;QAC1C,CAAC,CAAC,mBAAmB,CAAC,CAAC;QACvB,CAAC,CAAC,2CAA2C,CAAC,CAAC;QAC/C,CAAC,CAAC,eAAe,CAAC,CAAC;QACnB,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC,iIAAiI,CAAC,CAAC;QACrI,CAAC,CAAC,kGAAkG,CAAC,CAAC;QACtG,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,oBAAoB,CAAC,CAAC;QACxB,CAAC,CAAC,mJAAmJ,CAAC,CAAC;QACvJ,CAAC,CAAC,0FAA0F,CAAC,CAAC;QAC9F,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,wCAAwC,CAAC,CAAC;QAC5C,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,kGAAkG,GAAG,IAAI,CAAC,CAAC;QAC7G,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,qCAAqC,CAAC,CAAC;QACzC,CAAC,CAAC,wCAAwC,CAAC,CAAC;QAC5C,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC,0EAA0E,CAAC,CAAC;QAC9E,CAAC,CAAC,oEAAoE,CAAC,CAAC;QACxE,CAAC,CAAC,oDAAoD,CAAC,CAAC;QACxD,CAAC,CAAC,iEAAiE,CAAC,CAAC;QACrE,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,4CAA4C,CAAC,CAAC;QAChD,CAAC,CAAC,4IAA4I,CAAC,CAAC;QAChJ,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,oDAAoD,GAAG,IAAI,CAAC,CAAC;QAC/D,CAAC,CAAC,+DAA+D,CAAC,CAAC;QACnE,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,IAAI,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YAClC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACrB,CAAC,CAAC,mGAAmG,CAAC,CAAC;YACvG,CAAC,CAAC,8GAA8G,CAAC,CAAC;YAClH,CAAC,CAAC,0GAA0G,CAAC,CAAC;YAC9G,CAAC,CAAC,EAAE,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IAED,yBAAyB;IACzB,IAAI,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QACpC,EAAE,CAAC,kDAAkD,CAAC,CAAC;QACvD,CAAC,CAAC,4FAA4F,CAAC,CAAC;QAChG,CAAC,CAAC,qFAAqF,CAAC,CAAC;QACzF,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,kBAAkB,CAAC,CAAC;QACtB,CAAC,CAAC,mFAAmF,CAAC,CAAC;QACvF,CAAC,CAAC,6DAA6D,CAAC,CAAC;QACjE,CAAC,CAAC,+EAA+E,CAAC,CAAC;QACnF,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,qDAAqD,CAAC,CAAC;QACzD,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,0EAA0E,GAAG,IAAI,CAAC,CAAC;QACrF,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,cAAc,CAAC,CAAC;QAClB,CAAC,CAAC,wFAAwF,CAAC,CAAC;QAC5F,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,6BAA6B,CAAC,CAAC;QACjC,CAAC,CAAC,uCAAuC,CAAC,CAAC;QAC3C,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC,yGAAyG,CAAC,CAAC;QAC7G,CAAC,CAAC,mFAAmF,CAAC,CAAC;QACvF,CAAC,CAAC,iFAAiF,CAAC,CAAC;QACrF,CAAC,CAAC,6EAA6E,CAAC,CAAC;QACjF,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,yCAAyC,CAAC,CAAC;QAC7C,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,oEAAoE,GAAG,IAAI,CAAC,CAAC;QAC/E,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,iCAAiC,CAAC,CAAC;QACrC,CAAC,CAAC,kDAAkD,CAAC,CAAC;QACtD,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC,2FAA2F,CAAC,CAAC;QAC/F,CAAC,CAAC,wDAAwD,CAAC,CAAC;QAC5D,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,IAAI,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YAClC,CAAC,CAAC,wCAAwC,CAAC,CAAC;YAC5C,CAAC,CAAC,uDAAuD,CAAC,CAAC;YAC3D,CAAC,CAAC,QAAQ,CAAC,CAAC;YACZ,CAAC,CAAC,4EAA4E,GAAG,KAAK,CAAC,CAAC;YACxF,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,sFAAsF,CAAC,CAAC;YAC1F,CAAC,CAAC,KAAK,CAAC,CAAC;YACT,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,8EAA8E,CAAC,CAAC;YAClF,CAAC,CAAC,EAAE,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QACjC,EAAE,CAAC,0CAA0C,CAAC,CAAC;QAC/C,CAAC,CAAC,mGAAmG,CAAC,CAAC;QACvG,CAAC,CAAC,yDAAyD,CAAC,CAAC;QAC7D,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,qFAAqF,CAAC,CAAC;QACzF,CAAC,CAAC,sFAAsF,CAAC,CAAC;QAC1F,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;YACrC,CAAC,CAAC,qFAAqF,CAAC,CAAC;YACzF,CAAC,CAAC,EAAE,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,EAAE,CAAC;QAC/C,EAAE,CAAC,oDAAoD,CAAC,CAAC;QACzD,CAAC,CAAC,oFAAoF,CAAC,CAAC;QACxF,CAAC,CAAC,6CAA6C,CAAC,CAAC;QACjD,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,qDAAqD,CAAC,CAAC;QACzD,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,oFAAoF,GAAG,IAAI,CAAC,CAAC;QAC/F,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,2CAA2C,CAAC,CAAC;QAC/C,CAAC,CAAC,6DAA6D,CAAC,CAAC;QACjE,CAAC,CAAC,YAAY,CAAC,CAAC;QAChB,CAAC,CAAC,wCAAwC,CAAC,CAAC;QAC5C,CAAC,CAAC,qBAAqB,CAAC,CAAC;QACzB,CAAC,CAAC,yCAAyC,CAAC,CAAC;QAC7C,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,GAAG,CAAC,CAAC;QACP,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC,8BAA8B,CAAC,CAAC;QAClC,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC,wEAAwE,CAAC,CAAC;QAC5E,CAAC,CAAC,uEAAuE,CAAC,CAAC;QAC3E,CAAC,CAAC,0CAA0C,CAAC,CAAC;QAC9C,CAAC,CAAC,iEAAiE,CAAC,CAAC;QACrE,CAAC,CAAC,iFAAiF,CAAC,CAAC;QACrF,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,IAAI,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YAClC,CAAC,CAAC,uCAAuC,CAAC,CAAC;YAC3C,CAAC,CAAC,QAAQ,CAAC,CAAC;YACZ,CAAC,CAAC,0EAA0E,GAAG,KAAK,CAAC,CAAC;YACtF,CAAC,CAAC,EAAE,CAAC,CAAC;YACN,CAAC,CAAC,mFAAmF,CAAC,CAAC;YACvF,CAAC,CAAC,iDAAiD,CAAC,CAAC;YACrD,CAAC,CAAC,KAAK,CAAC,CAAC;YACT,CAAC,CAAC,EAAE,CAAC,CAAC;YAEN,CAAC,CAAC,yFAAyF,CAAC,CAAC;YAC7F,CAAC,CAAC,oFAAoF,CAAC,CAAC;YACxF,CAAC,CAAC,qEAAqE,CAAC,CAAC;YACzE,CAAC,CAAC,EAAE,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IAED,YAAY;IACZ,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAChC,EAAE,CAAC,iCAAiC,CAAC,CAAC;QACtC,CAAC,CAAC,yFAAyF,CAAC,CAAC;QAC7F,CAAC,CAAC,uBAAuB,CAAC,CAAC;QAC3B,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,sBAAsB,CAAC,CAAC;QAC1B,CAAC,CAAC,OAAO,CAAC,CAAC;QACX,CAAC,CAAC,sFAAsF,GAAG,IAAI,CAAC,CAAC;QACjG,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,kEAAkE,CAAC,CAAC;QACtE,CAAC,CAAC,EAAE,CAAC,CAAC;QACN,CAAC,CAAC,uCAAuC,CAAC,CAAC;QAC3C,CAAC,CAAC,wBAAwB,CAAC,CAAC;QAC5B,CAAC,CAAC,8CAA8C,CAAC,CAAC;QAClD,CAAC,CAAC,GAAG,CAAC,CAAC;QACP,CAAC,CAAC,KAAK,CAAC,CAAC;QACT,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC,wGAAwG,CAAC,CAAC;QAC5G,CAAC,CAAC,4DAA4D,CAAC,CAAC;QAChE,CAAC,CAAC,sDAAsD,CAAC,CAAC;QAC1D,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,CAAC,CAAC,qBAAqB,CAAC,CAAC;QACzB,CAAC,CAAC,8GAA8G,CAAC,CAAC;QAClH,CAAC,CAAC,EAAE,CAAC,CAAC;QAEN,IAAI,GAAG,CAAC,aAAa,KAAK,OAAO,EAAE,CAAC;YAClC,CAAC,CAAC,iBAAiB,CAAC,CAAC;YACrB,CAAC,CAAC,mIAAmI,CAAC,CAAC;YACvI,CAAC,CAAC,6FAA6F,CAAC,CAAC;YACjG,CAAC,CAAC,8GAA8G,CAAC,CAAC;YAClH,CAAC,CAAC,EAAE,CAAC,CAAC;QACR,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAC1B,CAAC,CAAC,uFAAuF,CAAC,CAAC;IAC3F,CAAC,CAAC,2EAA2E,CAAC,CAAC;IAC/E,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,CAAC,CAAC,uDAAuD,CAAC,CAAC;IAC3D,CAAC,CAAC,KAAK,CAAC,CAAC;IACT,CAAC,CAAC,6EAA6E,CAAC,CAAC;IACjF,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,oBAAoB;IACpB,EAAE,CAAC,yBAAyB,CAAC,CAAC;IAC9B,CAAC,CAAC,8FAA8F,CAAC,CAAC;IAClG,CAAC,CAAC,qDAAqD,CAAC,CAAC;IACzD,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,CAAC,CAAC,8BAA8B,CAAC,CAAC;IAClC,CAAC,CAAC,wDAAwD,CAAC,CAAC;IAC5D,CAAC,CAAC,6DAA6D,CAAC,CAAC;IACjE,CAAC,CAAC,uDAAuD,CAAC,CAAC;IAC3D,CAAC,CAAC,kDAAkD,CAAC,CAAC;IACtD,CAAC,CAAC,kDAAkD,CAAC,CAAC;IACtD,CAAC,CAAC,mDAAmD,CAAC,CAAC;IACvD,CAAC,CAAC,4FAA4F,CAAC,CAAC;IAChG,CAAC,CAAC,8DAA8D,CAAC,CAAC;IAClE,CAAC,CAAC,6DAA6D,CAAC,CAAC;IACjE,CAAC,CAAC,EAAE,CAAC,CAAC;IAEN,CAAC,CAAC,KAAK,CAAC,CAAC;IAET,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|