@glossic/core 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +26 -35
- package/dist/index.js +126 -28
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import {
|
|
2
|
+
import { Layer, GlossicConfig, Manifest, Workspace, ExtractResult, EnrichResult, DiscoverContext, Adapter, Enricher, GlossicUserConfig, ListOverrides, Provider, Unit, Project, CompletionRequest } from '@glossic/schema';
|
|
3
3
|
export { compareStrings, joinPosix, relativePosix, sortBy, toPosix } from '@glossic/schema';
|
|
4
4
|
|
|
5
5
|
declare const DEFAULT_CACHE_PATH = ".glossic/cache.json";
|
|
@@ -42,30 +42,45 @@ declare const indexCache: (cache: CacheFile) => Map<string, CacheEntry>;
|
|
|
42
42
|
/** What every pipeline stage needs: where to scan, with which adapters and config. */
|
|
43
43
|
interface PipelineContext {
|
|
44
44
|
root: string;
|
|
45
|
-
adapters: readonly
|
|
45
|
+
adapters: readonly Layer[];
|
|
46
46
|
config?: GlossicConfig;
|
|
47
47
|
generatedAt?: string;
|
|
48
48
|
}
|
|
49
|
+
/** `enrichersByProject` lists them in the order they ran, empty when none claimed the project. */
|
|
49
50
|
interface ScanResult {
|
|
50
51
|
manifest: Manifest;
|
|
51
52
|
workspace: Workspace;
|
|
52
53
|
adapterByProject: Record<string, string>;
|
|
54
|
+
enrichersByProject: Record<string, string[]>;
|
|
53
55
|
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Applies one pass to what the adapter extracted. A unit the pass said nothing
|
|
59
|
+
* about comes back untouched, `producedBy` included, and a relation naming a
|
|
60
|
+
* unit that is not there is dropped: an enricher never invents one.
|
|
61
|
+
*/
|
|
62
|
+
declare const applyEnrichment: (extracted: ExtractResult, name: string, result: EnrichResult) => ExtractResult;
|
|
63
|
+
|
|
54
64
|
/** Puts the adapters in the order the config asks for, dropping the ones it omits. */
|
|
55
|
-
declare const orderAdapters: (adapters: readonly
|
|
65
|
+
declare const orderAdapters: (adapters: readonly Layer[], wanted: readonly string[]) => Layer[];
|
|
66
|
+
/** The first adapter that claims the project; enrichers in the chain are skipped here. */
|
|
67
|
+
declare const selectAdapter: (layers: readonly Layer[], ctx: DiscoverContext) => Promise<Adapter | undefined>;
|
|
68
|
+
/** Every enricher that claims the project, in the order the chain lists them. */
|
|
69
|
+
declare const selectEnrichers: (layers: readonly Layer[], ctx: DiscoverContext) => Promise<Enricher[]>;
|
|
70
|
+
|
|
56
71
|
/** Walks the workspace and turns it into a manifest, calling no provider. */
|
|
57
72
|
declare const scan: (ctx: PipelineContext) => Promise<ScanResult>;
|
|
58
73
|
|
|
59
74
|
interface CheckContext extends PipelineContext {
|
|
60
75
|
outDir: string;
|
|
61
76
|
}
|
|
62
|
-
/** One unit weighed against its page: the hash expected against the one on disk. */
|
|
63
77
|
interface CheckEntry {
|
|
64
78
|
unitId: string;
|
|
65
79
|
docPath: string;
|
|
66
80
|
expectedHash: string;
|
|
67
81
|
documentedHash: string | undefined;
|
|
68
82
|
}
|
|
83
|
+
/** `orphaned` names only documents glossic wrote: markdown it did not generate is left alone. */
|
|
69
84
|
interface CheckResult {
|
|
70
85
|
outDir: string;
|
|
71
86
|
upToDate: CheckEntry[];
|
|
@@ -77,13 +92,10 @@ interface CheckResult {
|
|
|
77
92
|
interface DocumentFrontmatter {
|
|
78
93
|
unit: string | undefined;
|
|
79
94
|
hash: string | undefined;
|
|
95
|
+
generatedAt: string | undefined;
|
|
80
96
|
}
|
|
81
|
-
/** The
|
|
97
|
+
/** The fields `renderUnitDoc` writes, all undefined when there is no readable frontmatter. */
|
|
82
98
|
declare const readDocFrontmatter: (file: string) => Promise<DocumentFrontmatter>;
|
|
83
|
-
/**
|
|
84
|
-
* Compares the pages on disk against a fresh scan, calling no provider. This
|
|
85
|
-
* is what a CI job runs to fail on documentation nobody regenerated.
|
|
86
|
-
*/
|
|
87
99
|
declare const check: (ctx: CheckContext) => Promise<CheckResult>;
|
|
88
100
|
|
|
89
101
|
/** Config filenames, in the order they are looked for. */
|
|
@@ -164,11 +176,6 @@ declare const backoffDelay: (attempt: number, baseDelayMs: number) => number;
|
|
|
164
176
|
/** Runs a task again while it fails with a retryable provider error. */
|
|
165
177
|
declare const withRetry: <T>(task: () => Promise<T>, options?: RetryOptions) => Promise<T>;
|
|
166
178
|
|
|
167
|
-
/**
|
|
168
|
-
* `projects` narrows a run to the units of those projects, and `reviewPlan`
|
|
169
|
-
* lets a caller narrow it after seeing what the plan costs -- both exist so a
|
|
170
|
-
* workspace too big for one run can be done a project at a time.
|
|
171
|
-
*/
|
|
172
179
|
interface GenerateContext extends PipelineContext {
|
|
173
180
|
outDir: string;
|
|
174
181
|
provider?: Provider;
|
|
@@ -181,7 +188,6 @@ interface GenerateContext extends PipelineContext {
|
|
|
181
188
|
onEvent?: (event: GenerateEvent) => void;
|
|
182
189
|
reviewPlan?: PlanReviewer;
|
|
183
190
|
}
|
|
184
|
-
/** What one project would cost this run, for a caller deciding what to send. */
|
|
185
191
|
interface PlanProject {
|
|
186
192
|
id: string;
|
|
187
193
|
name: string;
|
|
@@ -189,18 +195,12 @@ interface PlanProject {
|
|
|
189
195
|
cached: number;
|
|
190
196
|
estimatedTokens: number;
|
|
191
197
|
}
|
|
192
|
-
/** The whole plan, in the shape a caller needs to warn about it or split it. */
|
|
193
198
|
interface PlanReview {
|
|
194
199
|
pending: number;
|
|
195
200
|
cached: number;
|
|
196
201
|
estimatedTokens: number;
|
|
197
202
|
projects: PlanProject[];
|
|
198
203
|
}
|
|
199
|
-
/**
|
|
200
|
-
* Called once with the plan and before any completion is sent, and answers
|
|
201
|
-
* with the projects to generate: undefined for all of them, an empty list for
|
|
202
|
-
* none. It is never called for a dry run, which sends nothing anyway.
|
|
203
|
-
*/
|
|
204
204
|
type PlanReviewer = (review: PlanReview) => Promise<readonly string[] | undefined>;
|
|
205
205
|
type UnitOutcome = "generated" | "cached" | "failed";
|
|
206
206
|
type GenerateEvent = {
|
|
@@ -225,11 +225,6 @@ interface GeneratePlanEntry {
|
|
|
225
225
|
reason: GenerateReason;
|
|
226
226
|
regenerate: boolean;
|
|
227
227
|
}
|
|
228
|
-
/**
|
|
229
|
-
* A page that was written, but not exactly as the provider wrote it. It carries
|
|
230
|
-
* the numbers rather than a sentence, because the sentence has to be spelled
|
|
231
|
-
* and pluralised in whatever language the CLI is speaking.
|
|
232
|
-
*/
|
|
233
228
|
interface GenerateWarning {
|
|
234
229
|
unitId: string;
|
|
235
230
|
dropped: number;
|
|
@@ -241,10 +236,6 @@ interface GenerateFailure {
|
|
|
241
236
|
code: string | undefined;
|
|
242
237
|
detail: string | undefined;
|
|
243
238
|
}
|
|
244
|
-
/**
|
|
245
|
-
* Why a run gave up on the rest of its plan, and how many units it never
|
|
246
|
-
* reached. `unitId` is the one that hit the wall, and it is in `failures` too.
|
|
247
|
-
*/
|
|
248
239
|
interface GenerateAbort {
|
|
249
240
|
unitId: string;
|
|
250
241
|
code: string;
|
|
@@ -321,7 +312,7 @@ interface BuildPromptInput {
|
|
|
321
312
|
temperature?: number | undefined;
|
|
322
313
|
}
|
|
323
314
|
/** Bumped by hand when the prompt changes, which invalidates every cached unit. */
|
|
324
|
-
declare const PROMPT_VERSION = "
|
|
315
|
+
declare const PROMPT_VERSION = "5";
|
|
325
316
|
/** The rules the model is held to; assertDocumentContent checks the answer against them. */
|
|
326
317
|
declare const SYSTEM_PROMPT: string;
|
|
327
318
|
/** Turns a unit and its sources into the one request a provider will answer. */
|
|
@@ -350,7 +341,7 @@ declare const probeProviders: (providers: readonly Provider[]) => Promise<Provid
|
|
|
350
341
|
*/
|
|
351
342
|
declare const resolveProvider: (options: ResolveProviderOptions) => Promise<Provider>;
|
|
352
343
|
|
|
353
|
-
/** A name-keyed collection of
|
|
344
|
+
/** A name-keyed collection of layers or providers, kept in insertion order. */
|
|
354
345
|
declare class Registry<T extends {
|
|
355
346
|
name: string;
|
|
356
347
|
}> {
|
|
@@ -361,9 +352,9 @@ declare class Registry<T extends {
|
|
|
361
352
|
list(): T[];
|
|
362
353
|
get size(): number;
|
|
363
354
|
}
|
|
364
|
-
type AdapterRegistry = Registry<
|
|
355
|
+
type AdapterRegistry = Registry<Layer>;
|
|
365
356
|
type ProviderRegistry = Registry<Provider>;
|
|
366
|
-
declare const createAdapterRegistry: (adapters?:
|
|
357
|
+
declare const createAdapterRegistry: (adapters?: Layer[]) => AdapterRegistry;
|
|
367
358
|
declare const createProviderRegistry: (providers?: Provider[]) => ProviderRegistry;
|
|
368
359
|
|
|
369
360
|
/** A provider that records what it was asked, for assertions. */
|
|
@@ -417,4 +408,4 @@ declare const resolveWorkspace: (root: string) => Promise<Workspace>;
|
|
|
417
408
|
|
|
418
409
|
declare const CORE_VERSION: string;
|
|
419
410
|
|
|
420
|
-
export { type AdapterRegistry, type BuildManifestOptions, type BuildPromptInput, CACHE_VERSION, CONFIG_FILENAMES, CORE_VERSION, type CacheEntry, CacheEntrySchema, type CacheFile, CacheFileSchema, type CheckContext, type CheckEntry, type CheckResult, type ConfigOrigin, type ConfigOrigins, type ConfigSources, type ContentProblem, DEFAULT_CACHE_PATH, DEFAULT_MANIFEST_PATH, type FailedConfig, type FakeProvider, type FakeProviderOptions, type GenerateAbort, type GenerateContext, type GenerateEvent, type GenerateFailure, type GeneratePlanEntry, type GenerateReason, type GenerateResult, type GenerateWarning, INDEX_DOC_PATH, type LoadedConfig, MAX_FILE_BYTES, MAX_PREAMBLE_LENGTH, MIN_DOCUMENT_LENGTH, type MissingConfig, NoProviderAvailableError, type NormalizedDocument, NotImplementedError, PROMPT_VERSION, PROVIDER_PREFERENCE, type PipelineContext, type PlanProject, type PlanReview, type PlanReviewer, type PreparedDocument, type ProjectConfig, type ProviderRegistry, type ProviderStatus, Registry, type RenderIndexDocInput, type RenderUnitDocInput, type ResolveProviderOptions, type ResolvedConfig, type RetryOptions, SYSTEM_PROMPT, type ScanResult, type UnitOutcome, type UnitSource, UnknownProviderError, assertDocumentContent, backoffDelay, buildManifest, buildUnitPrompt, check, createAdapterRegistry, createFakeProvider, createProviderRegistry, emptyCache, estimateTokens, excerpt, findConfigFile, findContentProblem, generate, indexCache, loadProjectConfig, modelCacheKey, normalizeDocument, orderAdapters, pathExists, prepareDocument, probeProviders, readCache, readDocFrontmatter, readJson, readManifest, readText, readUnitSources, renderIndexDoc, renderUnitDoc, resolveConfig, resolveProvider, resolveWorkspace, scan, serializeCache, serializeManifest, unitDocPath, withRetry, writeCache, writeManifest };
|
|
411
|
+
export { type AdapterRegistry, type BuildManifestOptions, type BuildPromptInput, CACHE_VERSION, CONFIG_FILENAMES, CORE_VERSION, type CacheEntry, CacheEntrySchema, type CacheFile, CacheFileSchema, type CheckContext, type CheckEntry, type CheckResult, type ConfigOrigin, type ConfigOrigins, type ConfigSources, type ContentProblem, DEFAULT_CACHE_PATH, DEFAULT_MANIFEST_PATH, type FailedConfig, type FakeProvider, type FakeProviderOptions, type GenerateAbort, type GenerateContext, type GenerateEvent, type GenerateFailure, type GeneratePlanEntry, type GenerateReason, type GenerateResult, type GenerateWarning, INDEX_DOC_PATH, type LoadedConfig, MAX_FILE_BYTES, MAX_PREAMBLE_LENGTH, MIN_DOCUMENT_LENGTH, type MissingConfig, NoProviderAvailableError, type NormalizedDocument, NotImplementedError, PROMPT_VERSION, PROVIDER_PREFERENCE, type PipelineContext, type PlanProject, type PlanReview, type PlanReviewer, type PreparedDocument, type ProjectConfig, type ProviderRegistry, type ProviderStatus, Registry, type RenderIndexDocInput, type RenderUnitDocInput, type ResolveProviderOptions, type ResolvedConfig, type RetryOptions, SYSTEM_PROMPT, type ScanResult, type UnitOutcome, type UnitSource, UnknownProviderError, applyEnrichment, assertDocumentContent, backoffDelay, buildManifest, buildUnitPrompt, check, createAdapterRegistry, createFakeProvider, createProviderRegistry, emptyCache, estimateTokens, excerpt, findConfigFile, findContentProblem, generate, indexCache, loadProjectConfig, modelCacheKey, normalizeDocument, orderAdapters, pathExists, prepareDocument, probeProviders, readCache, readDocFrontmatter, readJson, readManifest, readText, readUnitSources, renderIndexDoc, renderUnitDoc, resolveConfig, resolveProvider, resolveWorkspace, scan, selectAdapter, selectEnrichers, serializeCache, serializeManifest, unitDocPath, withRetry, writeCache, writeManifest };
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs2 from 'fs/promises';
|
|
2
2
|
import path3 from 'path';
|
|
3
3
|
import { z } from 'zod';
|
|
4
|
-
import { sortBy, ManifestSchema, MANIFEST_VERSION, toPosix, GlossicConfigSchema, compareStrings, ADDITIVE_LIST_KEYS, applyListOverride, LIST_DEFAULTS, isRetryableProviderError, ProviderError, isFatalProviderError } from '@glossic/schema';
|
|
4
|
+
import { sortBy, ManifestSchema, MANIFEST_VERSION, toPosix, isAdapter, isEnricher, GlossicConfigSchema, compareStrings, ADDITIVE_LIST_KEYS, applyListOverride, LIST_DEFAULTS, isRetryableProviderError, ProviderError, isFatalProviderError } from '@glossic/schema';
|
|
5
5
|
export { compareStrings, joinPosix, relativePosix, sortBy, toPosix } from '@glossic/schema';
|
|
6
6
|
import { glob } from 'tinyglobby';
|
|
7
7
|
import { parse } from 'yaml';
|
|
@@ -10,7 +10,7 @@ import picomatch from 'picomatch';
|
|
|
10
10
|
|
|
11
11
|
// package.json
|
|
12
12
|
var package_default = {
|
|
13
|
-
version: "0.
|
|
13
|
+
version: "0.6.0"};
|
|
14
14
|
var pathExists = async (target) => {
|
|
15
15
|
try {
|
|
16
16
|
await fs2.access(target);
|
|
@@ -127,6 +127,40 @@ var readManifest = async (target) => {
|
|
|
127
127
|
return void 0;
|
|
128
128
|
}
|
|
129
129
|
};
|
|
130
|
+
|
|
131
|
+
// src/scan/enrich.ts
|
|
132
|
+
var compareSymbols = (a, b) => {
|
|
133
|
+
return compareStrings(a.file, b.file) || (a.line ?? 0) - (b.line ?? 0) || compareStrings(a.kind, b.kind) || compareStrings(a.name, b.name);
|
|
134
|
+
};
|
|
135
|
+
var mergeUnit = (unit, name, enrichment) => {
|
|
136
|
+
if (enrichment?.symbols === void 0 && enrichment?.framework === void 0) {
|
|
137
|
+
return unit;
|
|
138
|
+
}
|
|
139
|
+
const symbols = enrichment.symbols === void 0 ? unit.facts.symbols : {
|
|
140
|
+
symbols: [...unit.facts.symbols?.symbols ?? [], ...enrichment.symbols.symbols].sort(compareSymbols)
|
|
141
|
+
};
|
|
142
|
+
const framework = enrichment.framework ?? unit.facts.framework;
|
|
143
|
+
return {
|
|
144
|
+
...unit,
|
|
145
|
+
facts: {
|
|
146
|
+
...unit.facts,
|
|
147
|
+
...symbols === void 0 ? {} : { symbols },
|
|
148
|
+
...framework === void 0 ? {} : { framework },
|
|
149
|
+
producedBy: [...unit.facts.producedBy, name]
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
};
|
|
153
|
+
var applyEnrichment = (extracted, name, result) => {
|
|
154
|
+
const units = extracted.units.map((unit) => mergeUnit(unit, name, result.facts[unit.id]));
|
|
155
|
+
const known = new Set(units.map((unit) => unit.id));
|
|
156
|
+
return {
|
|
157
|
+
units,
|
|
158
|
+
relations: [
|
|
159
|
+
...extracted.relations,
|
|
160
|
+
...result.relations.filter(({ from, to }) => known.has(from) && known.has(to))
|
|
161
|
+
]
|
|
162
|
+
};
|
|
163
|
+
};
|
|
130
164
|
var GLOB_IGNORES = ["**/node_modules/**", "**/dist/**", "**/build/**", "**/.git/**"];
|
|
131
165
|
var LOCKFILE_PACKAGE_MANAGERS = [
|
|
132
166
|
["pnpm-lock.yaml", "pnpm"],
|
|
@@ -234,41 +268,58 @@ var resolveWorkspace = async (root) => {
|
|
|
234
268
|
};
|
|
235
269
|
return packageManager === void 0 ? workspace : { ...workspace, packageManager };
|
|
236
270
|
};
|
|
237
|
-
|
|
238
|
-
// src/scan.ts
|
|
239
271
|
var orderAdapters = (adapters, wanted) => {
|
|
240
272
|
const byName = new Map(adapters.map((adapter) => [adapter.name, adapter]));
|
|
241
273
|
return wanted.map((name) => byName.get(name)).filter((adapter) => adapter !== void 0);
|
|
242
274
|
};
|
|
243
|
-
var selectAdapter = async (
|
|
244
|
-
for (const
|
|
245
|
-
if (await
|
|
246
|
-
return
|
|
275
|
+
var selectAdapter = async (layers, ctx) => {
|
|
276
|
+
for (const layer of layers) {
|
|
277
|
+
if (isAdapter(layer) && await layer.detect(ctx)) {
|
|
278
|
+
return layer;
|
|
247
279
|
}
|
|
248
280
|
}
|
|
249
281
|
return void 0;
|
|
250
282
|
};
|
|
283
|
+
var selectEnrichers = async (layers, ctx) => {
|
|
284
|
+
const claimed = [];
|
|
285
|
+
for (const layer of layers) {
|
|
286
|
+
if (isEnricher(layer) && await layer.detect(ctx)) {
|
|
287
|
+
claimed.push(layer);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return claimed;
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
// src/scan/index.ts
|
|
251
294
|
var scan = async (ctx) => {
|
|
252
295
|
const config = ctx.config ?? GlossicConfigSchema.parse({});
|
|
253
296
|
const workspace = await resolveWorkspace(path3.resolve(ctx.root));
|
|
254
|
-
const
|
|
297
|
+
const layers = orderAdapters(ctx.adapters, config.adapters);
|
|
255
298
|
const adapterContext = { root: workspace.root, workspace, config };
|
|
256
299
|
const results = [];
|
|
257
300
|
const adapterByProject = {};
|
|
301
|
+
const enrichersByProject = {};
|
|
258
302
|
for (const project of workspace.projects) {
|
|
259
303
|
const discoverContext = { ...adapterContext, project };
|
|
260
|
-
const adapter = await selectAdapter(
|
|
304
|
+
const adapter = await selectAdapter(layers, discoverContext);
|
|
261
305
|
if (adapter === void 0) continue;
|
|
262
306
|
adapterByProject[project.id] = adapter.name;
|
|
263
|
-
const
|
|
264
|
-
|
|
307
|
+
const discovered = await adapter.discover(discoverContext);
|
|
308
|
+
const enrichers = await selectEnrichers(layers, discoverContext);
|
|
309
|
+
let extracted = await adapter.extract({ ...discoverContext, units: discovered });
|
|
310
|
+
for (const enricher of enrichers) {
|
|
311
|
+
const enrichment = await enricher.enrich({ ...discoverContext, units: extracted.units });
|
|
312
|
+
extracted = applyEnrichment(extracted, enricher.name, enrichment);
|
|
313
|
+
}
|
|
314
|
+
enrichersByProject[project.id] = enrichers.map((enricher) => enricher.name);
|
|
315
|
+
results.push(extracted);
|
|
265
316
|
}
|
|
266
317
|
const manifest = buildManifest(
|
|
267
318
|
workspace,
|
|
268
319
|
results,
|
|
269
320
|
ctx.generatedAt === void 0 ? {} : { generatedAt: ctx.generatedAt }
|
|
270
321
|
);
|
|
271
|
-
return { manifest, workspace, adapterByProject };
|
|
322
|
+
return { manifest, workspace, adapterByProject, enrichersByProject };
|
|
272
323
|
};
|
|
273
324
|
|
|
274
325
|
// src/markdown.ts
|
|
@@ -349,26 +400,35 @@ var renderIndexDoc = (input) => {
|
|
|
349
400
|
|
|
350
401
|
// src/check.ts
|
|
351
402
|
var FRONTMATTER = /^---\r?\n([\s\S]*?)\r?\n---\r?\n/;
|
|
403
|
+
var NO_FRONTMATTER = {
|
|
404
|
+
unit: void 0,
|
|
405
|
+
hash: void 0,
|
|
406
|
+
generatedAt: void 0
|
|
407
|
+
};
|
|
352
408
|
var readDocFrontmatter = async (file) => {
|
|
353
409
|
try {
|
|
354
410
|
const raw = await fs2.readFile(file, "utf8");
|
|
355
411
|
const match = FRONTMATTER.exec(raw);
|
|
356
412
|
if (match === null) {
|
|
357
|
-
return
|
|
413
|
+
return NO_FRONTMATTER;
|
|
358
414
|
}
|
|
359
415
|
const parsed = parse(match[1] ?? "");
|
|
360
416
|
if (typeof parsed !== "object" || parsed === null) {
|
|
361
|
-
return
|
|
417
|
+
return NO_FRONTMATTER;
|
|
362
418
|
}
|
|
363
419
|
const record = parsed;
|
|
364
420
|
return {
|
|
365
421
|
unit: typeof record.unit === "string" ? record.unit : void 0,
|
|
366
|
-
hash: typeof record.hash === "string" ? record.hash : void 0
|
|
422
|
+
hash: typeof record.hash === "string" ? record.hash : void 0,
|
|
423
|
+
generatedAt: typeof record.generatedAt === "string" ? record.generatedAt : void 0
|
|
367
424
|
};
|
|
368
425
|
} catch {
|
|
369
|
-
return
|
|
426
|
+
return NO_FRONTMATTER;
|
|
370
427
|
}
|
|
371
428
|
};
|
|
429
|
+
var isGeneratedDoc = (frontmatter2) => {
|
|
430
|
+
return frontmatter2.unit !== void 0 && frontmatter2.hash !== void 0 && frontmatter2.generatedAt !== void 0;
|
|
431
|
+
};
|
|
372
432
|
var listDocs = async (outDir) => {
|
|
373
433
|
try {
|
|
374
434
|
const entries = await glob({
|
|
@@ -403,7 +463,13 @@ var check = async (ctx) => {
|
|
|
403
463
|
stale.push({ ...entryBase, documentedHash: hash });
|
|
404
464
|
}
|
|
405
465
|
}
|
|
406
|
-
const
|
|
466
|
+
const unclaimed = docs.filter((doc) => doc !== INDEX_DOC_PATH && !expected.has(doc));
|
|
467
|
+
const orphaned = [];
|
|
468
|
+
for (const doc of unclaimed) {
|
|
469
|
+
const frontmatter2 = await readDocFrontmatter(path3.resolve(ctx.outDir, doc));
|
|
470
|
+
if (isGeneratedDoc(frontmatter2)) orphaned.push(doc);
|
|
471
|
+
}
|
|
472
|
+
orphaned.sort(compareStrings);
|
|
407
473
|
const byUnitId = (entries) => {
|
|
408
474
|
return sortBy(entries, (entry) => entry.unitId);
|
|
409
475
|
};
|
|
@@ -567,7 +633,7 @@ var withRetry = async (task, options = {}) => {
|
|
|
567
633
|
};
|
|
568
634
|
var MAX_FILE_BYTES = 24e3;
|
|
569
635
|
var CHARS_PER_TOKEN = 4;
|
|
570
|
-
var PROMPT_VERSION = "
|
|
636
|
+
var PROMPT_VERSION = "5";
|
|
571
637
|
var SYSTEM_PROMPT = [
|
|
572
638
|
"You are a technical writer documenting a codebase for the engineers who work on it.",
|
|
573
639
|
"",
|
|
@@ -577,17 +643,42 @@ var SYSTEM_PROMPT = [
|
|
|
577
643
|
"Cover, in this order:",
|
|
578
644
|
" 1. What the unit does, in one or two sentences.",
|
|
579
645
|
" 2. Its responsibilities, and what it deliberately leaves to other units.",
|
|
580
|
-
" 3. The
|
|
581
|
-
"
|
|
582
|
-
"
|
|
583
|
-
"
|
|
646
|
+
" 3. The public elements a consumer needs: the ones you would name when",
|
|
647
|
+
" telling somebody how to use this unit, and what each is for. Be",
|
|
648
|
+
" selective. Do not enumerate every export and do not turn the section",
|
|
649
|
+
" into an inventory.",
|
|
650
|
+
" 4. What the code reveals when it is read as a whole: dependency",
|
|
651
|
+
" direction, patterns, error handling, boundaries, trade-offs, and above",
|
|
652
|
+
" all whatever does not line up.",
|
|
653
|
+
"",
|
|
654
|
+
" That last part is the one worth your attention. Look for:",
|
|
655
|
+
" - a declared interface, schema, annotation or documented contract",
|
|
656
|
+
" that the implementation does not match;",
|
|
657
|
+
" - a dependency the code uses but never declares;",
|
|
658
|
+
" - data lost without a word: a truncation, a swallowed error, a",
|
|
659
|
+
" narrowing cast, a result computed and dropped;",
|
|
660
|
+
" - work done twice: a second pass, a redundant deduplication, a value",
|
|
661
|
+
" recomputed where one was already at hand;",
|
|
662
|
+
" - state kept in memory that would not survive a restart or a second",
|
|
663
|
+
" instance of the process.",
|
|
664
|
+
"",
|
|
665
|
+
" Report only what you can point at in the code, and say where it is.",
|
|
666
|
+
" If the unit has nothing of the kind, write nothing rather than reach:",
|
|
667
|
+
" an invented finding costs more than a missing one.",
|
|
584
668
|
"",
|
|
585
669
|
"Hard rules:",
|
|
586
670
|
" - Describe only what is in the code you were given. Never invent behaviour,",
|
|
587
671
|
" dependencies, history, performance characteristics or intent.",
|
|
588
672
|
" - If something is unclear from the code, say so plainly or leave it out.",
|
|
589
673
|
" Do not guess and do not hedge with filler.",
|
|
590
|
-
" -
|
|
674
|
+
" - The Facts block is context for writing, not material to quote. Never",
|
|
675
|
+
" mention its counts: how many symbols the unit exports, how many files it",
|
|
676
|
+
" holds, which languages they are in. Never open the document by measuring",
|
|
677
|
+
" the unit. The reader came for the code, not for what we counted about it.",
|
|
678
|
+
" - A map of the files is welcome, and it is the only one the reader gets:",
|
|
679
|
+
" the page carries no file listing of its own. Give it only if every entry",
|
|
680
|
+
" says what that file is for. A map that repeats the paths and adds nothing",
|
|
681
|
+
" is worse than none.",
|
|
591
682
|
" - No preamble, no closing summary, no offer to help.",
|
|
592
683
|
"",
|
|
593
684
|
"Output GitHub-flavoured Markdown. Open with a single top-level (#) heading,",
|
|
@@ -623,6 +714,13 @@ var fence = (source) => [
|
|
|
623
714
|
"```",
|
|
624
715
|
""
|
|
625
716
|
].join("\n");
|
|
717
|
+
var exportedSurface = (symbols) => {
|
|
718
|
+
const counts = /* @__PURE__ */ new Map();
|
|
719
|
+
for (const symbol of symbols) {
|
|
720
|
+
counts.set(symbol.kind, (counts.get(symbol.kind) ?? 0) + 1);
|
|
721
|
+
}
|
|
722
|
+
return [...counts.entries()].sort(([aKind, aCount], [bKind, bCount]) => bCount - aCount || compareStrings(aKind, bKind)).map(([kind, count]) => `${count} ${kind}`).join(", ");
|
|
723
|
+
};
|
|
626
724
|
var factLines = (unit) => {
|
|
627
725
|
const lines = [
|
|
628
726
|
`- unit: ${unit.name}`,
|
|
@@ -637,9 +735,9 @@ var factLines = (unit) => {
|
|
|
637
735
|
const names = unit.facts.base.testFiles.map((file) => file.path.slice(file.path.lastIndexOf("/") + 1)).sort(compareStrings);
|
|
638
736
|
lines.push(`- test files (content not shown): ${names.join(", ")}`);
|
|
639
737
|
}
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
lines.push(`-
|
|
738
|
+
const symbols = unit.facts.symbols?.symbols ?? [];
|
|
739
|
+
if (symbols.length > 0) {
|
|
740
|
+
lines.push(`- exported surface: ${exportedSurface(symbols)}`);
|
|
643
741
|
}
|
|
644
742
|
if (unit.facts.framework !== void 0) {
|
|
645
743
|
lines.push(`- framework: ${unit.facts.framework.name}`);
|
|
@@ -1199,6 +1297,6 @@ var createFakeProvider = (options = {}) => {
|
|
|
1199
1297
|
// src/index.ts
|
|
1200
1298
|
var CORE_VERSION = package_default.version;
|
|
1201
1299
|
|
|
1202
|
-
export { CACHE_VERSION, CONFIG_FILENAMES, CORE_VERSION, CacheEntrySchema, CacheFileSchema, DEFAULT_CACHE_PATH, DEFAULT_MANIFEST_PATH, INDEX_DOC_PATH, MAX_FILE_BYTES, MAX_PREAMBLE_LENGTH, MIN_DOCUMENT_LENGTH, NoProviderAvailableError, NotImplementedError, PROMPT_VERSION, PROVIDER_PREFERENCE, Registry, SYSTEM_PROMPT, UnknownProviderError, assertDocumentContent, backoffDelay, buildManifest, buildUnitPrompt, check, createAdapterRegistry, createFakeProvider, createProviderRegistry, emptyCache, estimateTokens, excerpt, findConfigFile, findContentProblem, generate, indexCache, loadProjectConfig, modelCacheKey, normalizeDocument, orderAdapters, pathExists, prepareDocument, probeProviders, readCache, readDocFrontmatter, readJson, readManifest, readText, readUnitSources, renderIndexDoc, renderUnitDoc, resolveConfig, resolveProvider, resolveWorkspace, scan, serializeCache, serializeManifest, unitDocPath, withRetry, writeCache, writeManifest };
|
|
1300
|
+
export { CACHE_VERSION, CONFIG_FILENAMES, CORE_VERSION, CacheEntrySchema, CacheFileSchema, DEFAULT_CACHE_PATH, DEFAULT_MANIFEST_PATH, INDEX_DOC_PATH, MAX_FILE_BYTES, MAX_PREAMBLE_LENGTH, MIN_DOCUMENT_LENGTH, NoProviderAvailableError, NotImplementedError, PROMPT_VERSION, PROVIDER_PREFERENCE, Registry, SYSTEM_PROMPT, UnknownProviderError, applyEnrichment, assertDocumentContent, backoffDelay, buildManifest, buildUnitPrompt, check, createAdapterRegistry, createFakeProvider, createProviderRegistry, emptyCache, estimateTokens, excerpt, findConfigFile, findContentProblem, generate, indexCache, loadProjectConfig, modelCacheKey, normalizeDocument, orderAdapters, pathExists, prepareDocument, probeProviders, readCache, readDocFrontmatter, readJson, readManifest, readText, readUnitSources, renderIndexDoc, renderUnitDoc, resolveConfig, resolveProvider, resolveWorkspace, scan, selectAdapter, selectEnrichers, serializeCache, serializeManifest, unitDocPath, withRetry, writeCache, writeManifest };
|
|
1203
1301
|
//# sourceMappingURL=index.js.map
|
|
1204
1302
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../src/utils/fs.ts","../src/cache.ts","../src/manifest.ts","../src/workspace.ts","../src/scan.ts","../src/markdown.ts","../src/check.ts","../src/config-file.ts","../src/config-resolve.ts","../src/errors.ts","../src/retry.ts","../src/prompt.ts","../src/utils/concurrency.ts","../src/generate/jobs.ts","../src/generate/decide.ts","../src/validate.ts","../src/generate/index.ts","../src/provider.ts","../src/registry.ts","../src/testing.ts","../src/index.ts"],"names":["fs","path","parseYaml","glob","GlossicConfigSchema","fence","plan"],"mappings":";;;;;;;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OA2Db,CAAA;AC1DO,IAAM,UAAA,GAAa,OAAO,MAAA,KAAqC;AACpE,EAAA,IAAI;AACF,IAAA,MAAMA,GAAA,CAAG,OAAO,MAAM,CAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,IAAM,QAAA,GAAW,OAAO,MAAA,KAAgD;AAC7E,EAAA,IAAI;AACF,IAAA,OAAO,MAAMA,GAAA,CAAG,QAAA,CAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAGO,IAAM,QAAA,GAAW,OAAU,MAAA,KAA2C;AAC3E,EAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,MAAM,CAAA;AAEjC,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;AC7BO,IAAM,kBAAA,GAAqB;AAE3B,IAAM,aAAA,GAAqB;AAG3B,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EACvC,MAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,QAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,KAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,IAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,UAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,WAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AACjC,CAAC;AAGM,IAAM,eAAA,GAAkB,EAAE,MAAA,CAAO;AAAA,EACtC,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACzB,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,gBAAgB;AACnC,CAAC;AAGM,IAAM,aAAa,OAAkB,EAAE,SAAS,aAAA,EAAe,OAAA,EAAS,EAAC,EAAE;AAI3E,IAAM,SAAA,GAAY,OAAO,MAAA,KAAuC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAS,MAAMA,GAAAA,CAAG,QAAA,CAASC,MAAK,OAAA,CAAQ,MAAM,GAAG,MAAM,CAAA;AAC7D,IAAA,MAAM,SAAS,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAEpD,IAAA,OAAO,MAAA,CAAO,OAAA,KAAY,aAAA,GAAgB,MAAA,GAAS,UAAA,EAAW;AAAA,EAChE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,UAAA,EAAW;AAAA,EACpB;AACF;AAGO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAA6B;AAC1D,EAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,CAAC,UAAU,KAAA,CAAM,MAAM,GAAE,EAAG,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAC1G;AAGO,IAAM,UAAA,GAAa,OAAO,KAAA,EAAkB,MAAA,KAAoC;AACrF,EAAA,MAAM,QAAA,GAAWA,KAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAEpC,EAAA,MAAMD,GAAAA,CAAG,MAAMC,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1D,EAAA,MAAMD,IAAG,SAAA,CAAU,QAAA,EAAU,cAAA,CAAe,KAAK,GAAG,MAAM,CAAA;AAE1D,EAAA,OAAO,QAAA;AACT;AAGO,IAAM,UAAA,GAAa,CAAC,KAAA,KAA8C;AACvE,EAAA,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC,CAAC,CAAA;AACpE;ACpDO,IAAM,qBAAA,GAAwB;AAOrC,IAAM,QAAA,GAAW,CAAC,IAAA,MAAsB;AAAA,EACtC,GAAG,IAAA;AAAA,EACH,KAAA,EAAO;AAAA,IACL,GAAG,IAAA,CAAK,KAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,GAAG,KAAK,KAAA,CAAM,IAAA;AAAA,MACd,KAAA,EAAW,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,KAAA,EAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA;AAAA,MAC5D,WAAW,CAAC,GAAG,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA;AAAA,QACxC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,cAAA,CAAe,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAQ;AAAA;AACtE,KACF;AAAA,IACA,UAAA,EAAY,CAAC,GAAG,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,KAAK,cAAc;AAAA;AAE9D,CAAA,CAAA;AAEA,IAAM,gBAAA,GAAmB,CAAC,CAAA,EAAa,CAAA,KAAwB;AAC7D,EAAA,OAAO,eAAe,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,KAAK,cAAA,CAAe,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA,IAAK,cAAA,CAAe,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AACtG,CAAA;AAIO,IAAM,gBAAgB,CAAC,SAAA,EAAsB,OAAA,EAAmC,OAAA,GAAgC,EAAC,KAAgB;AACtI,EAAA,MAAM,KAAA,GAAY,QAAQ,OAAA,CAAQ,CAAC,WAAW,MAAA,CAAO,KAAK,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA;AACxE,EAAA,MAAM,YAAY,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW,OAAO,SAAS,CAAA;AAE9D,EAAA,OAAO,eAAe,KAAA,CAAM;AAAA,IAC1B,OAAA,EAAa,gBAAA;AAAA,IACb,aAAa,OAAA,CAAQ,WAAA,IAAA,iBAAe,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,IAC3D,SAAA,EAAa;AAAA,MACX,GAAG,SAAA;AAAA,MACH,UAAU,MAAA,CAAO,SAAA,CAAU,UAAU,CAAC,OAAA,KAAY,QAAQ,EAAE;AAAA,KAC9D;AAAA,IACA,OAAW,MAAA,CAAO,KAAA,EAAO,CAAC,IAAA,KAAS,KAAK,EAAE,CAAA;AAAA,IAC1C,WAAW,CAAC,GAAG,SAAS,CAAA,CAAE,KAAK,gBAAgB;AAAA,GAChD,CAAA;AACH;AAGO,IAAM,iBAAA,GAAoB,CAAC,QAAA,KAA+B;AAC/D,EAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAC7C;AAIO,IAAM,aAAA,GAAgB,OAAO,QAAA,EAAoB,MAAA,KAAoC;AAC1F,EAAA,MAAM,QAAA,GAAWC,KAAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAEpC,EAAA,MAAMD,GAAAA,CAAG,MAAMC,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1D,EAAA,MAAMD,IAAG,SAAA,CAAU,QAAA,EAAU,iBAAA,CAAkB,QAAQ,GAAG,MAAM,CAAA;AAEhE,EAAA,OAAO,QAAA;AACT;AAGO,IAAM,YAAA,GAAe,OAAO,MAAA,KAAkD;AACnF,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMA,GAAAA,CAAG,QAAA,CAASC,MAAK,OAAA,CAAQ,MAAM,GAAG,MAAM,CAAA;AAC1D,IAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AC1DA,IAAM,YAAA,GAAe,CAAC,oBAAA,EAAsB,YAAA,EAAc,eAAe,YAAY,CAAA;AAErF,IAAM,yBAAA,GAAsE;AAAA,EAC1E,CAAC,kBAAkB,MAAM,CAAA;AAAA,EACzB,CAAC,aAAa,MAAM,CAAA;AAAA,EACpB,CAAC,qBAAqB,KAAK,CAAA;AAAA,EAC3B,CAAC,YAAY,KAAK,CAAA;AAAA,EAClB,CAAC,aAAa,KAAK,CAAA;AAAA,EACnB,CAAC,iBAAiB,UAAU,CAAA;AAAA,EAC5B,CAAC,iBAAiB,UAAU;AAC9B,CAAA;AAEA,IAAM,aAAA,GAAgB,CAAC,KAAA,KACrB,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAyB,OAAO,IAAA,KAAS,QAAQ,IAAI,EAAC;AAG7F,IAAM,oBAAA,GAAuB,OAAO,GAAA,EAAa,GAAA,KAA8D;AAC7G,EAAA,MAAM,WAAW,GAAA,EAAK,cAAA;AAEtB,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AACvD,IAAA,MAAM,CAAC,IAAI,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA;AAEjC,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,OAAO,CAAA,IAAK,yBAAA,EAA2B;AAC3D,IAAA,IAAI,MAAM,UAAA,CAAWA,KAAAA,CAAK,KAAK,GAAA,EAAK,QAAQ,CAAC,CAAA,EAAG;AAC9C,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAIA,IAAM,cAAA,GAAiB,OAAO,IAAA,EAAc,GAAA,KAAsE;AAChH,EAAA,MAAM,gBAAgB,MAAM,QAAA,CAASA,MAAK,IAAA,CAAK,IAAA,EAAM,qBAAqB,CAAC,CAAA;AAE3E,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,MAAM,MAAA,GAAkBC,MAAU,aAAa,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAkB,aAAA,CAAe,MAAA,EAA0C,QAAQ,CAAA;AAEzF,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,UAAU,CAAA,GAAI,GAAA,CAAI,UAAA,GAAa,aAAA,CAAc,GAAA,EAAK,UAAA,EAAY,QAAQ,CAAA;AAE5G,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,UAAA,EAAW;AAAA,EACrD;AAEA,EAAA,IAAI,MAAM,UAAA,CAAWD,KAAAA,CAAK,KAAK,IAAA,EAAM,YAAY,CAAC,CAAA,EAAG;AACnD,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAC,QAAA,EAAU,YAAY,CAAA,EAAE;AAAA,EAC1D;AAEA,EAAA,IAAI,MAAM,UAAA,CAAWA,KAAAA,CAAK,KAAK,IAAA,EAAM,SAAS,CAAC,CAAA,EAAG;AAChD,IAAA,OAAO,EAAE,MAAM,IAAA,EAAM,KAAA,EAAO,CAAC,QAAA,EAAU,QAAA,EAAU,YAAY,CAAA,EAAE;AAAA,EACjE;AAEA,EAAA,MAAM,QAAQ,MAAM,QAAA,CAAiCA,MAAK,IAAA,CAAK,IAAA,EAAM,YAAY,CAAC,CAAA;AAElF,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,QAAQ,CAAA;AAC1C,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,GAAQ,CAAC,YAAY,CAAA,EAAE;AAAA,EAC3E;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,IAAM,iBAAA,GAAoB,OAAO,IAAA,EAAc,KAAA,KAAuC;AACpF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,MAAA,GAAqB,CAAC,GAAG,YAAY,CAAA;AAE3C,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,GAAA,CAAK,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,aAAA,CAAe,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEnC,EAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK;AAAA,IAC3B,QAAA;AAAA,IACA,GAAA,EAAK,IAAA;AAAA,IACL,MAAA;AAAA,IACA,SAAA,EAAqB,IAAA;AAAA,IACrB,mBAAA,EAAqB,KAAA;AAAA,IACrB,GAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa,OAAA,CAAQA,KAAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAC,CAAA;AAEvF,EAAA,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,EAAE,IAAA,EAAK;AACjC,CAAA;AAEA,IAAM,YAAA,GAAe,OAAO,IAAA,EAAc,OAAA,EAAiB,eAAA,KAA0D;AACnH,EAAA,MAAM,GAAA,GAAiBA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACjD,EAAA,MAAM,MAAiB,MAAM,QAAA,CAAsBA,MAAK,IAAA,CAAK,GAAA,EAAK,cAAc,CAAC,CAAA;AACjF,EAAA,MAAM,cAAA,GAAkB,MAAM,oBAAA,CAAqB,GAAA,EAAK,GAAG,CAAA,IAAM,eAAA;AACjE,EAAA,MAAM,IAAA,GAAiB,GAAA,EAAK,IAAA,IAAQA,KAAAA,CAAK,SAAS,GAAG,CAAA;AAErD,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,EAAA,EAAI,OAAA,KAAY,GAAA,GAAM,MAAA,GAAS,OAAA;AAAA,IAC/B,IAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,mBAAmB,MAAA,GAAY,OAAA,GAAU,EAAE,GAAG,SAAS,cAAA,EAAe;AAC/E,CAAA;AAIO,IAAM,gBAAA,GAAmB,OAAO,IAAA,KAAqC;AAC1E,EAAA,MAAM,YAAA,GAAiBA,KAAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AACxC,EAAA,MAAM,MAAiB,MAAM,QAAA,CAAsBA,MAAK,IAAA,CAAK,YAAA,EAAc,cAAc,CAAC,CAAA;AAC1F,EAAA,MAAM,cAAA,GAAiB,MAAM,oBAAA,CAAqB,YAAA,EAAc,GAAG,CAAA;AACnE,EAAA,MAAM,IAAA,GAAiB,GAAA,EAAK,IAAA,IAAQA,KAAAA,CAAK,SAAS,YAAY,CAAA;AAE9D,EAAA,MAAM,MAAA,GAAc,MAAM,cAAA,CAAe,YAAA,EAAc,GAAG,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,WAAW,MAAA,GAAY,KAAK,MAAM,iBAAA,CAAkB,YAAA,EAAc,MAAA,CAAO,KAAK,CAAA;AAElG,EAAA,MAAM,UAAA,GAAa,YAAY,MAAA,GAAS,CAAA;AACxC,EAAA,MAAM,QAAA,GAAa,UAAA,GAAa,WAAA,GAAc,CAAC,GAAG,CAAA;AAClD,EAAA,MAAM,QAAA,GAAa,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC/B,QAAA,CAAS,IAAI,CAAC,OAAA,KAAY,aAAa,YAAA,EAAc,OAAA,EAAS,cAAc,CAAC;AAAA,GAC/E;AAEA,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,IAAA;AAAA,IACA,IAAA,EAAM,QAAQ,YAAY,CAAA;AAAA,IAC1B,UAAA;AAAA,IACA,IAAA,EAAU,UAAA,IAAc,MAAA,KAAW,MAAA,GAAY,OAAO,IAAA,GAAM,MAAA;AAAA,IAC5D,UAAU,MAAA,CAAO,QAAA,EAAU,CAAC,OAAA,KAAY,QAAQ,EAAE;AAAA,GACpD;AAEA,EAAA,OAAO,mBAAmB,MAAA,GAAY,SAAA,GAAY,EAAE,GAAG,WAAW,cAAA,EAAe;AACnF;;;AC1IO,IAAM,aAAA,GAAgB,CAAC,QAAA,EAA8B,MAAA,KAAyC;AACnG,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,CAAC,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAC,CAAA;AAEzE,EAAA,OAAO,MAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,CAAA,CAC9B,MAAA,CAAO,CAAC,OAAA,KAAgC,YAAY,MAAS,CAAA;AAClE;AAGA,IAAM,aAAA,GAAgB,OAAO,QAAA,EAA8B,GAAA,KAAuD;AAChH,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,MAAM,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,EAAG;AAC7B,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAIO,IAAM,IAAA,GAAO,OAAO,GAAA,KAA8C;AACvE,EAAA,MAAM,SAAiC,GAAA,CAAI,MAAA,IAAU,mBAAA,CAAoB,KAAA,CAAM,EAAE,CAAA;AACjF,EAAA,MAAM,YAAiC,MAAM,gBAAA,CAAiBA,MAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AACpF,EAAA,MAAM,QAAA,GAAiC,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,OAAO,QAAQ,CAAA;AAClF,EAAA,MAAM,iBAAiC,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,WAAW,MAAA,EAAO;AAEjF,EAAA,MAAM,UAA2C,EAAC;AAClD,EAAA,MAAM,mBAA2C,EAAC;AAElD,EAAA,KAAA,MAAW,OAAA,IAAW,UAAU,QAAA,EAAU;AACxC,IAAA,MAAM,eAAA,GAAmC,EAAE,GAAG,cAAA,EAAgB,OAAA,EAAQ;AACtE,IAAA,MAAM,OAAA,GAAmC,MAAM,aAAA,CAAc,QAAA,EAAU,eAAe,CAAA;AAEtF,IAAA,IAAI,YAAY,MAAA,EAAW;AAE3B,IAAA,gBAAA,CAAiB,OAAA,CAAQ,EAAE,CAAA,GAAI,OAAA,CAAQ,IAAA;AAEvC,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA,CAAS,eAAe,CAAA;AAEpD,IAAA,OAAA,CAAQ,IAAA,CAAK,MAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,GAAG,eAAA,EAAiB,KAAA,EAAO,CAAC,CAAA;AAAA,EACnE;AAEA,EAAA,MAAM,QAAA,GAAW,aAAA;AAAA,IACf,SAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAA,CAAI,gBAAgB,MAAA,GAAY,KAAK,EAAE,WAAA,EAAa,IAAI,WAAA;AAAY,GACtE;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,gBAAA,EAAiB;AACjD;;;ACrEO,IAAM,WAAA,GAAc,CAAC,IAAA,KAAuB;AACjD,EAAA,OAAO,KAAK,IAAA,KAAS,GAAA,GAAM,SAAA,GAAY,CAAA,EAAG,KAAK,IAAI,CAAA,GAAA,CAAA;AACrD;AAEO,IAAM,cAAA,GAAiB;AAE9B,IAAM,WAAA,GAAc,CAAC,OAAA,KACnB;AAAA,EACE,KAAA;AAAA,EACA,GAAG,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KACzB,OAAO,UAAU,QAAA,GAAW,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,EAAG,GAAG,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,GACnF;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAWN,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAsC;AAClE,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,KAAS,SAAS,KAAA,CAAM,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA;AAE/D,EAAA,MAAM,OAAA,GAAqD;AAAA,IACzD,CAAC,SAAS,KAAK,CAAA;AAAA,IACf,CAAC,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAA;AAAA,IAChB,CAAC,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AAAA,IAC1B,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,IAClB,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,IAClB,CAAC,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,IACtC,CAAC,aAAA,EAAe,KAAA,CAAM,WAAW;AAAA,GACnC;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,KAAa,IAAA,EAAM;AACrC,IAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,EAAG,CAAC,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,CAAC,WAAA,CAAY,OAAO,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACpE;AAOA,IAAM,eAAA,GAAkB,CAAC,KAAA,KAAmC;AAC1D,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AAEvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW;AAC7C,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,QAAA,EAAA,CAAW,MAAA,CAAO,GAAA,CAAI,MAAM,QAAQ,CAAA,IAAK,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IAC5E;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,EACxB,IAAA,CAAK,CAAC,CAAC,KAAA,EAAO,MAAM,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,MAAM,MAAA,GAAS,MAAA,IAAU,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC,CAAA,CAC1F,GAAA,CAAI,CAAC,CAAC,QAAA,EAAU,KAAK,CAAA,KAAM,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA,CACnD,KAAK,IAAI,CAAA;AACd,CAAA;AAIO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAAuC;AACpE,EAAA,MAAM,EAAE,UAAS,GAAI,KAAA;AACrB,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAM,GAAI,QAAA;AAE7B,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,WAAA,CAAY;AAAA,MACV,CAAC,OAAA,EAAS,SAAA,CAAU,IAAI,CAAA;AAAA,MACxB,CAAC,aAAA,EAAe,KAAA,CAAM,WAAW,CAAA;AAAA,MACjC,CAAC,OAAA,EAAS,KAAA,CAAM,MAAM;AAAA,KACvB,CAAA;AAAA,IACD,EAAA;AAAA,IACA,CAAA,EAAA,EAAK,UAAU,IAAI,CAAA,CAAA;AAAA,IACnB,EAAA;AAAA,IACA,SAAA,CAAU,aACN,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,eAAA,EAAkB,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,UAAA,CAAA,GAC5D,2BAAA;AAAA,IACJ;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,OAAA,IAAW,UAAU,QAAA,EAAU;AACxC,IAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,SAAA,KAAc,QAAQ,EAAE,CAAA;AAEzE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,OAAA,CAAQ,IAAI,IAAI,EAAE,CAAA;AAEnC,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,KAAA,CAAM,IAAA,CAAK,wBAAwB,EAAE,CAAA;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,IAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,WAAM,IAAI,CAAA,CAAA;AAE9C,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,GAAA,EAAM,IAAA,CAAK,IAAI,CAAA,IAAA,EAAO,YAAY,IAAI,CAAC,CAAA,SAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAM,SAAS,MAAM,CAAA;AAAA,OAC3F;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,MAAM,SAAA,GAAY,gBAAgB,KAAK,CAAA;AAEvC,EAAA,IAAI,cAAc,EAAA,EAAI;AACpB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,EAAI,EAAE,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;ACjFA,IAAM,WAAA,GAAc,kCAAA;AAGb,IAAM,kBAAA,GAAqB,OAAO,IAAA,KAA+C;AACtF,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAQ,MAAMD,GAAAA,CAAG,QAAA,CAAS,MAAM,MAAM,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA;AAElC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAA,EAAW,IAAA,EAAM,KAAA,CAAA,EAAU;AAAA,IAC5C;AAEA,IAAA,MAAM,MAAA,GAAkBE,KAAAA,CAAU,KAAA,CAAM,CAAC,KAAK,EAAE,CAAA;AAEhD,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,CAAA,EAAW,IAAA,EAAM,KAAA,CAAA,EAAU;AAAA,IAC5C;AAEA,IAAA,MAAM,MAAA,GAAS,MAAA;AAEf,IAAA,OAAO;AAAA,MACL,MAAM,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,KAAA,CAAA;AAAA,MACtD,MAAM,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,KAAA;AAAA,KACxD;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAW,IAAA,EAAM,MAAA,EAAU;AAAA,EAC5C;AACF;AAGA,IAAM,QAAA,GAAW,OAAO,MAAA,KAAsC;AAC5D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMC,IAAAA,CAAK;AAAA,MACzB,QAAA,EAAqB,CAAC,SAAS,CAAA;AAAA,MAC/B,GAAA,EAAqB,MAAA;AAAA,MACrB,SAAA,EAAqB,IAAA;AAAA,MACrB,mBAAA,EAAqB;AAAA,KACtB,CAAA;AAED,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,CAAE,KAAK,cAAc,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF,CAAA;AAOO,IAAM,KAAA,GAAQ,OAAO,GAAA,KAA4C;AACtE,EAAA,MAAM,EAAE,QAAA,EAAS,GAA4B,MAAM,KAAK,GAAG,CAAA;AAE3D,EAAA,MAAM,IAAA,GAAW,MAAM,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,QAAA,CAAS,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,WAAA,CAAY,IAAI,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AAEhF,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,MAAM,QAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,IAAA,MAAM,OAAA,GAAY,YAAY,IAAI,CAAA;AAClC,IAAA,MAAM,SAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,OAAA,EAAS,YAAA,EAAc,KAAK,IAAA,EAAK;AAEtE,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,KAAK,EAAE,GAAG,SAAA,EAAW,cAAA,EAAgB,QAAW,CAAA;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,kBAAA,CAAmBF,MAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAC,CAAA;AAE3E,IAAA,IAAI,IAAA,KAAS,KAAK,IAAA,EAAM;AACtB,MAAA,QAAA,CAAS,KAAK,EAAE,GAAG,SAAA,EAAW,cAAA,EAAgB,MAAM,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,EAAE,GAAG,SAAA,EAAW,cAAA,EAAgB,MAAM,CAAA;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CACd,MAAA,CAAO,CAAC,QAAQ,GAAA,KAAQ,cAAA,IAAkB,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAC,CAAA,CAC5D,KAAK,cAAc,CAAA;AAEtB,EAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAAwC;AACxD,IAAA,OAAO,MAAA,CAAO,OAAA,EAAS,CAAC,KAAA,KAAU,MAAM,MAAM,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAAA,IAC5B,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,IAC3B,OAAA,EAAU,SAAS,OAAO,CAAA;AAAA,IAC1B,KAAA,EAAU,SAAS,KAAK,CAAA;AAAA,IACxB,QAAA;AAAA,IACA,EAAA,EAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,MAAM,MAAA,KAAW,CAAA,IAAK,SAAS,MAAA,KAAW;AAAA,GACxE;AACF;AC3HO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF;AAIO,IAAM,cAAA,GAAiB,OAAO,IAAA,KAA8C;AACjF,EAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,IAAA,MAAM,SAAA,GAAYA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA;AAC7C,IAAA,IAAI,MAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/B,MAAA,OAAO,QAAQ,SAAS,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAyBA,IAAM,aAAA,GAAgB,CAAC,KAAA,KAA2B;AAChD,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAErE,EAAA,OAAO,QAAQ,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA,EAAG,MAAK,IAAK,eAAA;AAC3C,CAAA;AAGA,IAAM,iBAAA,GAAoB,CAAC,IAAA,EAAc,KAAA,KAAgD;AACvF,EAAA,MAAM,MAAA,GAASG,mBAAAA,CAAoB,OAAA,EAAQ,CAAE,UAAU,KAAK,CAAA;AAE5D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CACxB,GAAA;AAAA,MAAI,CAAC,KAAA,KACJ,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,IAAI,KAAA,CAAM,OAAA,GAAU,CAAA,EAAG,KAAA,CAAM,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA;AAAA,KACrF,CACC,KAAK,IAAI,CAAA;AAEZ,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,EACzC;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA;AAE7D,EAAA,MAAM,SAAS,MAAA,CAAO,WAAA;AAAA,IACpB,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,QAAA,CAAS,QAAA,CAAS,GAAG,CAAC;AAAA,GACtE;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,MAAA,EAAO;AAC1C,CAAA;AAIO,IAAM,iBAAA,GAAoB,OAAO,IAAA,KAAyC;AAC/E,EAAA,MAAM,IAAA,GAAO,MAAM,cAAA,CAAe,IAAI,CAAA;AAEtC,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAS,UAAA,CAAW,MAAA,CAAA,IAAA,CAAY,KAAK,EAAE,WAAA,EAAa,OAAO,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,OAAA,EAAS,MAAM,CAAA;AAExD,IAAA,OAAO,iBAAA,CAAkB,MAAM,MAAM,CAAA;AAAA,EACvC,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,KAAA,EAAO,aAAA,CAAc,KAAK,CAAA,EAAE;AAAA,EAC/D;AACF;AC9EA,IAAM,KAAA,GAAiF;AAAA,EACrF,CAAC,QAAQ,OAAO,CAAA;AAAA,EAChB,CAAC,WAAW,SAAS,CAAA;AAAA,EACrB,CAAC,cAAc,YAAY;AAC7B,CAAA;AAEA,IAAM,KAAA,GAAQ,CAAC,KAAA,KAA4B;AACzC,EAAA,OAAO,KAAA,KAAU,UAAa,EAAE,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,KAAM,EAAA,CAAA;AAChF,CAAA;AAEA,IAAM,UAAA,GAAa,CAAC,MAAA,EAAiC,GAAA,KAA+C;AAClG,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AAExB,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,KAAA,GAAqB,MAAA;AACtD,CAAA;AAYO,IAAM,aAAA,GAAgB,CAAC,OAAA,GAAyB,EAAC,KAAsB;AAC5E,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,MAAM,UAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,CAAC,QAAQ,GAAG,CAAA,IAAK,CAAC,GAAG,KAAK,CAAA,CAAE,OAAA,EAAQ,EAAG;AAChD,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAG,CAAA;AAE1B,IAAA,IAAI,WAAW,MAAA,EAAW;AAE1B,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,MAAA,IAAI,CAAC,KAAA,CAAM,KAAK,CAAA,EAAG;AAEnB,MAAA,MAAA,CAAO,IAAI,CAAA,GAAK,KAAA;AAChB,MAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,EAAC;AAEf,EAAA,KAAA,MAAW,OAAO,kBAAA,EAAoB;AACpC,IAAA,MAAM,QAAA,GAAW,kBAAkB,aAAA,CAAc,GAAG,GAAG,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAC,CAAA;AAE9E,IAAA,KAAA,CAAM,GAAG,CAAA,GAAK,QAAA;AACd,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,GAAG,SAAS,KAAK,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,MAAA,GAASA,mBAAAA,CAAoB,KAAA,CAAM,MAAM,CAAA;AAE/C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACtC,IAAA,OAAA,CAAQ,IAAI,CAAA,KAAM,SAAA;AAAA,EACpB;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAA8B;AAC1D;;;AC9EO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EAC7C,YAAY,IAAA,EAAc;AACxB,IAAA,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,mBAAA,CAAqB,CAAA;AAClC,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAOO,IAAM,wBAAA,GAAN,cAAuC,KAAA,CAAM;AAAA,EACzC,KAAA;AAAA,EAET,YAAY,KAAA,EAA0B;AACpC,IAAA,KAAA;AAAA,MACE;AAAA,QACE,+BAAA;AAAA,QACA,EAAA;AAAA,QACA,iCAAA;AAAA,QACA,EAAA;AAAA,QACA,sDAAA;AAAA,QACA,uCAAA;AAAA,QACA,+DAAA;AAAA,QACA,EAAA;AAAA,QACA,8CAAA;AAAA,QACA,4CAAA;AAAA,QACA,oDAAA;AAAA,QACA,EAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI;AAAA,KACb;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,GAAG,KAAK,CAAA;AAAA,EACxB;AACF;AAGO,IAAM,oBAAA,GAAN,cAAmC,KAAA,CAAM;AAAA,EAC9C,WAAA,CAAY,WAAmB,KAAA,EAA0B;AACvD,IAAA,KAAA,CAAM,CAAA,kBAAA,EAAqB,SAAS,CAAA,cAAA,EAAiB,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACnF,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;ACnCA,IAAM,gBAAA,GAAwB,CAAA;AAC9B,IAAM,qBAAA,GAAwB,GAAA;AAE9B,IAAM,YAAA,GAAe,CAAC,EAAA,KAA8B;AAClD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,UAAA,CAAW,OAAA,EAAS,EAAE,CAAA,CAAE,KAAA,IAAQ;AAAA,EAClC,CAAC,CAAA;AACH,CAAA;AAIO,IAAM,YAAA,GAAe,CAAC,OAAA,EAAiB,WAAA,KAAgC;AAC5E,EAAA,OAAO,WAAA,GAAc,MAAM,OAAA,GAAU,CAAA,CAAA;AACvC;AAIO,IAAM,SAAA,GAAY,OAAU,IAAA,EAAwB,OAAA,GAAwB,EAAC,KAAkB;AACpG,EAAA,MAAM,QAAA,GAAc,QAAQ,QAAA,IAAY,gBAAA;AACxC,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,qBAAA;AAC3C,EAAA,MAAM,KAAA,GAAc,QAAQ,KAAA,IAAS,YAAA;AAErC,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,QAAA,EAAU,WAAW,CAAA,EAAG;AACvD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,EAAK;AAAA,IACpB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAEZ,MAAA,IAAI,OAAA,KAAY,QAAA,IAAY,CAAC,wBAAA,CAAyB,KAAK,CAAA,EAAG;AAC5D,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,OAAA,CAAQ,OAAA,GAAU,SAAS,KAAK,CAAA;AAEhC,MAAA,MAAM,KAAA,CAAM,YAAA,CAAa,OAAA,EAAS,WAAW,CAAC,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,MAAM,SAAA;AACR;AC5CO,IAAM,cAAA,GAAiB;AAE9B,IAAM,eAAA,GAAkB,CAAA;AAqBjB,IAAM,cAAA,GAAiB;AAGvB,IAAM,aAAA,GAAgB;AAAA,EAC3B,qFAAA;AAAA,EACA,EAAA;AAAA,EACA,+EAAA;AAAA,EACA,2EAAA;AAAA,EACA,EAAA;AAAA,EACA,uBAAA;AAAA,EACA,mDAAA;AAAA,EACA,4EAAA;AAAA,EACA,yEAAA;AAAA,EACA,iDAAA;AAAA,EACA,uEAAA;AAAA,EACA,2EAAA;AAAA,EACA,EAAA;AAAA,EACA,aAAA;AAAA,EACA,+EAAA;AAAA,EACA,mEAAA;AAAA,EACA,4EAAA;AAAA,EACA,gDAAA;AAAA,EACA,iEAAA;AAAA,EACA,wDAAA;AAAA,EACA,EAAA;AAAA,EACA,6EAAA;AAAA,EACA,qCAAA;AAAA,EACA,4DAAA;AAAA,EACA,EAAA;AAAA,EACA,6EAAA;AAAA,EACA,6EAAA;AAAA,EACA,+EAAA;AAAA,EACA,8EAAA;AAAA,EACA,8EAAA;AAAA,EACA,0EAAA;AAAA,EACA,EAAA;AAAA,EACA,uEAAA;AAAA,EACA,6EAAA;AAAA,EACA,6EAAA;AAAA,EACA,kEAAA;AAAA,EACA,0EAAA;AAAA,EACA,EAAA;AAAA,EACA,2EAAA;AAAA,EACA,uEAAA;AAAA,EACA,EAAA;AAAA,EACA,sEAAA;AAAA,EACA,yEAAA;AAAA,EACA,2EAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI;AAEX,IAAM,KAAA,GAAQ,CAAC,MAAA,KACb;AAAA,EACE,QAAQ,MAAA,CAAO,IAAI,GAAG,MAAA,CAAO,SAAA,GAAY,iBAAiB,EAAE,CAAA,CAAA;AAAA,EAC5D,EAAA;AAAA,EACA,CAAA,MAAA,EAAS,OAAO,QAAQ,CAAA,CAAA;AAAA,EACxB,MAAA,CAAO,OAAA;AAAA,EACP,KAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAEb,IAAM,SAAA,GAAY,CAAC,IAAA,KAAyB;AAC1C,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,QAAA,EAAW,KAAK,IAAI,CAAA,CAAA;AAAA,IACpB,CAAA,QAAA,EAAW,KAAK,IAAI,CAAA,CAAA;AAAA,IACpB,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,IACxC,gBAAgB,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAC7B,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,EAAG,KAAA,CAAM,QAAQ,KAAK,KAAA,CAAM,KAAK,GAAG,CAAA,CACnD,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,GACf;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,KAAa,IAAA,EAAM;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,oBAAA,EAAuB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA,EAAG;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,IAAA,CAAK,UAC3B,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,CAAK,YAAY,GAAG,CAAA,GAAI,CAAC,CAAC,CAAA,CAC7D,KAAK,cAAc,CAAA;AACtB,IAAA,KAAA,CAAM,KAAK,CAAA,kCAAA,EAAqC,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,OAAA,KAAY,MAAA,EAAW;AACpC,IAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,OAAA,CAC9B,IAAI,CAAC,MAAA,KAAW,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,CAAA,EAAI,MAAA,CAAO,IAAI,CAAA,CAAE,CAAA,CAC/C,KAAK,cAAc,CAAA;AACtB,IAAA,KAAA,CAAM,KAAK,CAAA,WAAA,EAAc,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW;AACtC,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AACtD,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAA,KAAS,MAAA,EAAW;AAC3C,MAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,EAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AAIO,IAAM,eAAA,GAAkB,CAAC,KAAA,KAA+C;AAC7E,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,CAAA,WAAA,EAAc,MAAM,aAAa,CAAA,CAAA;AAAA,IACjC,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,QAAQ,OAAO,CAAA,CAAA,CAAA;AAAA,IACxD,EAAA;AAAA,IACA,UAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAG,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,IACvB,EAAA;AAAA,IACA,YAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAG,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,IAC1B,CAAA,2BAAA,EAA8B,MAAM,IAAI,CAAA,CAAA;AAAA,GAC1C,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA;AAAA,IACA,GAAI,MAAM,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,IAC1D,GAAI,MAAM,WAAA,KAAgB,MAAA,GAAY,EAAC,GAAI,EAAE,WAAA,EAAa,KAAA,CAAM,WAAA,EAAY;AAAA,IAC5E,QAAA,EAAU,EAAE,MAAA,EAAQ,KAAA,CAAM,KAAK,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,SAAA;AAAU,GACrE;AACF;AAIO,IAAM,eAAA,GAAkB,OAAO,IAAA,EAAc,IAAA,KAAsC;AACxF,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC5B,KAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAA8B;AAC7D,MAAA,MAAM,GAAA,GAAY,MAAMJ,GAAAA,CAAG,QAAA,CAASC,KAAAA,CAAK,QAAQ,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,EAAG,MAAM,CAAA;AACzE,MAAA,MAAM,SAAA,GAAY,IAAI,MAAA,GAAS,cAAA;AAE/B,MAAA,OAAO;AAAA,QACL,MAAU,IAAA,CAAK,IAAA;AAAA,QACf,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,SAAU,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,GAAG,GAAA;AAAA,QACpD;AAAA,OACF;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,OAAA;AACT;AAIO,IAAM,cAAA,GAAiB,CAAC,OAAA,KAAuC;AACpE,EAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,IAAU,eAAe,CAAA;AAC5F;;;AClLO,IAAM,kBAAA,GAAqB,OAAa,KAAA,EAAqB,KAAA,EAAe,IAAA,KAAgD;AACjI,EAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AACzC,EAAA,IAAI,MAAA,GAAY,CAAA;AAEhB,EAAA,MAAM,SAAS,YAA2B;AACxC,IAAA,OAAO,MAAA,GAAS,MAAM,MAAA,EAAQ;AAC5B,MAAA,MAAM,KAAA,GAAQ,MAAA;AAEd,MAAA,MAAA,IAAU,CAAA;AAEV,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AAExB,MAAA,IAAI,SAAS,MAAA,EAAW;AAExB,MAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,KAAA,CAAM,MAAM,CAAC,CAAA,EAAE,EAAG,MAAM,CAAC,CAAA;AAC5F,EAAA,OAAO,OAAA;AACT,CAAA;ACFO,IAAM,QAAA,GAAW,OAAO,MAAA,EAAgB,QAAA,EAAkB,OAAA,KAAmC;AAClG,EAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AAE5C,EAAA,MAAMD,GAAAA,CAAG,MAAMC,KAAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACxD,EAAA,MAAMD,GAAAA,CAAG,SAAA,CAAU,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAC5C,CAAA;AAIO,IAAM,SAAA,GAAY,OAAO,QAAA,EAAoB,MAAA,EAAuB,IAAA,KAAiC;AAC1G,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,UAAU,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAC,CAAA;AAEzF,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,IACzB,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAmC;AAC3D,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AAE9C,MAAA,IAAI,YAAY,MAAA,EAAW;AACzB,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAM,UAAU,eAAA,CAAgB;AAAA,QAC9B,IAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAA,EAAe,SAAS,SAAA,CAAU,IAAA;AAAA,QAClC,OAAA,EAAe,MAAM,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAA;AAAA,QAC/C,MAAe,MAAA,CAAO,IAAA;AAAA,QACtB,OAAe,MAAA,CAAO,KAAA;AAAA,QACtB,aAAe,MAAA,CAAO;AAAA,OACvB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA,EAAiB,YAAY,IAAI,CAAA;AAAA,QACjC,eAAA,EAAiB,eAAe,OAAO;AAAA,OACzC;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAoB,QAAQ,MAAS,CAAA;AAC3D,CAAA;ACjDO,IAAM,aAAA,GAAgB,CAAC,MAAA,KAAkC,MAAA,CAAO,KAAA,IAAS;AAUzE,IAAM,MAAA,GAAS,OAAO,GAAA,EAAU,KAAA,EAA+B,OAAA,KAAsD;AAC1H,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM;AACpC,IAAA,OAAO,iBAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,kBAAkB,cAAA,EAAgB;AAC1C,IAAA,OAAO,wBAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACjC,IAAA,OAAO,eAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,CAAQ,IAAA,EAAM;AAC/B,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAE,MAAM,UAAA,CAAWC,KAAAA,CAAK,OAAA,CAAQ,QAAQ,MAAA,EAAQ,GAAA,CAAI,OAAO,CAAC,CAAA,EAAI;AAClE,IAAA,OAAO,gBAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAA;AACT,CAAA;AChDO,IAAM,mBAAA,GAAsB;AAE5B,IAAM,mBAAA,GAAsB;AAQnC,IAAM,oBAAA,GAA+C;AAAA,EACnD;AAAA,IACE,MAAA,EAAS,gEAAA;AAAA,IACT,OAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,MAAA,EAAS,qEAAA;AAAA,IACT,OAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,MAAA,EAAS,uCAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAS,0DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAS,oDAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAS,oDAAA;AAAA,IACT,OAAA,EAAS;AAAA;AAEb,CAAA;AAEA,IAAM,KAAA,GAAc,mBAAA;AACpB,IAAM,WAAA,GAAc,qBAAA;AAQpB,IAAM,SAAA,GAAY,CAAC,IAAA,KAA+B;AAChD,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,IAAII,MAAAA;AAEJ,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAE7B,IAAA,IAAIA,WAAU,MAAA,EAAW;AACvB,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAAA,MAAAA,GAAQ,MAAM,CAAC,CAAA;AAAA,MACjB;AAEA,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,KAAA,KAAU,MAAM,CAAA;AAEjD,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAEvC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,CAAC,MAAMA,MAAAA,EAAO;AACxC,MAAAA,MAAAA,GAAQ,MAAA;AAAA,IACV;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AAOA,IAAM,iBAAiB,CAAC,YAAA,EAAsB,MAAA,EAAgB,MAAA,KAC5D,IAAI,aAAA,CAAc;AAAA,EAChB,QAAA,EAAU,YAAA;AAAA,EACV,IAAA,EAAU,iBAAA;AAAA,EACV,OAAA,EAAU,mCAAmC,MAAM,CAAA,CAAA;AAAA,EACnD;AACF,CAAC,CAAA;AAGI,IAAM,OAAA,GAAU,CAAC,IAAA,EAAc,KAAA,KAA0B;AAC9D,EAAA,MAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC5C,EAAA,OAAO,IAAA,CAAK,MAAA,IAAU,KAAA,GAAQ,IAAA,GAAO,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAA,MAAA,CAAA;AAClE;AAGO,IAAM,iBAAA,GAAoB,CAAC,YAAA,EAAsB,IAAA,KAAqC;AAC3F,EAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,MAAA,IAAU,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAEnF,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,MAAM,cAAA;AAAA,MACJ,YAAA;AAAA,MACA,iCAAA;AAAA,MACA,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,IAAK;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,KAAA,CACb,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CACd,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA,CACvB,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AAER,EAAA,IAAI,OAAA,CAAQ,SAAS,mBAAA,EAAqB;AACxC,IAAA,MAAM,cAAA;AAAA,MACJ,YAAA;AAAA,MACA,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,yDAAA,EAA4D,mBAAmB,CAAA,MAAA,CAAA;AAAA,MAChG,OAAA,CAAQ,SAAS,GAAG;AAAA,KACtB;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,CACV,KAAA,CAAM,KAAK,EACX,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,CACvB,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AAER,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,KAAY,EAAA,GAAK,SAAY,OAAA,EAAQ;AAChE;AAOA,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAc,KAAA,KAA0B;AAC7D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,EAAE,CAAA;AACpC,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAA,GAAQ,EAAE,CAAC,CAAA,EAAG,GAAG,CAAA;AAC1E,CAAA;AAGO,IAAM,kBAAA,GAAqB,CAAC,IAAA,KAA6C;AAC9E,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,EAAA,IAAI,OAAA,CAAQ,SAAS,mBAAA,EAAqB;AACxC,IAAA,OAAO;AAAA,MACL,MAAA,EAAS,CAAA,gBAAA,EAAmB,OAAA,CAAQ,MAAM,0BAA0B,mBAAmB,CAAA,QAAA,CAAA;AAAA,MACvF,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,GAAG;AAAA,KAC/B;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,oBAAA,EAAsB;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAEvC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAO,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,SAAS,aAAA,CAAc,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,IAC7E;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAGO,IAAM,qBAAA,GAAwB,CAAC,YAAA,EAAsB,IAAA,KAAuB;AACjF,EAAA,MAAM,OAAA,GAAU,mBAAmB,IAAI,CAAA;AAEvC,EAAA,IAAI,YAAY,MAAA,EAAW;AAE3B,EAAA,MAAM,cAAA,CAAe,YAAA,EAAc,OAAA,CAAQ,MAAA,EAAQ,QAAQ,OAAO,CAAA;AACpE;AAQO,IAAM,eAAA,GAAkB,CAAC,YAAA,EAAsB,IAAA,KAAmC;AACvF,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,iBAAA,CAAkB,cAAc,IAAI,CAAA;AAC/D,EAAA,qBAAA,CAAsB,cAAc,IAAI,CAAA;AAExC,EAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,QAAA,EAAS;AAC3C;;;AChKA,IAAM,SAAA,GAAY,CAAC,IAAA,EAAc,MAAA,KAA2B;AAC1D,EAAA,MAAM,WAAW,OAAA,CAAQJ,KAAAA,CAAK,QAAA,CAAS,IAAA,EAAM,MAAM,CAAC,CAAA;AAEpD,EAAA,OAAO,QAAA,KAAa,KAAK,GAAA,GAAM,QAAA;AACjC,CAAA;AAsBA,IAAM,QAAA,GAAW,CAAC,SAAA,EAAgC,QAAA,KAAmC;AACnF,EAAA,MAAM,WAAW,QAAA,CAAS,SAAA,CAAU,QAAA,CACjC,GAAA,CAAI,CAAC,OAAA,KAAY;AAChB,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,MAAA,CAAO,CAAC,EAAE,GAAA,EAAI,KAAM,GAAA,CAAI,IAAA,CAAK,SAAA,KAAc,OAAA,CAAQ,EAAE,CAAA;AAE3E,IAAA,OAAO;AAAA,MACL,IAAiB,OAAA,CAAQ,EAAA;AAAA,MACzB,MAAiB,OAAA,CAAQ,IAAA;AAAA,MACzB,OAAA,EAAiB,IAAI,MAAA,CAAO,CAAC,EAAE,MAAA,EAAO,KAAM,MAAA,KAAW,QAAQ,CAAA,CAAE,MAAA;AAAA,MACjE,MAAA,EAAiB,IAAI,MAAA,CAAO,CAAC,EAAE,MAAA,EAAO,KAAM,MAAA,KAAW,QAAQ,CAAA,CAAE,MAAA;AAAA,MACjE,iBAAiB,GAAA,CACd,MAAA,CAAO,CAAC,EAAE,MAAA,OAAa,MAAA,KAAW,QAAQ,EAC1C,MAAA,CAAO,CAAC,KAAK,EAAE,GAAA,OAAU,GAAA,GAAM,GAAA,CAAI,iBAAiB,CAAC;AAAA,KAC1D;AAAA,EACF,CAAC,EACA,MAAA,CAAO,CAAC,YAAY,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,OAAA,EAAiB,SAAS,MAAA,CAAO,CAAC,KAAK,OAAA,KAAY,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA;AAAA,IAC3E,MAAA,EAAiB,SAAS,MAAA,CAAO,CAAC,KAAK,OAAA,KAAY,GAAA,GAAM,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAAA,IAC1E,eAAA,EAAiB,SAAS,MAAA,CAAO,CAAC,KAAK,OAAA,KAAY,GAAA,GAAM,OAAA,CAAQ,eAAA,EAAiB,CAAC,CAAA;AAAA,IACnF;AAAA,GACF;AACF,CAAA;AAIA,IAAM,WAAA,GAAc,CAAC,KAAA,EAAgB,KAAA,KAAsC;AACzE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,EAAE,SAAS,KAAA,CAAA,EAAQ;AACpE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAS,MAAkC,KAAK,CAAA;AAEtD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C,CAAA;AAGO,IAAM,QAAA,GAAW,OAAO,GAAA,KAAkD;AAC/E,EAAA,MAAM,SAAc,GAAA,CAAI,MAAA,IAAUG,mBAAAA,CAAoB,KAAA,CAAM,EAAE,CAAA;AAC9D,EAAA,MAAM,OAAA,GAAc,MAAM,IAAA,CAAK,GAAG,CAAA;AAClC,EAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,WAAA;AACrC,EAAA,MAAM,IAAA,GAAc,OAAA,CAAQ,QAAA,CAAS,SAAA,CAAU,IAAA;AAC/C,EAAA,MAAM,QAAA,GAAc,EAAE,GAAG,OAAA,CAAQ,QAAA,EAAU,SAAS,SAAA,CAAU,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA,EAAE;AAEhF,EAAA,MAAM,YAAkB,GAAA,CAAI,SAAA,IAAaH,KAAAA,CAAK,OAAA,CAAQ,MAAM,kBAAkB,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAkB,cAAc,MAAM,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAkB,MAAM,SAAA,CAAU,SAAS,CAAA;AACjD,EAAA,MAAM,eAAA,GAAkB,WAAW,QAAQ,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,QAAA,EAAU,QAAQ,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAU,GAAA,CAAI,IAAA,KAAS,SAAY,MAAA,GAAY,SAAA,CAAU,IAAI,IAAI,CAAA;AAEvE,EAAA,MAAM,aAAa,CAAC,GAAA,KAClB,YAAY,MAAA,IACZ,OAAA,CAAQ,IAAI,IAAA,CAAK,EAAE,CAAA,IACnB,OAAA,CAAQ,IAAI,IAAA,CAAK,IAAI,KACrB,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AAEvB,EAAA,MAAM,QAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAC7C,EAAA,MAAM,cAAc,OAAA,CACjB,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,WAAW,GAAG,CAAC,CAAA,CAChC,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,EAAE,CAAA,CACxB,KAAK,cAAc,CAAA;AAEtB,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,KAAA;AAAA,IACA,MAAO,MAAA,CAAO,IAAA;AAAA,IACd,KAAA,EAAO,IAAI,KAAA,KAAU;AAAA,GACvB;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC9B,QAAA,CAAS,GAAA,CAAI,OAAO,GAAA,MAAS;AAAA,MAC3B,GAAA;AAAA,MACA,MAAA,EAAQ,MAAM,MAAA,CAAO,GAAA,EAAK,eAAA,CAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,eAAe;AAAA,KAC7E,CAAE;AAAA,GACJ;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,OAAA,KAA8C;AAC/D,IAAA,MAAMK,QAAO,OAAA,CACV,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,QAAO,MAAO;AAAA,MACzB,MAAA,EAAiB,IAAI,IAAA,CAAK,EAAA;AAAA,MAC1B,SAAiB,GAAA,CAAI,OAAA;AAAA,MACrB,KAAA,EAAiB,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,KAAA,CAAM,MAAA;AAAA,MAC3C,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,MAAA;AAAA,MACA,YAAY,MAAA,KAAW;AAAA,KACzB,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAEpD,IAAA,MAAM,YAAY,CAAC,UAAA,KAAgCA,MAChD,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,UAAA,KAAe,UAAU,CAAA,CACjD,OAAO,CAAC,GAAA,EAAK,UAAU,GAAA,GAAM,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAExD,IAAA,OAAO;AAAA,MACL,IAAA,EAAAA,KAAAA;AAAA,MACA,eAAA,EAAiB,UAAU,IAAI,CAAA;AAAA,MAC/B,WAAA,EAAiB,UAAU,KAAK,CAAA;AAAA,MAChC,SAAA,EAAiBA,MAAK,MAAA,CAAO,CAAC,UAAU,CAAC,KAAA,CAAM,UAAU,CAAA,CAAE;AAAA,KAC7D;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,IAAA,IAAQ,GAAA,CAAI,aAAa,MAAA,EAAW;AACrD,IAAA,MAAM,KAAA,GAAQ,UAAU,SAAS,CAAA;AAEjC,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,SAAS,EAAC;AAAA,MACV,MAAS,KAAA,CAAM,IAAA;AAAA,MACf,UAAU,EAAC;AAAA,MACX,UAAU,EAAC;AAAA,MACX,WAAA;AAAA,MACA,SAAS,EAAC;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,iBAAiB,KAAA,CAAM,eAAA;AAAA,MACvB,aAAiB,KAAA,CAAM,WAAA;AAAA,MACvB,SAAA,EAAiB,CAAA;AAAA,MACjB,WAAiB,KAAA,CAAM,SAAA;AAAA,MACvB,MAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAIA,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,UAAA,KAAe,MAAA,GACjC,IAAI,QAAA,GACH,MAAM,GAAA,CAAI,UAAA,CAAW,QAAA,CAAS,SAAA,EAAW,QAAQ,CAAC,KAAM,GAAA,CAAI,QAAA;AAEjE,EAAA,MAAM,OAAA,GAAU,SAAA,KAAc,MAAA,GAC1B,SAAA,GACA,UAAU,MAAA,CAAO,CAAC,EAAE,GAAA,OAAU,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAS,CAAC,CAAA;AAExE,EAAA,MAAM,UAAA,GAAa,SAAA,KAAc,MAAA,GAC7B,EAAC,GACD,SAAA,CACG,MAAA,CAAO,CAAC,EAAE,GAAA,EAAI,KAAM,CAAC,SAAA,CAAU,SAAS,GAAA,CAAI,IAAA,CAAK,SAAS,CAAC,CAAA,CAC3D,GAAA,CAAI,CAAC,EAAE,GAAA,EAAI,KAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAEnC,EAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,aAAa,SAAA,EAAU,GAAI,UAAU,OAAO,CAAA;AAE3E,EAAA,MAAM,iBAAA,GAAoB,CAAC,GAAG,WAAA,EAAa,GAAG,UAAU,CAAA,CAAE,KAAK,cAAc,CAAA;AAE7E,EAAA,MAAM,WAA8B,GAAA,CAAI,QAAA;AACxC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,SAAA,uBAAkC,GAAA,EAAoB;AAC5D,EAAA,MAAM,OAAA,GAA8B,QAAQ,MAAA,CAAO,CAAC,EAAE,MAAA,EAAO,KAAM,WAAW,QAAQ,CAAA;AAKtF,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,OAAA;AAEJ,EAAA,MAAM,QAAU,OAAA,CAAQ,MAAA;AACxB,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAA+B,GAAA,CAAI,UAAU,KAAK,CAAA;AAElE,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,EAAgB,OAAA,EAAsB,UAAA,KAA6B;AACnF,IAAA,SAAA,IAAa,CAAA;AACb,IAAA,MAAA,CAAO,EAAE,MAAM,WAAA,EAAa,MAAA,EAAQ,OAAO,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,EACpF,CAAA;AAEA,EAAA,KAAA,MAAW,EAAE,GAAA,EAAI,IAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,EAAE,MAAA,EAAO,KAAM,MAAA,KAAW,QAAQ,CAAA,EAAG;AACzE,IAAA,MAAA,CAAO,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,SAAA,GAAY,CAAA,EAAG,KAAA,EAAO,CAAA;AAC/E,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,QAAA,EAAU,CAAC,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,OAAA,EAAS,OAAO,WAAA,EAAa,OAAO,EAAE,GAAA,EAAI,KAAM;AACxF,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAA,CAAO,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,SAAA,GAAY,CAAA,EAAG,KAAA,EAAO,CAAA;AAE/E,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,CAAU,MAAM,QAAA,CAAS,SAAS,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA;AAElF,MAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,QAAA,CAAS,IAAA,EAAM,WAAW,IAAI,CAAA;AAE/D,MAAA,IAAI,QAAA,CAAS,oBAAoB,KAAA,CAAA,EAAW;AAC1C,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,MAAA,EAAS,IAAI,IAAA,CAAK,EAAA;AAAA,UAClB,OAAA,EAAS,SAAS,eAAA,CAAgB,MAAA;AAAA,UAClC,OAAA,EAAS,OAAA,CAAQ,QAAA,CAAS,eAAA,EAAiB,GAAG;AAAA,SAC/C,CAAA;AAAA,MACH;AAEA,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,EAAA,EAAI,aAAa,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AACzD,MAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAA2B;AAAA,QAC/B,MAAA,EAAQ,IAAI,IAAA,CAAK,EAAA;AAAA,QACjB,QAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAS,OAAO,KAAK,CAAA;AAAA,QAC5D,IAAA,EAAQ,WAAA,CAAY,KAAA,EAAO,MAAM,CAAA;AAAA,QACjC,MAAA,EAAQ,WAAA,CAAY,KAAA,EAAO,QAAQ;AAAA,OACrC;AAEA,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAErB,MAAA,IAAI,OAAA,KAAY,MAAA,IAAa,oBAAA,CAAqB,KAAK,CAAA,EAAG;AACxD,QAAA,OAAA,GAAU;AAAA,UACR,QAAW,OAAA,CAAQ,MAAA;AAAA,UACnB,IAAA,EAAW,QAAQ,IAAA,IAAQ,SAAA;AAAA,UAC3B,QAAW,OAAA,CAAQ,MAAA;AAAA,UACnB,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,EAAA,EAAI,UAAU,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AACtD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,SAAA,EAAW,QAAQ,MAAA,EAAO;AAAA,EACpD;AAIA,EAAA,MAAM,UAAsB,EAAC;AAC7B,EAAA,MAAM,QAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,YAAY,MAAA,EAAW;AAE3B,IAAA,MAAM,QAAA;AAAA,MACJ,GAAA,CAAI,MAAA;AAAA,MACJ,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,aAAA,CAAc;AAAA,QACZ,IAAA,EAAS,QAAQ,GAAA,CAAI,IAAA;AAAA,QACrB,OAAA,EAAS,QAAQ,GAAA,CAAI,OAAA;AAAA,QACrB,MAAS,OAAA,CAAQ,IAAA;AAAA,QACjB;AAAA,OACD;AAAA,KACH;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAC,CAAA;AACzC,IAAA,SAAA,CAAU,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,IAAI,CAAA;AAC/C,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,MAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA;AAAA,MAChC,QAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAA;AAAA,MAChC,aAAA,EAAe,cAAA;AAAA,MACf,KAAA;AAAA,MACA,MAAY,MAAA,CAAO,IAAA;AAAA,MACnB,UAAA,EAAY,QAAQ,GAAA,CAAI,OAAA;AAAA,MACxB;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,eAAe,CAAA;AAEtC,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAEjE,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,OAAA,EAAS,YAAW,CAAE,OAAA;AAAA,IACtB,OAAA,EAAS,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,MAAM,CAAC;AAAA,GAC/E;AAEA,EAAA,MAAM,UAAA,CAAW,WAAW,SAAS,CAAA;AACrC,EAAA,MAAM,QAAA,CAAS,IAAI,MAAA,EAAQ,cAAA,EAAgB,eAAe,EAAE,QAAA,EAAU,WAAA,EAAa,CAAC,CAAA;AAEpF,EAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAE3B,EAAA,MAAM,eAAA,GAA0B,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAC3D,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACrC,IAAA,OAAO,YAAY,MAAA,GAAY,IAAA,GAAO,EAAE,GAAG,MAAM,OAAA,EAAQ;AAAA,EAC3D,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,EAAE,GAAG,QAAA,EAAU,OAAO,eAAA,EAAgB;AAAA,IAChD,OAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA;AAAA,IACrC,IAAA;AAAA,IACA,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACpE,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACpE,WAAA,EAAa,iBAAA;AAAA,IACb,OAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA;AAAA,IACxC,OAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAW,KAAA,CAAM,MAAA;AAAA,IACjB,SAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;;;ACjVO,IAAM,mBAAA,GAAsB,CAAC,aAAA,EAAe,WAAW;AAc9D,IAAM,YAAA,GAAe,CAAC,SAAA,KACpB,CAAC,GAAG,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5B,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAEhD,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,IAAI,KAAA,KAAU,IAAI,OAAO,CAAA;AACzB,IAAA,IAAI,KAAA,KAAU,IAAI,OAAO,EAAA;AAEzB,IAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,EACjB;AAEA,EAAA,OAAO,cAAA,CAAe,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACtC,CAAC,CAAA;AAGI,IAAM,cAAA,GAAiB,OAAO,SAAA,KACnC,OAAA,CAAQ,GAAA;AAAA,EACN,YAAA,CAAa,SAAS,CAAA,CAAE,GAAA,CAAI,OAAO,QAAA,MAAc;AAAA,IAC/C,MAAW,QAAA,CAAS,IAAA;AAAA,IACpB,WAAW,MAAM,QAAA,CAAS,WAAU,CAAE,KAAA,CAAM,MAAM,KAAK;AAAA,GACzD,CAAE;AACJ;AAOK,IAAM,eAAA,GAAkB,OAAO,OAAA,KAAuD;AAC3F,EAAA,MAAM,QAAW,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAC,QAAA,KAAa,SAAS,IAAI,CAAA;AAClE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,MAAA,EAAQ,QAAA;AAEtD,EAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,EAAA,EAAI;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,QAAA,KAAa,QAAA,CAAS,SAAS,QAAQ,CAAA;AAE7E,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,oBAAA,CAAqB,QAAA,EAAU,KAAK,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,QAAA,IAAY,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtD,IAAA,IAAI,MAAM,QAAA,CAAS,SAAA,GAAY,KAAA,CAAM,MAAM,KAAK,CAAA,EAAG;AACjD,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,yBAAyB,KAAK,CAAA;AAC1C;;;ACpEO,IAAM,WAAN,MAA2C;AAAA,EACvC,MAAA,uBAAa,GAAA,EAAe;AAAA,EAErC,SAAS,IAAA,EAAe;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,IAAA,EAA6B;AAC/B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEA,IAAI,IAAA,EAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEA,IAAA,GAAY;AACV,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,EACjC;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AACF;AAKO,IAAM,qBAAA,GAAwB,CAAC,QAAA,GAAsB,EAAC,KAAuB;AAClF,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAkB;AAEvC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,QAAA;AACT;AAEO,IAAM,sBAAA,GAAyB,CAAC,SAAA,GAAwB,EAAC,KAAwB;AACtF,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAmB;AAExC,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,QAAA,CAAS,SAAS,QAAQ,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,QAAA;AACT;;;ACnCA,IAAM,eAAA,GAAkB,CAAC,OAAA,EAA4B,KAAA,KACnD;AAAA,EACE,iBAAA;AAAA,EACA,EAAA;AAAA,EACA,CAAA,0BAAA,EAA6B,KAAK,CAAA,KAAA,EAAQ,MAAA,CAAO,QAAQ,QAAA,CAAS,MAAA,IAAU,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,EACrF,EAAA;AAAA,EACA,qBAAA;AAAA,EACA,EAAA;AAAA,EACA,sEAAA;AAAA,EACA,oEAAA;AAAA,EACA,EAAA;AAAA,EACA,oBAAA;AAAA,EACA,EAAA;AAAA,EACA,4DAAA;AAAA,EACA,EAAA;AAAA,EACA,4BAAA;AAAA,EACA,EAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAIN,IAAM,kBAAA,GAAqB,CAAC,OAAA,GAA+B,EAAC,KAAoB;AACrF,EAAA,MAAM,QAA6B,EAAC;AAEpC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,IACtB,KAAA;AAAA,IACA,SAAA,EAAW,YAAwD,OAAA,CAAQ,SAAA,IAAa,IAAA;AAAA,IACxF,QAAA,EAAW,OAAO,OAAA,KAA0D;AAC1E,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AACpB,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAElB,MAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,GAAU,OAAA,EAAS,KAAK,CAAA,IAAK,eAAA,CAAgB,SAAS,KAAK,CAAA;AAChF,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,EAAE,WAAA,EAAa,EAAA,EAAI,YAAA,EAAc,CAAA,EAAE,EAAE;AAAA,IAClF;AAAA,GACF;AACF;;;ACjDO,IAAM,eAAuB,eAAA,CAAS","file":"index.js","sourcesContent":["{\n \"name\": \"@glossic/core\",\n \"version\": \"0.4.0\",\n \"description\": \"Glossic orchestration core: registries, pipeline and manifest plumbing\",\n \"keywords\": [\n \"documentation\",\n \"docs\",\n \"docs-as-code\",\n \"glossic\",\n \"orchestration\",\n \"pipeline\",\n \"manifest\",\n \"incremental\",\n \"cache\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Rody Huancas\",\n \"homepage\": \"https://github.com/rody-huancas/glossic#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/rody-huancas/glossic.git\",\n \"directory\": \"packages/core\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/rody-huancas/glossic/issues\"\n },\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@glossic/schema\": \"workspace:*\",\n \"jiti\": \"^2.6.1\",\n \"picomatch\": \"^4.0.3\",\n \"tinyglobby\": \"^0.2.15\",\n \"yaml\": \"^2.8.1\",\n \"zod\": \"^4.1.5\"\n }\n}\n","import fs from \"node:fs/promises\";\n\n/** True when the path can be reached; never throws. */\nexport const pathExists = async (target: string): Promise<boolean> => {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n};\n\n/** File contents, or undefined when it cannot be read. */\nexport const readText = async (target: string): Promise<string | undefined> => {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch {\n return undefined;\n }\n};\n\n/** Parsed JSON, or undefined when the file is missing or malformed. */\nexport const readJson = async <T>(target: string): Promise<T | undefined> => {\n const raw = await readText(target);\n \n if (raw === undefined) {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { sortBy } from \"./utils/index.js\";\n\nexport const DEFAULT_CACHE_PATH = \".glossic/cache.json\";\n/** Bumped by hand when the entry shape changes; a mismatch discards the whole file. */\nexport const CACHE_VERSION = \"1\";\n\n/** What a unit was documented from, so the next run can tell whether anything moved. */\nexport const CacheEntrySchema = z.object({\n unitId : z.string().min(1),\n unitHash : z.string().min(1),\n promptVersion: z.string().min(1),\n model : z.string().min(1),\n lang : z.string().min(1),\n outputPath : z.string().min(1),\n generatedAt : z.string().min(1),\n});\nexport type CacheEntry = z.infer<typeof CacheEntrySchema>;\n\nexport const CacheFileSchema = z.object({\n version: z.string().min(1),\n entries: z.array(CacheEntrySchema),\n});\nexport type CacheFile = z.infer<typeof CacheFileSchema>;\n\nexport const emptyCache = (): CacheFile => ({ version: CACHE_VERSION, entries: [] });\n\n\n/** Reads the cache, returning an empty one for a missing, corrupt or outdated file. */\nexport const readCache = async (target: string): Promise<CacheFile> => {\n try {\n const raw = await fs.readFile(path.resolve(target), \"utf8\");\n const parsed = CacheFileSchema.parse(JSON.parse(raw));\n\n return parsed.version === CACHE_VERSION ? parsed : emptyCache();\n } catch {\n return emptyCache();\n }\n};\n\n/** JSON with the entries sorted by unit id, so the file does not churn between runs. */\nexport const serializeCache = (cache: CacheFile): string => {\n return `${JSON.stringify({ ...cache, entries: sortBy(cache.entries, (entry) => entry.unitId) }, null, 2)}\\n`;\n}\n\n/** Writes the cache, creating its directory. Returns the absolute path written. */\nexport const writeCache = async (cache: CacheFile, target: string): Promise<string> => {\n const absolute = path.resolve(target);\n\n await fs.mkdir(path.dirname(absolute), { recursive: true });\n await fs.writeFile(absolute, serializeCache(cache), \"utf8\");\n\n return absolute;\n};\n\n/** Entries keyed by unit id, for lookups while deciding what to regenerate. */\nexport const indexCache = (cache: CacheFile): Map<string, CacheEntry> => {\n return new Map(cache.entries.map((entry) => [entry.unitId, entry]));\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { ExtractResult, Manifest, Relation, Unit, Workspace } from \"@glossic/schema\";\nimport { MANIFEST_VERSION, ManifestSchema } from \"@glossic/schema\";\n\nimport { compareStrings, sortBy } from \"./utils/index.js\";\n\nexport const DEFAULT_MANIFEST_PATH = \".glossic/manifest.json\";\n\nexport interface BuildManifestOptions {\n generatedAt?: string;\n}\n\n/** Sorts everything inside one unit, so its hash does not depend on walk order. */\nconst sortUnit = (unit: Unit): Unit => ({\n ...unit,\n facts: {\n ...unit.facts,\n base: {\n ...unit.facts.base,\n files : sortBy(unit.facts.base.files, (file) => file.path),\n languages: [...unit.facts.base.languages].sort(\n (a, b) => b.count - a.count || compareStrings(a.language, b.language),\n ),\n },\n producedBy: [...unit.facts.producedBy].sort(compareStrings),\n },\n});\n\nconst compareRelations = (a: Relation, b: Relation): number => {\n return compareStrings(a.from, b.from) || compareStrings(a.to, b.to) || compareStrings(a.kind, b.kind);\n}\n\n\n/** Assembles the manifest, sorting every list so two runs over the same code match. */\nexport const buildManifest = (workspace: Workspace, results: readonly ExtractResult[], options: BuildManifestOptions = {}): Manifest => {\n const units = results.flatMap((result) => result.units).map(sortUnit);\n const relations = results.flatMap((result) => result.relations);\n\n return ManifestSchema.parse({\n version : MANIFEST_VERSION,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n workspace : {\n ...workspace,\n projects: sortBy(workspace.projects, (project) => project.id),\n },\n units : sortBy(units, (unit) => unit.id),\n relations: [...relations].sort(compareRelations),\n });\n};\n\n/** The manifest as it lands on disk: JSON, two-space indent, trailing newline. */\nexport const serializeManifest = (manifest: Manifest): string => {\n return `${JSON.stringify(manifest, null, 2)}\\n`;\n}\n\n\n/** Writes the manifest, creating its directory. Returns the absolute path written. */\nexport const writeManifest = async (manifest: Manifest, target: string): Promise<string> => {\n const absolute = path.resolve(target);\n\n await fs.mkdir(path.dirname(absolute), { recursive: true });\n await fs.writeFile(absolute, serializeManifest(manifest), \"utf8\");\n \n return absolute;\n};\n\n/** Reads and validates a manifest, or undefined when it is missing or invalid. */\nexport const readManifest = async (target: string): Promise<Manifest | undefined> => {\n try {\n const raw = await fs.readFile(path.resolve(target), \"utf8\");\n return ManifestSchema.parse(JSON.parse(raw));\n } catch {\n return undefined;\n }\n};\n","import path from \"node:path\";\nimport type { Project, Workspace, WorkspaceTool } from \"@glossic/schema\";\nimport { glob } from \"tinyglobby\";\nimport { parse as parseYaml } from \"yaml\";\n\nimport { pathExists, readJson, readText, sortBy, toPosix } from \"./utils/index.js\";\n\ninterface PackageJson {\n name ?: string;\n packageManager?: string;\n workspaces ?: string[] | { packages?: string[] };\n}\n\ninterface MonorepoMarker {\n tool : WorkspaceTool;\n globs: string[];\n}\n\nconst GLOB_IGNORES = [\"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/.git/**\"];\n\nconst LOCKFILE_PACKAGE_MANAGERS: ReadonlyArray<readonly [string, string]> = [\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"],\n [\"composer.lock\", \"composer\"],\n [\"composer.json\", \"composer\"],\n];\n\nconst asStringArray = (value: unknown): string[] =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n\n/** The package manager in use, from the packageManager field or from the lockfile. */\nconst detectPackageManager = async (dir: string, pkg: PackageJson | undefined): Promise<string | undefined> => {\n const declared = pkg?.packageManager;\n\n if (typeof declared === \"string\" && declared.length > 0) {\n const [name] = declared.split(\"@\");\n\n if (name !== undefined && name.length > 0) {\n return name;\n }\n }\n\n for (const [lockfile, manager] of LOCKFILE_PACKAGE_MANAGERS) {\n if (await pathExists(path.join(dir, lockfile))) {\n return manager;\n }\n }\n\n return undefined;\n};\n\n\n/** The monorepo tool and the globs defining its projects, when this repo is one. */\nconst detectMonorepo = async (root: string, pkg: PackageJson | undefined): Promise<MonorepoMarker | undefined> => {\n const pnpmWorkspace = await readText(path.join(root, \"pnpm-workspace.yaml\"));\n\n if (pnpmWorkspace !== undefined) {\n const parsed: unknown = parseYaml(pnpmWorkspace);\n const globs = asStringArray((parsed as { packages?: unknown } | null)?.packages);\n\n if (globs.length > 0) {\n return { tool: \"pnpm\", globs };\n }\n }\n\n const workspaces = Array.isArray(pkg?.workspaces) ? pkg.workspaces : asStringArray(pkg?.workspaces?.packages);\n\n if (workspaces.length > 0) {\n return { tool: \"npm-workspaces\", globs: workspaces };\n }\n\n if (await pathExists(path.join(root, \"turbo.json\"))) {\n return { tool: \"turbo\", globs: [\"apps/*\", \"packages/*\"] };\n }\n\n if (await pathExists(path.join(root, \"nx.json\"))) {\n return { tool: \"nx\", globs: [\"apps/*\", \"libs/*\", \"packages/*\"] };\n }\n\n const lerna = await readJson<{ packages?: unknown }>(path.join(root, \"lerna.json\"));\n\n if (lerna !== undefined) {\n const globs = asStringArray(lerna.packages);\n return { tool: \"lerna\", globs: globs.length > 0 ? globs : [\"packages/*\"] };\n }\n\n return undefined;\n};\n\nconst expandProjectDirs = async (root: string, globs: string[]): Promise<string[]> => {\n const patterns: string[] = [];\n const ignore = [...GLOB_IGNORES];\n\n for (const entry of globs) {\n if (entry.startsWith(\"!\")) {\n ignore.push(`${entry.slice(1)}/**`);\n continue;\n }\n \n patterns.push(`${entry}/package.json`);\n }\n\n if (patterns.length === 0) return [];\n\n const manifests = await glob({\n patterns,\n cwd: root,\n ignore,\n onlyFiles : true,\n followSymbolicLinks: false,\n dot : false,\n });\n\n const dirs = manifests.map((manifest) => toPosix(path.posix.dirname(toPosix(manifest))));\n\n return [...new Set(dirs)].sort();\n};\n\nconst buildProject = async (root: string, rootDir: string, fallbackManager: string | undefined): Promise<Project> => {\n const dir = path.resolve(root, rootDir);\n const pkg = await readJson<PackageJson>(path.join(dir, \"package.json\"));\n const packageManager = (await detectPackageManager(dir, pkg)) ?? fallbackManager;\n const name = pkg?.name ?? path.basename(dir);\n\n const project: Project = {\n id: rootDir === \".\" ? \"root\" : rootDir,\n name,\n rootDir,\n };\n\n return packageManager === undefined ? project : { ...project, packageManager };\n};\n\n\n/** Identifies the repository and lists its projects, monorepo or not. */\nexport const resolveWorkspace = async (root: string): Promise<Workspace> => {\n const absoluteRoot = path.resolve(root);\n const pkg = await readJson<PackageJson>(path.join(absoluteRoot, \"package.json\"));\n const packageManager = await detectPackageManager(absoluteRoot, pkg);\n const name = pkg?.name ?? path.basename(absoluteRoot);\n\n const marker = await detectMonorepo(absoluteRoot, pkg);\n const projectDirs = marker === undefined ? [] : await expandProjectDirs(absoluteRoot, marker.globs);\n\n const isMonorepo = projectDirs.length > 0;\n const rootDirs = isMonorepo ? projectDirs : [\".\"];\n const projects = await Promise.all(\n rootDirs.map((rootDir) => buildProject(absoluteRoot, rootDir, packageManager)),\n );\n\n const workspace: Workspace = {\n name,\n root: toPosix(absoluteRoot),\n isMonorepo,\n tool : isMonorepo && marker !== undefined ? marker.tool: \"none\",\n projects: sortBy(projects, (project) => project.id),\n };\n\n return packageManager === undefined ? workspace : { ...workspace, packageManager };\n};\n","import path from \"node:path\";\n\nimport { GlossicConfigSchema } from \"@glossic/schema\";\nimport type { Adapter, AdapterContext, DiscoverContext, ExtractResult, GlossicConfig, Manifest, Workspace } from \"@glossic/schema\";\n\nimport { buildManifest } from \"./manifest.js\";\nimport { resolveWorkspace } from \"./workspace.js\";\n\n/** What every pipeline stage needs: where to scan, with which adapters and config. */\nexport interface PipelineContext {\n root : string;\n adapters : readonly Adapter[];\n config ?: GlossicConfig;\n generatedAt?: string;\n}\n\nexport interface ScanResult {\n manifest : Manifest;\n workspace : Workspace;\n adapterByProject: Record<string, string>;\n}\n\n\n/** Puts the adapters in the order the config asks for, dropping the ones it omits. */\nexport const orderAdapters = (adapters: readonly Adapter[], wanted: readonly string[]): Adapter[] => {\n const byName = new Map(adapters.map((adapter) => [adapter.name, adapter]));\n\n return wanted\n .map((name) => byName.get(name))\n .filter((adapter): adapter is Adapter => adapter !== undefined);\n};\n\n/** The first adapter that claims the project. */\nconst selectAdapter = async (adapters: readonly Adapter[], ctx: DiscoverContext): Promise<Adapter | undefined> => {\n for (const adapter of adapters) {\n if (await adapter.detect(ctx)) {\n return adapter;\n }\n }\n\n return undefined;\n};\n\n\n/** Walks the workspace and turns it into a manifest, calling no provider. */\nexport const scan = async (ctx: PipelineContext): Promise<ScanResult> => {\n const config = ctx.config ?? GlossicConfigSchema.parse({});\n const workspace = await resolveWorkspace(path.resolve(ctx.root));\n const adapters = orderAdapters(ctx.adapters, config.adapters);\n const adapterContext: AdapterContext = { root: workspace.root, workspace, config };\n\n const results: ExtractResult[] = [];\n const adapterByProject: Record<string, string> = {};\n\n for (const project of workspace.projects) {\n const discoverContext: DiscoverContext = { ...adapterContext, project };\n const adapter = await selectAdapter(adapters, discoverContext);\n\n if (adapter === undefined) continue;\n\n adapterByProject[project.id] = adapter.name;\n\n const units = await adapter.discover(discoverContext);\n \n results.push(await adapter.extract({ ...discoverContext, units }));\n }\n\n const manifest = buildManifest(\n workspace,\n results,\n ctx.generatedAt === undefined ? {} : { generatedAt: ctx.generatedAt },\n );\n\n return { manifest, workspace, adapterByProject };\n};\n","import type { Manifest, Project, Unit } from \"@glossic/schema\";\n\nimport { compareStrings } from \"./utils/index.js\";\n\n/** Where a unit's page goes, relative to the output directory. */\nexport const unitDocPath = (unit: Unit): string => {\n return unit.path === \".\" ? \"root.md\" : `${unit.path}.md`;\n}\n\nexport const INDEX_DOC_PATH = \"index.md\";\n\nconst frontmatter = (entries: ReadonlyArray<readonly [string, string | number]>): string =>\n [\n \"---\",\n ...entries.map(([key, value]) =>\n typeof value === \"number\" ? `${key}: ${value}` : `${key}: ${JSON.stringify(value)}`,\n ),\n \"---\",\n ].join(\"\\n\");\n\nexport interface RenderUnitDocInput {\n unit : Unit;\n project : Project;\n body : string;\n generatedAt: string;\n}\n\n\n/** One unit's page: frontmatter carrying the hash, then the prose the provider wrote. */\nexport const renderUnitDoc = (input: RenderUnitDocInput): string => {\n const { unit } = input;\n const title = unit.name === \"root\" ? input.project.name : unit.name;\n\n const entries: Array<readonly [string, string | number]> = [\n [\"title\", title],\n [\"unit\", unit.id],\n [\"project\", unit.projectId],\n [\"path\", unit.path],\n [\"hash\", unit.hash],\n [\"files\", unit.facts.base.files.length],\n [\"generatedAt\", input.generatedAt],\n ];\n\n if (unit.facts.base.roleHint !== null) {\n entries.splice(4, 0, [\"role\", unit.facts.base.roleHint]);\n }\n\n return [frontmatter(entries), \"\", input.body.trim(), \"\"].join(\"\\n\");\n};\n\nexport interface RenderIndexDocInput {\n manifest : Manifest;\n generatedAt: string;\n}\n\nconst languageSummary = (units: readonly Unit[]): string => {\n const totals = new Map<string, number>();\n\n for (const unit of units) {\n for (const entry of unit.facts.base.languages) {\n totals.set(entry.language, (totals.get(entry.language) ?? 0) + entry.count);\n }\n }\n\n return [...totals.entries()]\n .sort(([aLang, aCount], [bLang, bCount]) => bCount - aCount || compareStrings(aLang, bLang))\n .map(([language, count]) => `${language} (${count})`)\n .join(\", \");\n};\n\n\n/** The index page listing every unit in the workspace. */\nexport const renderIndexDoc = (input: RenderIndexDocInput): string => {\n const { manifest } = input;\n const { workspace, units } = manifest;\n\n const lines: string[] = [\n frontmatter([\n [\"title\", workspace.name],\n [\"generatedAt\", input.generatedAt],\n [\"units\", units.length],\n ]),\n \"\",\n `# ${workspace.name}`,\n \"\",\n workspace.isMonorepo\n ? `${workspace.tool} monorepo with ${workspace.projects.length} projects.`\n : \"Single-project workspace.\",\n \"\",\n ];\n\n for (const project of workspace.projects) {\n const projectUnits = units.filter((unit) => unit.projectId === project.id);\n\n lines.push(`## ${project.name}`, \"\");\n\n if (projectUnits.length === 0) {\n lines.push(\"No documented units.\", \"\");\n continue;\n }\n\n for (const unit of projectUnits) {\n const role = unit.facts.base.roleHint;\n const suffix = role === null ? \"\" : ` — ${role}`;\n\n lines.push(\n `- [${unit.name}](./${unitDocPath(unit)}) — ${unit.facts.base.files.length} files${suffix}`,\n );\n }\n lines.push(\"\");\n }\n\n const languages = languageSummary(units);\n\n if (languages !== \"\") {\n lines.push(`Languages: ${languages}`, \"\");\n }\n\n return lines.join(\"\\n\");\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { Manifest } from \"@glossic/schema\";\nimport { glob } from \"tinyglobby\";\nimport { parse as parseYaml } from \"yaml\";\n\nimport { scan } from \"./scan.js\";\nimport { INDEX_DOC_PATH, unitDocPath } from \"./markdown.js\";\nimport { compareStrings, sortBy, toPosix } from \"./utils/index.js\";\nimport type { PipelineContext } from \"./scan.js\";\n\nexport interface CheckContext extends PipelineContext {\n outDir: string;\n}\n\n/** One unit weighed against its page: the hash expected against the one on disk. */\nexport interface CheckEntry {\n unitId : string;\n docPath : string;\n expectedHash : string;\n documentedHash: string | undefined;\n}\n\nexport interface CheckResult {\n outDir : string;\n upToDate: CheckEntry[];\n missing : CheckEntry[];\n stale : CheckEntry[];\n orphaned: string[];\n ok : boolean;\n}\n\ninterface DocumentFrontmatter {\n unit: string | undefined;\n hash: string | undefined;\n}\n\nconst FRONTMATTER = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n/;\n\n/** The frontmatter of a generated page, empty when the file carries none. */\nexport const readDocFrontmatter = async (file: string): Promise<DocumentFrontmatter> => {\n try {\n const raw = await fs.readFile(file, \"utf8\");\n const match = FRONTMATTER.exec(raw);\n\n if (match === null) {\n return { unit: undefined, hash: undefined };\n }\n\n const parsed: unknown = parseYaml(match[1] ?? \"\");\n \n if (typeof parsed !== \"object\" || parsed === null) {\n return { unit: undefined, hash: undefined };\n }\n\n const record = parsed as Record<string, unknown>;\n\n return {\n unit: typeof record.unit === \"string\" ? record.unit : undefined,\n hash: typeof record.hash === \"string\" ? record.hash : undefined,\n };\n } catch {\n return { unit: undefined, hash: undefined };\n }\n};\n\n/** Every markdown page under the output directory, as posix paths. */\nconst listDocs = async (outDir: string): Promise<string[]> => {\n try {\n const entries = await glob({\n patterns : [\"**/*.md\"],\n cwd : outDir,\n onlyFiles : true,\n followSymbolicLinks: false,\n });\n\n return entries.map(toPosix).sort(compareStrings);\n } catch {\n return [];\n }\n};\n\n\n/**\n * Compares the pages on disk against a fresh scan, calling no provider. This\n * is what a CI job runs to fail on documentation nobody regenerated.\n */\nexport const check = async (ctx: CheckContext): Promise<CheckResult> => {\n const { manifest }: { manifest: Manifest } = await scan(ctx);\n\n const docs = await listDocs(ctx.outDir);\n const expected = new Map(manifest.units.map((unit) => [unitDocPath(unit), unit]));\n\n const upToDate: CheckEntry[] = [];\n const missing : CheckEntry[] = [];\n const stale : CheckEntry[] = [];\n\n for (const unit of manifest.units) {\n const docPath = unitDocPath(unit);\n const entryBase = { unitId: unit.id, docPath, expectedHash: unit.hash };\n\n if (!docs.includes(docPath)) {\n missing.push({ ...entryBase, documentedHash: undefined });\n continue;\n }\n\n const { hash } = await readDocFrontmatter(path.resolve(ctx.outDir, docPath));\n\n if (hash === unit.hash) {\n upToDate.push({ ...entryBase, documentedHash: hash });\n } else {\n stale.push({ ...entryBase, documentedHash: hash });\n }\n }\n\n const orphaned = docs\n .filter((doc) => doc !== INDEX_DOC_PATH && !expected.has(doc))\n .sort(compareStrings);\n\n const byUnitId = (entries: CheckEntry[]): CheckEntry[] => {\n return sortBy(entries, (entry) => entry.unitId);\n }\n\n return {\n outDir : toPosix(ctx.outDir),\n upToDate: byUnitId(upToDate),\n missing : byUnitId(missing),\n stale : byUnitId(stale),\n orphaned,\n ok: missing.length === 0 && stale.length === 0 && orphaned.length === 0,\n };\n};\n","import path from \"node:path\";\n\nimport { createJiti } from \"jiti\";\nimport { GlossicConfigSchema } from \"@glossic/schema\";\nimport type { GlossicUserConfig } from \"@glossic/schema\";\n\nimport { pathExists, toPosix } from \"./utils/index.js\";\n\n/** Config filenames, in the order they are looked for. */\nexport const CONFIG_FILENAMES = [\n \"glossic.config.ts\",\n \"glossic.config.mts\",\n \"glossic.config.js\",\n \"glossic.config.mjs\",\n];\n\n\n/** Posix path of the project's config file, when it has one. */\nexport const findConfigFile = async (root: string): Promise<string | undefined> => {\n for (const filename of CONFIG_FILENAMES) {\n const candidate = path.resolve(root, filename);\n if (await pathExists(candidate)) {\n return toPosix(candidate);\n }\n }\n\n return undefined;\n};\n\n/** The project has no config file at all. */\nexport interface MissingConfig {\n status: \"missing\";\n}\n\n/** The file is there but unusable, and `error` is the reason to put in front of the user. */\nexport interface FailedConfig {\n status: \"failed\";\n file : string;\n error : string;\n}\n\n/** `values` carries only the keys the file actually set, so a no-op config leaves it empty. */\nexport interface LoadedConfig {\n status: \"loaded\";\n file : string;\n values: GlossicUserConfig;\n}\n\n/** The three things a config file can be, so a missing file never reads as a broken one. */\nexport type ProjectConfig = MissingConfig | FailedConfig | LoadedConfig;\n\n/** The reason ends up on one terminal line, so the stack and the rest of the message go. */\nconst describeError = (cause: unknown): string => {\n const message = cause instanceof Error ? cause.message : String(cause);\n\n return message.split(\"\\n\")[0]?.trim() || \"unknown error\";\n};\n\n/** The module's default export as a config, or why it is not one. */\nconst readDefaultExport = (file: string, value: unknown): FailedConfig | LoadedConfig => {\n const parsed = GlossicConfigSchema.partial().safeParse(value);\n\n if (!parsed.success) {\n const error = parsed.error.issues\n .map((issue) =>\n issue.path.length === 0 ? issue.message : `${issue.path.join(\".\")}: ${issue.message}`,\n )\n .join(\"; \");\n\n return { status: \"failed\", file, error };\n }\n\n const declared = Object.keys(value as Record<string, unknown>);\n\n const values = Object.fromEntries(\n Object.entries(parsed.data).filter(([key]) => declared.includes(key)),\n ) as GlossicUserConfig;\n\n return { status: \"loaded\", file, values };\n};\n\n\n/** Never throws: a config that cannot be loaded is reported as such, not hidden. */\nexport const loadProjectConfig = async (root: string): Promise<ProjectConfig> => {\n const file = await findConfigFile(root);\n\n if (file === undefined) {\n return { status: \"missing\" };\n }\n\n try {\n const jiti = createJiti(import.meta.url, { moduleCache: false });\n const loaded = await jiti.import(file, { default: true });\n\n return readDefaultExport(file, loaded);\n } catch (cause) {\n return { status: \"failed\", file, error: describeError(cause) };\n }\n};\n","import type { GlossicConfig, GlossicUserConfig, ListOverride, ListOverrides } from \"@glossic/schema\";\nimport { ADDITIVE_LIST_KEYS, applyListOverride, GlossicConfigSchema, LIST_DEFAULTS } from \"@glossic/schema\";\n\n/** Which source decided one option's value; `glossic doctor` prints it. */\nexport type ConfigOrigin = \"flag\" | \"project\" | \"preference\" | \"default\";\n\nexport type ConfigOrigins = Record<string, ConfigOrigin>;\n\nexport interface ConfigSources {\n flags ?: GlossicUserConfig | undefined;\n project ?: GlossicUserConfig | undefined;\n preference?: GlossicUserConfig | undefined;\n}\n\nexport interface ResolvedConfig {\n config : GlossicConfig;\n origins: ConfigOrigins;\n lists : ListOverrides;\n}\n\nconst ORDER: ReadonlyArray<[\"flag\" | \"project\" | \"preference\", keyof ConfigSources]> = [\n [\"flag\", \"flags\"],\n [\"project\", \"project\"],\n [\"preference\", \"preference\"],\n];\n\nconst isSet = (value: unknown): boolean => {\n return value !== undefined && !(typeof value === \"string\" && value.trim() === \"\");\n}\n\nconst entriesFor = (merged: Record<string, unknown>, key: string): readonly string[] | undefined => {\n const value = merged[key];\n\n return Array.isArray(value) ? (value as string[]) : undefined;\n};\n\n\n/**\n * Merges the sources under one precedence chain (flags, project config, saved\n * preference, schema defaults) and records which one won each key.\n *\n * `exclude`, `ignoreUnits` and `excludeFromContent` are folded into their\n * defaults rather than replacing them, so adding one pattern does not silently\n * cost the other twenty-nine. This is the only place that happens: the schema\n * keeps the raw entries so a caller can still report what a config changed.\n */\nexport const resolveConfig = (sources: ConfigSources = {}): ResolvedConfig => {\n const merged : Record<string, unknown> = {};\n const origins: ConfigOrigins = {};\n\n for (const [origin, key] of [...ORDER].reverse()) {\n const source = sources[key];\n\n if (source === undefined) continue;\n\n for (const [name, value] of Object.entries(source)) {\n if (!isSet(value)) continue;\n\n merged[name] = value;\n origins[name] = origin;\n }\n }\n\n const lists = {} as Record<string, ListOverride>;\n\n for (const key of ADDITIVE_LIST_KEYS) {\n const override = applyListOverride(LIST_DEFAULTS[key], entriesFor(merged, key));\n\n lists[key] = override;\n merged[key] = [...override.value];\n }\n\n const config = GlossicConfigSchema.parse(merged);\n\n for (const name of Object.keys(config)) {\n origins[name] ??= \"default\";\n }\n\n return { config, origins, lists: lists as ListOverrides };\n};\n","/** Placeholder for a code path that is scaffolded but not written yet. */\nexport class NotImplementedError extends Error {\n constructor(what: string) {\n super(`${what} is not implemented`);\n this.name = \"NotImplementedError\";\n }\n}\n\n\n/**\n * Nothing on this machine can write prose. The message is the install\n * instructions, because this is the first wall a new user hits.\n */\nexport class NoProviderAvailableError extends Error {\n readonly tried: string[];\n\n constructor(tried: readonly string[]) {\n super(\n [\n \"No LLM provider is available.\",\n \"\",\n \"glossic needs one of these two:\",\n \"\",\n \" 1. Claude Code — install the CLI and sign in:\",\n \" https://claude.com/claude-code\",\n \" glossic picks it up as soon as `claude --version` works.\",\n \"\",\n \" 2. Anthropic API — export an API key:\",\n \" export ANTHROPIC_API_KEY=sk-ant-...\",\n \" https://console.anthropic.com/settings/keys\",\n \"\",\n \"Run `glossic doctor` to see what glossic can find on this machine.\",\n ].join(\"\\n\"),\n );\n this.name = \"NoProviderAvailableError\";\n this.tried = [...tried];\n }\n}\n\n/** The provider named by a flag or by the config does not exist. */\nexport class UnknownProviderError extends Error {\n constructor(requested: string, known: readonly string[]) {\n super(`unknown provider \"${requested}\". Available: ${[...known].sort().join(\", \")}`);\n this.name = \"UnknownProviderError\";\n }\n}\n","import { isRetryableProviderError } from \"@glossic/schema\";\n\n/** `sleep` and `onRetry` exist so a test can drive the loop without waiting. */\nexport interface RetryOptions {\n attempts ?: number;\n baseDelayMs?: number;\n sleep ?: (ms: number) => Promise<void>;\n onRetry ?: (attempt: number, error: unknown) => void;\n}\n\nconst DEFAULT_ATTEMPTS = 3;\nconst DEFAULT_BASE_DELAY_MS = 500;\n\nconst defaultSleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => {\n setTimeout(resolve, ms).unref?.();\n });\n}\n\n\n/** Exponential backoff: the delay doubles with every attempt. */\nexport const backoffDelay = (attempt: number, baseDelayMs: number): number => {\n return baseDelayMs * 2 ** (attempt - 1);\n}\n\n\n/** Runs a task again while it fails with a retryable provider error. */\nexport const withRetry = async <T>(task: () => Promise<T>, options: RetryOptions = {}): Promise<T> => {\n const attempts = options.attempts ?? DEFAULT_ATTEMPTS;\n const baseDelayMs = options.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;\n const sleep = options.sleep ?? defaultSleep;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n try {\n return await task();\n } catch (error) {\n lastError = error;\n\n if (attempt === attempts || !isRetryableProviderError(error)) {\n throw error;\n }\n\n options.onRetry?.(attempt, error);\n\n await sleep(backoffDelay(attempt, baseDelayMs));\n }\n }\n\n throw lastError;\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { CompletionRequest, Project, Unit } from \"@glossic/schema\";\nimport { compareStrings } from \"./utils/index.js\";\n\n/** A file longer than this is truncated before it goes into a prompt. */\nexport const MAX_FILE_BYTES = 24_000;\n\nconst CHARS_PER_TOKEN = 4;\n\nexport interface UnitSource {\n path : string;\n language : string;\n content : string;\n truncated: boolean;\n}\n\nexport interface BuildPromptInput {\n unit : Unit;\n project : Project;\n workspaceName : string;\n sources : readonly UnitSource[];\n lang : string;\n model ?: string | undefined;\n temperature ?: number | undefined;\n}\n\n\n/** Bumped by hand when the prompt changes, which invalidates every cached unit. */\nexport const PROMPT_VERSION = \"4\";\n\n/** The rules the model is held to; assertDocumentContent checks the answer against them. */\nexport const SYSTEM_PROMPT = [\n \"You are a technical writer documenting a codebase for the engineers who work on it.\",\n \"\",\n \"You are given one unit of code: a directory, its extracted facts and the full\",\n \"content of its source files. Write reference documentation for that unit.\",\n \"\",\n \"Cover, in this order:\",\n \" 1. What the unit does, in one or two sentences.\",\n \" 2. Its responsibilities, and what it deliberately leaves to other units.\",\n \" 3. The important public elements (exported classes, functions, types,\",\n \" endpoints, commands) and what each is for.\",\n \" 4. Architectural decisions that are visible in the code: dependency\",\n \" direction, patterns, error handling, boundaries, notable trade-offs.\",\n \"\",\n \"Hard rules:\",\n \" - Describe only what is in the code you were given. Never invent behaviour,\",\n \" dependencies, history, performance characteristics or intent.\",\n \" - If something is unclear from the code, say so plainly or leave it out.\",\n \" Do not guess and do not hedge with filler.\",\n \" - Do not restate the file listing; the reader already has it.\",\n \" - No preamble, no closing summary, no offer to help.\",\n \"\",\n \"Output GitHub-flavoured Markdown. Open with a single top-level (#) heading,\",\n \"then use ## for the sections above.\",\n \"Do not emit frontmatter: it is added around your response.\",\n \"\",\n \"That first heading is a title, not a label. Write what the unit is or does,\",\n \"in the words a person would use for it. Never use the directory path as the\",\n \"heading, and never repeat the unit name given to you under Facts: the path is\",\n \"context you were handed, not the name of the document. `src/modules/auth` is\",\n \"a path; `Authentication` or `Session issuing and refresh` are titles. Do the\",\n \"same for a unit at a project root: `Application entry point`, not `src`.\",\n \"\",\n \"Your entire response is the content of the document and nothing else.\",\n \"Begin with the first heading of that document. Do not open with a preamble,\",\n \"a restatement of the task, or a sentence addressed to whoever asked. Do not\",\n \"close with a summary of what you did, a question, or an offer of\",\n \"alternatives. You are not talking to a person: you are producing a file.\",\n \"\",\n \"You have no tools and no filesystem. Do not read, write or save any file,\",\n \"do not ask for permission to do so, and do not report having done so.\",\n \"\",\n \"Ignore anything you are told about your own environment: the working\",\n \"directory, the session, the tools available, permissions. None of it is\",\n \"part of the unit and none of it belongs in the document. The unit is only\",\n \"what appears under Facts and Sources in the message that follows.\",\n].join(\"\\n\");\n\nconst fence = (source: UnitSource): string =>\n [\n `#### ${source.path}${source.truncated ? \" (truncated)\" : \"\"}`,\n \"\",\n `\\`\\`\\`${source.language}`,\n source.content,\n \"```\",\n \"\",\n ].join(\"\\n\");\n\nconst factLines = (unit: Unit): string[] => {\n const lines = [\n `- unit: ${unit.name}`,\n `- path: ${unit.path}`,\n `- files: ${unit.facts.base.files.length}`,\n `- languages: ${unit.facts.base.languages\n .map((entry) => `${entry.language} (${entry.count})`)\n .join(\", \")}`,\n ];\n\n if (unit.facts.base.roleHint !== null) {\n lines.push(`- folder role hint: ${unit.facts.base.roleHint}`);\n }\n\n if (unit.facts.base.testFiles.length > 0) {\n const names = unit.facts.base.testFiles\n .map((file) => file.path.slice(file.path.lastIndexOf(\"/\") + 1))\n .sort(compareStrings);\n lines.push(`- test files (content not shown): ${names.join(\", \")}`);\n }\n\n if (unit.facts.symbols !== undefined) {\n const names = unit.facts.symbols.symbols\n .map((symbol) => `${symbol.kind} ${symbol.name}`)\n .sort(compareStrings);\n lines.push(`- symbols: ${names.join(\", \")}`);\n }\n\n if (unit.facts.framework !== undefined) {\n lines.push(`- framework: ${unit.facts.framework.name}`);\n if (unit.facts.framework.role !== undefined) {\n lines.push(`- framework role: ${unit.facts.framework.role}`);\n }\n }\n\n return lines;\n};\n\n\n/** Turns a unit and its sources into the one request a provider will answer. */\nexport const buildUnitPrompt = (input: BuildPromptInput): CompletionRequest => {\n const prompt = [\n `Workspace: ${input.workspaceName}`,\n `Project: ${input.project.name} (${input.project.rootDir})`,\n \"\",\n \"## Facts\",\n \"\",\n ...factLines(input.unit),\n \"\",\n \"## Sources\",\n \"\",\n ...input.sources.map(fence),\n `Write the documentation in ${input.lang}.`,\n ].join(\"\\n\");\n\n return {\n system: SYSTEM_PROMPT,\n prompt,\n ...(input.model === undefined ? {} : { model: input.model }),\n ...(input.temperature === undefined ? {} : { temperature: input.temperature }),\n metadata: { unitId: input.unit.id, projectId: input.unit.projectId },\n };\n};\n\n\n/** Reads a unit's documentable files, truncating any that run too long. */\nexport const readUnitSources = async (root: string, unit: Unit): Promise<UnitSource[]> => {\n const sources = await Promise.all(\n unit.facts.base.files.map(async (file): Promise<UnitSource> => {\n const raw = await fs.readFile(path.resolve(root, file.path), \"utf8\");\n const truncated = raw.length > MAX_FILE_BYTES;\n\n return {\n path : file.path,\n language: file.language,\n content : truncated ? raw.slice(0, MAX_FILE_BYTES): raw,\n truncated,\n };\n }),\n );\n\n return sources;\n};\n\n\n/** Rough token count, for the estimate a dry run prints before anything is spent. */\nexport const estimateTokens = (request: CompletionRequest): number => {\n return Math.ceil(((request.system?.length ?? 0) + request.prompt.length) / CHARS_PER_TOKEN);\n}\n","/** Maps over items with at most `limit` tasks in flight, preserving input order. */\nexport const mapWithConcurrency = async <T, R>(items: readonly T[], limit: number, task: (item: T) => Promise<R>): Promise<R[]> => {\n const results = new Array<R>(items.length);\n let cursor = 0;\n\n const worker = async (): Promise<void> => {\n while (cursor < items.length) {\n const index = cursor;\n \n cursor += 1;\n\n const item = items[index];\n\n if (item === undefined) continue;\n\n results[index] = await task(item);\n }\n };\n\n await Promise.all(Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, worker));\n return results;\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { CompletionRequest, GlossicConfig, Manifest, Project, Unit } from \"@glossic/schema\";\n\nimport { unitDocPath } from \"../markdown.js\";\nimport { buildUnitPrompt, estimateTokens, readUnitSources } from \"../prompt.js\";\n\n/** One unit ready to be sent: its prompt built and its destination known. */\nexport interface Job {\n unit : Unit;\n project : Project;\n request : CompletionRequest;\n docPath : string;\n estimatedTokens: number;\n}\n\n\n/** Writes a page under the output directory, creating the directories it needs. */\nexport const writeDoc = async (outDir: string, relative: string, content: string): Promise<void> => {\n const target = path.resolve(outDir, relative);\n\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, content, \"utf8\");\n};\n\n\n/** Reads the sources and builds a prompt for every unit in the manifest. */\nexport const buildJobs = async (manifest: Manifest, config: GlossicConfig, root: string): Promise<Job[]> => {\n const projectById = new Map(manifest.workspace.projects.map((entry) => [entry.id, entry]));\n\n const jobs = await Promise.all(\n manifest.units.map(async (unit): Promise<Job | undefined> => {\n const project = projectById.get(unit.projectId);\n\n if (project === undefined) {\n return undefined;\n }\n\n const request = buildUnitPrompt({\n unit,\n project,\n workspaceName: manifest.workspace.name,\n sources : await readUnitSources(root, unit),\n lang : config.lang,\n model : config.model,\n temperature : config.temperature,\n });\n\n return {\n unit,\n project,\n request,\n docPath : unitDocPath(unit),\n estimatedTokens: estimateTokens(request),\n };\n }),\n );\n\n return jobs.filter((job): job is Job => job !== undefined);\n};\n","import path from \"node:path\";\n\nimport type { GlossicConfig } from \"@glossic/schema\";\n\nimport { PROMPT_VERSION } from \"../prompt.js\";\nimport { pathExists } from \"../utils/index.js\";\nimport type { Job } from \"./jobs.js\";\nimport type { CacheEntry } from \"../cache.js\";\nimport type { GenerateReason } from \"./types.js\";\n\n/** The model a cache entry was written under, with a name for the unset case. */\nexport const modelCacheKey = (config: GlossicConfig): string => config.model ?? \"default\";\n\nexport interface DecisionContext {\n outDir: string;\n model : string;\n lang : string;\n force : boolean;\n}\n\n/** Why this unit has to be regenerated, or `cached` when nothing changed. */\nexport const decide = async (job: Job, entry: CacheEntry | undefined, context: DecisionContext): Promise<GenerateReason> => {\n if (context.force) {\n return \"forced\";\n }\n\n if (entry === undefined) {\n return \"new\";\n }\n\n if (entry.unitHash !== job.unit.hash) {\n return \"content-changed\";\n }\n\n if (entry.promptVersion !== PROMPT_VERSION) {\n return \"prompt-version-changed\";\n }\n\n if (entry.model !== context.model) {\n return \"model-changed\";\n }\n\n if (entry.lang !== context.lang) {\n return \"lang-changed\";\n }\n\n if (!(await pathExists(path.resolve(context.outDir, job.docPath)))) {\n return \"output-missing\";\n }\n\n return \"cached\";\n};\n","import { ProviderError } from \"@glossic/schema\";\n\n/** Under this many characters the answer reads as a refusal, not as a document. */\nexport const MIN_DOCUMENT_LENGTH = 200;\n/** Over this, what precedes the first heading is an answer rather than a preamble. */\nexport const MAX_PREAMBLE_LENGTH = 500;\n\ninterface ContentRule {\n reason : string;\n pattern: RegExp;\n}\n\n/** Shapes that mean the model addressed the reader instead of writing the document. */\nconst CONVERSATIONAL_RULES: readonly ContentRule[] = [\n {\n reason : \"the model asked for permission instead of writing the document\",\n pattern:\n /\\b(permission to (write|save|create)|(write|read) permission|need (write )?access)\\b/i,\n },\n {\n reason : \"the model reported on saving a file instead of writing the document\",\n pattern:\n /\\bI( have|['’]ve)? ?(drafted|prepared|written|created|saved|generated) (the|this|a) /i,\n },\n {\n reason : \"the model asked the reader a question\",\n pattern: /\\b(let me know|say the word|shall I|would you (like|prefer|want))\\b/i,\n },\n {\n reason : \"the model opened with a preamble instead of the document\",\n pattern: /^\\s*(here(['’]s| is)|below is|sure[,!]|certainly[,!]|I['’]ll)\\b/i,\n },\n {\n reason : \"the model addressed the reader in the first person\",\n pattern: /\\bI['’](ve|m|ll|d)\\b/,\n },\n {\n reason : \"the model addressed the reader in the first person\",\n pattern: /\\bI (need|cannot|can't|could not|couldn't|have|am|was|tried|noticed|assume)\\b/,\n },\n];\n\nconst FENCE = /^\\s{0,3}(```|~~~)/;\nconst TOP_HEADING = /^\\s{0,3}#{1,2}\\s+\\S/;\n\ninterface SourceLine {\n text : string;\n fenced: boolean;\n}\n\n/** Lines tagged with whether they sit inside a fenced code block. */\nconst scanLines = (text: string): SourceLine[] => {\n const lines: SourceLine[] = [];\n let fence: string | undefined;\n\n for (const line of text.split(/\\r?\\n/)) {\n const match = FENCE.exec(line);\n\n if (fence === undefined) {\n if (match !== null) {\n fence = match[1];\n }\n\n lines.push({ text: line, fenced: match !== null });\n\n continue;\n }\n\n lines.push({ text: line, fenced: true });\n\n if (match !== null && match[1] === fence) {\n fence = undefined;\n }\n }\n\n return lines;\n};\n\nexport interface NormalizedDocument {\n body : string;\n preamble: string | undefined;\n}\n\nconst invalidContent = (providerName: string, reason: string, detail: string): ProviderError =>\n new ProviderError({\n provider: providerName,\n code : \"invalid-content\",\n message : `the response is not a document: ${reason}`,\n detail,\n });\n\n/** Shortens text for an error message, onto a single line. */\nexport const excerpt = (text: string, limit: number): string => {\n const flat = text.replace(/\\s+/g, \" \").trim();\n return flat.length <= limit ? flat : `${flat.slice(0, limit - 1)}…`;\n};\n\n/** Splits a response into the document and whatever the model said before it. */\nexport const normalizeDocument = (providerName: string, text: string): NormalizedDocument => {\n const lines = scanLines(text);\n const first = lines.findIndex((line) => !line.fenced && TOP_HEADING.test(line.text));\n\n if (first === -1) {\n throw invalidContent(\n providerName,\n \"it contains no markdown heading\",\n excerpt(text, 120) || \"(empty)\",\n );\n }\n\n const dropped = lines\n .slice(0, first)\n .map((line) => line.text)\n .join(\"\\n\")\n .trim();\n\n if (dropped.length > MAX_PREAMBLE_LENGTH) {\n throw invalidContent(\n providerName,\n `${dropped.length} characters of prose precede the first heading, over the ${MAX_PREAMBLE_LENGTH} limit`,\n excerpt(dropped, 120),\n );\n }\n\n const body = lines\n .slice(first)\n .map((line) => line.text)\n .join(\"\\n\")\n .trim();\n\n return { body, preamble: dropped === \"\" ? undefined : dropped };\n};\n\nexport interface ContentProblem {\n reason : string;\n excerpt: string;\n}\n\nconst excerptAround = (text: string, index: number): string => {\n const start = Math.max(0, index - 30);\n return excerpt(text.slice(start, Math.min(text.length, index + 90)), 200);\n};\n\n/** The first conversational tell in the text, ignoring fenced code. */\nexport const findContentProblem = (text: string): ContentProblem | undefined => {\n const trimmed = text.trim();\n\n if (trimmed.length < MIN_DOCUMENT_LENGTH) {\n return {\n reason : `the response is ${trimmed.length} characters, below the ${MIN_DOCUMENT_LENGTH} minimum`,\n excerpt: excerpt(trimmed, 120),\n };\n }\n\n for (const rule of CONVERSATIONAL_RULES) {\n const match = rule.pattern.exec(trimmed);\n\n if (match !== null) {\n return { reason: rule.reason, excerpt: excerptAround(trimmed, match.index) };\n }\n }\n\n return undefined;\n};\n\n/** Throws a ProviderError when the response reads as conversation, not documentation. */\nexport const assertDocumentContent = (providerName: string, text: string): void => {\n const problem = findContentProblem(text);\n\n if (problem === undefined) return;\n\n throw invalidContent(providerName, problem.reason, problem.excerpt);\n};\n\nexport interface PreparedDocument {\n body : string;\n droppedPreamble: string | undefined;\n}\n\n/** Normalises and validates in one pass: what generate writes is what survives this. */\nexport const prepareDocument = (providerName: string, text: string): PreparedDocument => {\n const { body, preamble } = normalizeDocument(providerName, text);\n assertDocumentContent(providerName, body);\n\n return { body, droppedPreamble: preamble };\n};\n","import path from \"node:path\";\n\nimport picomatch from \"picomatch\";\nimport { GlossicConfigSchema, isFatalProviderError } from \"@glossic/schema\";\nimport type { Manifest, Unit } from \"@glossic/schema\";\n\nimport { scan } from \"../scan.js\";\nimport { withRetry } from \"../retry.js\";\nimport { PROMPT_VERSION } from \"../prompt.js\";\nimport { mapWithConcurrency } from \"../utils/concurrency.js\";\nimport { buildJobs, writeDoc } from \"./jobs.js\";\nimport { decide, modelCacheKey } from \"./decide.js\";\nimport { compareStrings, toPosix } from \"../utils/index.js\";\nimport { excerpt, prepareDocument } from \"../validate.js\";\nimport { INDEX_DOC_PATH, renderIndexDoc, renderUnitDoc } from \"../markdown.js\";\nimport { type CacheEntry, type CacheFile, DEFAULT_CACHE_PATH, emptyCache, indexCache, readCache, writeCache } from \"../cache.js\";\nimport type { Job } from \"./jobs.js\";\nimport type { DecisionContext } from \"./decide.js\";\nimport type { GenerateAbort, GenerateContext, GenerateEvent, GenerateFailure, GeneratePlanEntry, GenerateReason, GenerateResult, GenerateWarning, PlanReview, UnitOutcome } from \"./types.js\";\n\nexport * from \"./types.js\";\nexport { modelCacheKey } from \"./decide.js\";\n\n\n/** Relative to the root and posix, because the manifest travels between machines. */\nconst docsDirOf = (root: string, outDir: string): string => {\n const relative = toPosix(path.relative(root, outDir));\n\n return relative === \"\" ? \".\" : relative;\n};\n\n\n/** A job and what was decided about it, which is what every summary is built from. */\ninterface Decision {\n job : Job;\n reason: GenerateReason;\n}\n\n/** The parts of a result that depend on which units a run ended up keeping. */\ninterface PlanSummary {\n plan : GeneratePlanEntry[];\n estimatedTokens: number;\n savedTokens : number;\n fromCache : number;\n}\n\n/**\n * The plan grouped by project, in the manifest's own project order so the\n * numbers line up with what `glossic scan` printed. A project the plan has no\n * unit for is left out: there is nothing to offer the reader about it.\n */\nconst reviewOf = (decisions: readonly Decision[], manifest: Manifest): PlanReview => {\n const projects = manifest.workspace.projects\n .map((project) => {\n const own = decisions.filter(({ job }) => job.unit.projectId === project.id);\n\n return {\n id : project.id,\n name : project.name,\n pending : own.filter(({ reason }) => reason !== \"cached\").length,\n cached : own.filter(({ reason }) => reason === \"cached\").length,\n estimatedTokens: own\n .filter(({ reason }) => reason !== \"cached\")\n .reduce((sum, { job }) => sum + job.estimatedTokens, 0),\n };\n })\n .filter((project) => project.pending + project.cached > 0);\n\n return {\n pending : projects.reduce((sum, project) => sum + project.pending, 0),\n cached : projects.reduce((sum, project) => sum + project.cached, 0),\n estimatedTokens: projects.reduce((sum, project) => sum + project.estimatedTokens, 0),\n projects,\n };\n};\n\n\n/** One string field off an unknown error cause, for the failure report. */\nconst stringField = (cause: unknown, field: string): string | undefined => {\n if (typeof cause !== \"object\" || cause === null || !(field in cause)) {\n return undefined;\n }\n\n const value = (cause as Record<string, unknown>)[field];\n\n return typeof value === \"string\" ? value : undefined;\n};\n\n\nexport const generate = async (ctx: GenerateContext): Promise<GenerateResult> => {\n const config = ctx.config ?? GlossicConfigSchema.parse({});\n const scanned = await scan(ctx);\n const generatedAt = scanned.manifest.generatedAt;\n const root = scanned.manifest.workspace.root;\n const manifest = { ...scanned.manifest, docsDir: docsDirOf(root, ctx.outDir) };\n\n const cachePath = ctx.cachePath ?? path.resolve(root, DEFAULT_CACHE_PATH);\n const model = modelCacheKey(config);\n const previous = await readCache(cachePath);\n const previousEntries = indexCache(previous);\n\n const allJobs = await buildJobs(manifest, config, root);\n\n const matches = ctx.only === undefined ? undefined : picomatch(ctx.only);\n\n const isSelected = (job: Job): boolean =>\n matches === undefined ||\n matches(job.unit.id) ||\n matches(job.unit.name) ||\n matches(job.unit.path);\n\n const selected = allJobs.filter(isSelected);\n const filteredOut = allJobs\n .filter((job) => !isSelected(job))\n .map((job) => job.unit.id)\n .sort(compareStrings);\n\n const decisionContext: DecisionContext = {\n outDir: ctx.outDir,\n model,\n lang : config.lang,\n force: ctx.force === true,\n };\n\n const decisions = await Promise.all(\n selected.map(async (job) => ({\n job,\n reason: await decide(job, previousEntries.get(job.unit.id), decisionContext),\n })),\n );\n\n const summarise = (entries: readonly Decision[]): PlanSummary => {\n const plan = entries\n .map(({ job, reason }) => ({\n unitId : job.unit.id,\n docPath : job.docPath,\n files : job.unit.facts.base.files.length,\n estimatedTokens: job.estimatedTokens,\n reason,\n regenerate: reason !== \"cached\",\n }))\n .sort((a, b) => compareStrings(a.unitId, b.unitId));\n\n const sumTokens = (regenerate: boolean): number => plan\n .filter((entry) => entry.regenerate === regenerate)\n .reduce((sum, entry) => sum + entry.estimatedTokens, 0);\n\n return {\n plan,\n estimatedTokens: sumTokens(true),\n savedTokens : sumTokens(false),\n fromCache : plan.filter((entry) => !entry.regenerate).length,\n };\n };\n\n if (ctx.dryRun === true || ctx.provider === undefined) {\n const whole = summarise(decisions);\n\n return {\n manifest,\n written: [],\n plan : whole.plan,\n failures: [],\n warnings: [],\n filteredOut,\n skipped: [],\n aborted: undefined,\n estimatedTokens: whole.estimatedTokens,\n savedTokens : whole.savedTokens,\n generated : 0,\n fromCache : whole.fromCache,\n dryRun : true,\n };\n }\n\n // The review sees the whole plan and answers with the projects to keep, so a\n // workspace nobody wants to pay for in one go can be done a project at a time.\n const requested = ctx.reviewPlan === undefined\n ? ctx.projects\n : (await ctx.reviewPlan(reviewOf(decisions, manifest))) ?? ctx.projects;\n\n const inScope = requested === undefined\n ? decisions\n : decisions.filter(({ job }) => requested.includes(job.unit.projectId));\n\n const outOfScope = requested === undefined\n ? []\n : decisions\n .filter(({ job }) => !requested.includes(job.unit.projectId))\n .map(({ job }) => job.unit.id);\n\n const { plan, estimatedTokens, savedTokens, fromCache } = summarise(inScope);\n\n const scopedFilteredOut = [...filteredOut, ...outOfScope].sort(compareStrings);\n\n const provider = ctx.provider;\n const failures: GenerateFailure[] = [];\n const warnings: GenerateWarning[] = [];\n const summaries = new Map<string, string>();\n const pending = inScope.filter(({ reason }) => reason !== \"cached\");\n\n // Set by the first fatal failure. Units already in flight run to the end;\n // every unit still queued is skipped rather than sent to a provider that has\n // just said it has nothing left to answer with.\n const skipped: string[] = [];\n let aborted: GenerateAbort | undefined;\n\n const total = inScope.length;\n let completed = 0;\n\n const report = (event: GenerateEvent): void => ctx.onEvent?.(event);\n\n const finished = (unitId: string, outcome: UnitOutcome, durationMs: number): void => {\n completed += 1;\n report({ type: \"unit-done\", unitId, index: completed, total, outcome, durationMs });\n };\n\n for (const { job } of inScope.filter(({ reason }) => reason === \"cached\")) {\n report({ type: \"unit-start\", unitId: job.unit.id, index: completed + 1, total });\n finished(job.unit.id, \"cached\", 0);\n }\n\n const outcomes = await mapWithConcurrency(pending, config.concurrency, async ({ job }) => {\n if (aborted !== undefined) {\n skipped.push(job.unit.id);\n return undefined;\n }\n\n const startedAt = Date.now();\n report({ type: \"unit-start\", unitId: job.unit.id, index: completed + 1, total });\n\n try {\n const completion = await withRetry(() => provider.complete(job.request), ctx.retry);\n\n const prepared = prepareDocument(provider.name, completion.text);\n\n if (prepared.droppedPreamble !== undefined) {\n warnings.push({\n unitId : job.unit.id,\n dropped: prepared.droppedPreamble.length,\n excerpt: excerpt(prepared.droppedPreamble, 120),\n });\n }\n\n finished(job.unit.id, \"generated\", Date.now() - startedAt);\n return { job, body: prepared.body };\n } catch (cause) {\n const failure: GenerateFailure = {\n unitId: job.unit.id,\n reason: cause instanceof Error ? cause.message: String(cause),\n code : stringField(cause, \"code\"),\n detail: stringField(cause, \"detail\"),\n };\n\n failures.push(failure);\n\n if (aborted === undefined && isFatalProviderError(cause)) {\n aborted = {\n unitId : failure.unitId,\n code : failure.code ?? \"unknown\",\n reason : failure.reason,\n remaining: 0,\n };\n }\n\n finished(job.unit.id, \"failed\", Date.now() - startedAt);\n return undefined;\n }\n });\n\n if (aborted !== undefined) {\n aborted = { ...aborted, remaining: skipped.length };\n }\n\n // Everything that did come back is written and cached before returning, so a\n // second run picks up at the unit the first one stopped on.\n const written: string[] = [];\n const fresh: CacheEntry[] = [];\n\n for (const outcome of outcomes) {\n if (outcome === undefined) continue;\n\n await writeDoc(\n ctx.outDir,\n outcome.job.docPath,\n renderUnitDoc({\n unit : outcome.job.unit,\n project: outcome.job.project,\n body : outcome.body,\n generatedAt,\n }),\n );\n\n written.push(toPosix(outcome.job.docPath));\n summaries.set(outcome.job.unit.id, outcome.body);\n fresh.push({\n unitId : outcome.job.unit.id,\n unitHash : outcome.job.unit.hash,\n promptVersion: PROMPT_VERSION,\n model,\n lang : config.lang,\n outputPath: outcome.job.docPath,\n generatedAt,\n });\n }\n\n const merged = new Map(previousEntries);\n\n for (const entry of fresh) {\n merged.set(entry.unitId, entry);\n }\n\n const liveUnitIds = new Set(manifest.units.map((unit) => unit.id));\n\n const nextCache: CacheFile = {\n version: emptyCache().version,\n entries: [...merged.values()].filter((entry) => liveUnitIds.has(entry.unitId)),\n };\n\n await writeCache(nextCache, cachePath);\n await writeDoc(ctx.outDir, INDEX_DOC_PATH, renderIndexDoc({ manifest, generatedAt }));\n\n written.push(INDEX_DOC_PATH);\n\n const documentedUnits: Unit[] = manifest.units.map((unit) => {\n const summary = summaries.get(unit.id);\n return summary === undefined ? unit : { ...unit, summary };\n });\n\n return {\n manifest: { ...manifest, units: documentedUnits },\n written : written.sort(compareStrings),\n plan,\n failures: failures.sort((a, b) => compareStrings(a.unitId, b.unitId)),\n warnings: warnings.sort((a, b) => compareStrings(a.unitId, b.unitId)),\n filteredOut: scopedFilteredOut,\n skipped : skipped.sort(compareStrings),\n aborted,\n estimatedTokens,\n savedTokens,\n generated: fresh.length,\n fromCache,\n dryRun: false,\n };\n};\n","import type { GlossicConfig, Provider } from \"@glossic/schema\";\n\nimport { NoProviderAvailableError, UnknownProviderError } from \"./errors.js\";\nimport { compareStrings } from \"./utils/index.js\";\n\n\n/** Auto-detection order: the local CLI first, the paid API second. */\nexport const PROVIDER_PREFERENCE = [\"claude-code\", \"anthropic\"];\n\nexport interface ResolveProviderOptions {\n providers : readonly Provider[];\n config ?: Pick<GlossicConfig, \"provider\"> | undefined;\n requested?: string | undefined;\n}\n\nexport interface ProviderStatus {\n name : string;\n available: boolean;\n}\n\n/** Providers in auto-detection order, with unknown names last and sorted. */\nconst byPreference = (providers: readonly Provider[]): Provider[] =>\n [...providers].sort((a, b) => {\n const rankA = PROVIDER_PREFERENCE.indexOf(a.name);\n const rankB = PROVIDER_PREFERENCE.indexOf(b.name);\n\n if (rankA !== rankB) {\n if (rankA === -1) return 1;\n if (rankB === -1) return -1;\n\n return rankA - rankB;\n }\n\n return compareStrings(a.name, b.name);\n });\n\n/** Asks every provider whether it can run, in preference order. Never throws. */\nexport const probeProviders = async (providers: readonly Provider[]): Promise<ProviderStatus[]> =>\n Promise.all(\n byPreference(providers).map(async (provider) => ({\n name : provider.name,\n available: await provider.available().catch(() => false),\n })),\n );\n\n\n/**\n * The provider to use: the one named by a flag or the config, otherwise the\n * first one available in preference order.\n */\nexport const resolveProvider = async (options: ResolveProviderOptions): Promise<Provider> => {\n const known = options.providers.map((provider) => provider.name);\n const explicit = options.requested ?? options.config?.provider;\n\n if (explicit !== undefined && explicit !== \"\") {\n const match = options.providers.find((provider) => provider.name === explicit);\n\n if (match === undefined) {\n throw new UnknownProviderError(explicit, known);\n }\n\n return match;\n }\n\n for (const provider of byPreference(options.providers)) {\n if (await provider.available().catch(() => false)) {\n return provider;\n }\n }\n\n throw new NoProviderAvailableError(known);\n};\n","import type { Adapter, Provider } from \"@glossic/schema\";\n\n/** A name-keyed collection of adapters or providers, kept in insertion order. */\nexport class Registry<T extends { name: string }> {\n readonly #items = new Map<string, T>();\n\n register(item: T): this {\n this.#items.set(item.name, item);\n return this;\n }\n\n get(name: string): T | undefined {\n return this.#items.get(name);\n }\n\n has(name: string): boolean {\n return this.#items.has(name);\n }\n\n list(): T[] {\n return [...this.#items.values()];\n }\n\n get size(): number {\n return this.#items.size;\n }\n}\n\nexport type AdapterRegistry = Registry<Adapter>;\nexport type ProviderRegistry = Registry<Provider>;\n\nexport const createAdapterRegistry = (adapters: Adapter[] = []): AdapterRegistry => {\n const registry = new Registry<Adapter>();\n\n for (const adapter of adapters) {\n registry.register(adapter);\n }\n\n return registry;\n};\n\nexport const createProviderRegistry = (providers: Provider[] = []): ProviderRegistry => {\n const registry = new Registry<Provider>();\n\n for (const provider of providers) {\n registry.register(provider);\n }\n\n return registry;\n};\n","import type { CompletionRequest, CompletionResult, Provider } from \"@glossic/schema\";\n\n/** A provider that records what it was asked, for assertions. */\nexport interface FakeProvider extends Provider {\n readonly calls: CompletionRequest[];\n}\n\nexport interface FakeProviderOptions {\n name ?: string;\n available?: boolean;\n respond ?: (request: CompletionRequest, index: number) => string;\n}\n\n\nconst defaultDocument = (request: CompletionRequest, index: number): string =>\n [\n \"## What it does\",\n \"\",\n `Fake documentation number ${index} for ${String(request.metadata.unitId ?? \"a unit\")}.`,\n \"\",\n \"## Responsibilities\",\n \"\",\n \"The unit owns its own behaviour and delegates everything else to its\",\n \"neighbours. Nothing here reaches outside the boundary it declares.\",\n \"\",\n \"## Public elements\",\n \"\",\n \"- Everything the unit exports, described in one line each.\",\n \"\",\n \"## Architectural decisions\",\n \"\",\n \"Dependencies point one way, errors are typed, and the ordering is total.\",\n ].join(\"\\n\");\n\n\n/** A provider that answers from memory, so a test can drive the pipeline end to end. */\nexport const createFakeProvider = (options: FakeProviderOptions = {}): FakeProvider => {\n const calls: CompletionRequest[] = [];\n\n return {\n name: options.name ?? \"fake\",\n calls,\n available: async () : Promise<boolean> => options.available ?? true,\n complete : async (request: CompletionRequest): Promise<CompletionResult> => {\n const index = calls.length;\n calls.push(request);\n\n const text = options.respond?.(request, index) ?? defaultDocument(request, index);\n return { text, model: \"fake-model\", usage: { inputTokens: 10, outputTokens: 5 } };\n },\n };\n};\n","import manifest from \"../package.json\" with { type: \"json\" };\n\nexport const CORE_VERSION: string = manifest.version;\n\nexport * from \"./cache.js\";\nexport * from \"./check.js\";\nexport * from \"./config-file.js\";\nexport * from \"./config-resolve.js\";\nexport * from \"./errors.js\";\nexport * from \"./generate/index.js\";\nexport * from \"./manifest.js\";\nexport * from \"./markdown.js\";\nexport * from \"./prompt.js\";\nexport * from \"./provider.js\";\nexport * from \"./registry.js\";\nexport * from \"./retry.js\";\nexport * from \"./scan.js\";\nexport * from \"./testing.js\";\nexport * from \"./utils/index.js\";\nexport * from \"./validate.js\";\nexport * from \"./workspace.js\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/utils/fs.ts","../src/cache.ts","../src/manifest.ts","../src/scan/enrich.ts","../src/workspace.ts","../src/scan/layers.ts","../src/scan/index.ts","../src/markdown.ts","../src/check.ts","../src/config-file.ts","../src/config-resolve.ts","../src/errors.ts","../src/retry.ts","../src/prompt.ts","../src/utils/concurrency.ts","../src/generate/jobs.ts","../src/generate/decide.ts","../src/validate.ts","../src/generate/index.ts","../src/provider.ts","../src/registry.ts","../src/testing.ts","../src/index.ts"],"names":["fs","path","parseYaml","frontmatter","glob","GlossicConfigSchema","fence","plan"],"mappings":";;;;;;;;;;;AAAA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OA2Db,CAAA;AC1DO,IAAM,UAAA,GAAa,OAAO,MAAA,KAAqC;AACpE,EAAA,IAAI;AACF,IAAA,MAAMA,GAAA,CAAG,OAAO,MAAM,CAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,IAAM,QAAA,GAAW,OAAO,MAAA,KAAgD;AAC7E,EAAA,IAAI;AACF,IAAA,OAAO,MAAMA,GAAA,CAAG,QAAA,CAAS,MAAA,EAAQ,MAAM,CAAA;AAAA,EACzC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAGO,IAAM,QAAA,GAAW,OAAU,MAAA,KAA2C;AAC3E,EAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,MAAM,CAAA;AAEjC,EAAA,IAAI,QAAQ,MAAA,EAAW;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACvB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;AC7BO,IAAM,kBAAA,GAAqB;AAE3B,IAAM,aAAA,GAAqB;AAG3B,IAAM,gBAAA,GAAmB,EAAE,MAAA,CAAO;AAAA,EACvC,MAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,QAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,aAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,KAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,IAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,UAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EAC/B,WAAA,EAAe,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC;AACjC,CAAC;AAGM,IAAM,eAAA,GAAkB,EAAE,MAAA,CAAO;AAAA,EACtC,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,IAAI,CAAC,CAAA;AAAA,EACzB,OAAA,EAAS,CAAA,CAAE,KAAA,CAAM,gBAAgB;AACnC,CAAC;AAGM,IAAM,aAAa,OAAkB,EAAE,SAAS,aAAA,EAAe,OAAA,EAAS,EAAC,EAAE;AAI3E,IAAM,SAAA,GAAY,OAAO,MAAA,KAAuC;AACrE,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAS,MAAMA,GAAAA,CAAG,QAAA,CAASC,MAAK,OAAA,CAAQ,MAAM,GAAG,MAAM,CAAA;AAC7D,IAAA,MAAM,SAAS,eAAA,CAAgB,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAEpD,IAAA,OAAO,MAAA,CAAO,OAAA,KAAY,aAAA,GAAgB,MAAA,GAAS,UAAA,EAAW;AAAA,EAChE,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,UAAA,EAAW;AAAA,EACpB;AACF;AAGO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAA6B;AAC1D,EAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,EAAE,GAAG,KAAA,EAAO,SAAS,MAAA,CAAO,KAAA,CAAM,OAAA,EAAS,CAAC,UAAU,KAAA,CAAM,MAAM,GAAE,EAAG,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAC1G;AAGO,IAAM,UAAA,GAAa,OAAO,KAAA,EAAkB,MAAA,KAAoC;AACrF,EAAA,MAAM,QAAA,GAAWA,KAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAEpC,EAAA,MAAMD,GAAAA,CAAG,MAAMC,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1D,EAAA,MAAMD,IAAG,SAAA,CAAU,QAAA,EAAU,cAAA,CAAe,KAAK,GAAG,MAAM,CAAA;AAE1D,EAAA,OAAO,QAAA;AACT;AAGO,IAAM,UAAA,GAAa,CAAC,KAAA,KAA8C;AACvE,EAAA,OAAO,IAAI,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC,CAAC,CAAA;AACpE;ACpDO,IAAM,qBAAA,GAAwB;AAOrC,IAAM,QAAA,GAAW,CAAC,IAAA,MAAsB;AAAA,EACtC,GAAG,IAAA;AAAA,EACH,KAAA,EAAO;AAAA,IACL,GAAG,IAAA,CAAK,KAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,GAAG,KAAK,KAAA,CAAM,IAAA;AAAA,MACd,KAAA,EAAW,OAAO,IAAA,CAAK,KAAA,CAAM,KAAK,KAAA,EAAO,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA;AAAA,MAC5D,WAAW,CAAC,GAAG,KAAK,KAAA,CAAM,IAAA,CAAK,SAAS,CAAA,CAAE,IAAA;AAAA,QACxC,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,CAAA,CAAE,KAAA,IAAS,cAAA,CAAe,CAAA,CAAE,QAAA,EAAU,CAAA,CAAE,QAAQ;AAAA;AACtE,KACF;AAAA,IACA,UAAA,EAAY,CAAC,GAAG,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,KAAK,cAAc;AAAA;AAE9D,CAAA,CAAA;AAEA,IAAM,gBAAA,GAAmB,CAAC,CAAA,EAAa,CAAA,KAAwB;AAC7D,EAAA,OAAO,eAAe,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,KAAK,cAAA,CAAe,CAAA,CAAE,EAAA,EAAI,CAAA,CAAE,EAAE,CAAA,IAAK,cAAA,CAAe,CAAA,CAAE,IAAA,EAAM,EAAE,IAAI,CAAA;AACtG,CAAA;AAIO,IAAM,gBAAgB,CAAC,SAAA,EAAsB,OAAA,EAAmC,OAAA,GAAgC,EAAC,KAAgB;AACtI,EAAA,MAAM,KAAA,GAAY,QAAQ,OAAA,CAAQ,CAAC,WAAW,MAAA,CAAO,KAAK,CAAA,CAAE,GAAA,CAAI,QAAQ,CAAA;AACxE,EAAA,MAAM,YAAY,OAAA,CAAQ,OAAA,CAAQ,CAAC,MAAA,KAAW,OAAO,SAAS,CAAA;AAE9D,EAAA,OAAO,eAAe,KAAA,CAAM;AAAA,IAC1B,OAAA,EAAa,gBAAA;AAAA,IACb,aAAa,OAAA,CAAQ,WAAA,IAAA,iBAAe,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,IAC3D,SAAA,EAAa;AAAA,MACX,GAAG,SAAA;AAAA,MACH,UAAU,MAAA,CAAO,SAAA,CAAU,UAAU,CAAC,OAAA,KAAY,QAAQ,EAAE;AAAA,KAC9D;AAAA,IACA,OAAW,MAAA,CAAO,KAAA,EAAO,CAAC,IAAA,KAAS,KAAK,EAAE,CAAA;AAAA,IAC1C,WAAW,CAAC,GAAG,SAAS,CAAA,CAAE,KAAK,gBAAgB;AAAA,GAChD,CAAA;AACH;AAGO,IAAM,iBAAA,GAAoB,CAAC,QAAA,KAA+B;AAC/D,EAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,QAAA,EAAU,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAC7C;AAIO,IAAM,aAAA,GAAgB,OAAO,QAAA,EAAoB,MAAA,KAAoC;AAC1F,EAAA,MAAM,QAAA,GAAWC,KAAAA,CAAK,OAAA,CAAQ,MAAM,CAAA;AAEpC,EAAA,MAAMD,GAAAA,CAAG,MAAMC,KAAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AAC1D,EAAA,MAAMD,IAAG,SAAA,CAAU,QAAA,EAAU,iBAAA,CAAkB,QAAQ,GAAG,MAAM,CAAA;AAEhE,EAAA,OAAO,QAAA;AACT;AAGO,IAAM,YAAA,GAAe,OAAO,MAAA,KAAkD;AACnF,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,MAAMA,GAAAA,CAAG,QAAA,CAASC,MAAK,OAAA,CAAQ,MAAM,GAAG,MAAM,CAAA;AAC1D,IAAA,OAAO,cAAA,CAAe,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,EAC7C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;;;ACvEA,IAAM,cAAA,GAAiB,CAAC,CAAA,EAAe,CAAA,KAA0B;AAC/D,EAAA,OAAO,cAAA,CAAe,EAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA,IAAA,CAC9B,CAAA,CAAE,IAAA,IAAQ,CAAA,KAAM,CAAA,CAAE,IAAA,IAAQ,MAC3B,cAAA,CAAe,CAAA,CAAE,MAAM,CAAA,CAAE,IAAI,KAC7B,cAAA,CAAe,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACpC,CAAA;AAOA,IAAM,SAAA,GAAY,CAAC,IAAA,EAAY,IAAA,EAAc,UAAA,KAAiD;AAC5F,EAAA,IAAI,UAAA,EAAY,OAAA,KAAY,MAAA,IAAa,UAAA,EAAY,cAAc,MAAA,EAAW;AAC5E,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,UAAA,CAAW,OAAA,KAAY,MAAA,GACnC,IAAA,CAAK,MAAM,OAAA,GACX;AAAA,IACE,OAAA,EAAS,CAAC,GAAI,IAAA,CAAK,MAAM,OAAA,EAAS,OAAA,IAAW,EAAC,EAAI,GAAG,UAAA,CAAW,OAAA,CAAQ,OAAO,CAAA,CAC5E,KAAK,cAAc;AAAA,GACxB;AAEJ,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,SAAA,IAAa,IAAA,CAAK,KAAA,CAAM,SAAA;AAErD,EAAA,OAAO;AAAA,IACL,GAAG,IAAA;AAAA,IACH,KAAA,EAAO;AAAA,MACL,GAAG,IAAA,CAAK,KAAA;AAAA,MACR,GAAI,OAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,OAAA,EAAQ;AAAA,MAC7C,GAAI,SAAA,KAAc,MAAA,GAAY,EAAC,GAAI,EAAE,SAAA,EAAU;AAAA,MAC/C,YAAY,CAAC,GAAG,IAAA,CAAK,KAAA,CAAM,YAAY,IAAI;AAAA;AAC7C,GACF;AACF,CAAA;AAQO,IAAM,eAAA,GAAkB,CAAC,SAAA,EAA0B,IAAA,EAAc,MAAA,KAAwC;AAC9G,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,MAAA,CAAO,KAAA,CAAM,IAAA,CAAK,EAAE,CAAC,CAAC,CAAA;AACxF,EAAA,MAAM,KAAA,GAAQ,IAAI,GAAA,CAAI,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAElD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,SAAA,EAAW;AAAA,MACT,GAAG,SAAA,CAAU,SAAA;AAAA,MACb,GAAG,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,CAAC,EAAE,IAAA,EAAM,EAAA,EAAG,KAAM,KAAA,CAAM,IAAI,IAAI,CAAA,IAAK,KAAA,CAAM,GAAA,CAAI,EAAE,CAAC;AAAA;AAC/E,GACF;AACF;ACzCA,IAAM,YAAA,GAAe,CAAC,oBAAA,EAAsB,YAAA,EAAc,eAAe,YAAY,CAAA;AAErF,IAAM,yBAAA,GAAsE;AAAA,EAC1E,CAAC,kBAAkB,MAAM,CAAA;AAAA,EACzB,CAAC,aAAa,MAAM,CAAA;AAAA,EACpB,CAAC,qBAAqB,KAAK,CAAA;AAAA,EAC3B,CAAC,YAAY,KAAK,CAAA;AAAA,EAClB,CAAC,aAAa,KAAK,CAAA;AAAA,EACnB,CAAC,iBAAiB,UAAU,CAAA;AAAA,EAC5B,CAAC,iBAAiB,UAAU;AAC9B,CAAA;AAEA,IAAM,aAAA,GAAgB,CAAC,KAAA,KACrB,KAAA,CAAM,QAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAyB,OAAO,IAAA,KAAS,QAAQ,IAAI,EAAC;AAG7F,IAAM,oBAAA,GAAuB,OAAO,GAAA,EAAa,GAAA,KAA8D;AAC7G,EAAA,MAAM,WAAW,GAAA,EAAK,cAAA;AAEtB,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,CAAS,SAAS,CAAA,EAAG;AACvD,IAAA,MAAM,CAAC,IAAI,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA;AAEjC,IAAA,IAAI,IAAA,KAAS,MAAA,IAAa,IAAA,CAAK,MAAA,GAAS,CAAA,EAAG;AACzC,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,OAAO,CAAA,IAAK,yBAAA,EAA2B;AAC3D,IAAA,IAAI,MAAM,UAAA,CAAWA,KAAAA,CAAK,KAAK,GAAA,EAAK,QAAQ,CAAC,CAAA,EAAG;AAC9C,MAAA,OAAO,OAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAIA,IAAM,cAAA,GAAiB,OAAO,IAAA,EAAc,GAAA,KAAsE;AAChH,EAAA,MAAM,gBAAgB,MAAM,QAAA,CAASA,MAAK,IAAA,CAAK,IAAA,EAAM,qBAAqB,CAAC,CAAA;AAE3E,EAAA,IAAI,kBAAkB,MAAA,EAAW;AAC/B,IAAA,MAAM,MAAA,GAAkBC,MAAU,aAAa,CAAA;AAC/C,IAAA,MAAM,KAAA,GAAkB,aAAA,CAAe,MAAA,EAA0C,QAAQ,CAAA;AAEzF,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA,OAAO,EAAE,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAM;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,OAAA,CAAQ,GAAA,EAAK,UAAU,CAAA,GAAI,GAAA,CAAI,UAAA,GAAa,aAAA,CAAc,GAAA,EAAK,UAAA,EAAY,QAAQ,CAAA;AAE5G,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,OAAO,EAAE,IAAA,EAAM,gBAAA,EAAkB,KAAA,EAAO,UAAA,EAAW;AAAA,EACrD;AAEA,EAAA,IAAI,MAAM,UAAA,CAAWD,KAAAA,CAAK,KAAK,IAAA,EAAM,YAAY,CAAC,CAAA,EAAG;AACnD,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,OAAO,CAAC,QAAA,EAAU,YAAY,CAAA,EAAE;AAAA,EAC1D;AAEA,EAAA,IAAI,MAAM,UAAA,CAAWA,KAAAA,CAAK,KAAK,IAAA,EAAM,SAAS,CAAC,CAAA,EAAG;AAChD,IAAA,OAAO,EAAE,MAAM,IAAA,EAAM,KAAA,EAAO,CAAC,QAAA,EAAU,QAAA,EAAU,YAAY,CAAA,EAAE;AAAA,EACjE;AAEA,EAAA,MAAM,QAAQ,MAAM,QAAA,CAAiCA,MAAK,IAAA,CAAK,IAAA,EAAM,YAAY,CAAC,CAAA;AAElF,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,MAAM,KAAA,GAAQ,aAAA,CAAc,KAAA,CAAM,QAAQ,CAAA;AAC1C,IAAA,OAAO,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,GAAQ,CAAC,YAAY,CAAA,EAAE;AAAA,EAC3E;AAEA,EAAA,OAAO,MAAA;AACT,CAAA;AAEA,IAAM,iBAAA,GAAoB,OAAO,IAAA,EAAc,KAAA,KAAuC;AACpF,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,MAAA,GAAqB,CAAC,GAAG,YAAY,CAAA;AAE3C,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,GAAG,CAAA,EAAG;AACzB,MAAA,MAAA,CAAO,KAAK,CAAA,EAAG,KAAA,CAAM,KAAA,CAAM,CAAC,CAAC,CAAA,GAAA,CAAK,CAAA;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,aAAA,CAAe,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,EAAC;AAEnC,EAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK;AAAA,IAC3B,QAAA;AAAA,IACA,GAAA,EAAK,IAAA;AAAA,IACL,MAAA;AAAA,IACA,SAAA,EAAqB,IAAA;AAAA,IACrB,mBAAA,EAAqB,KAAA;AAAA,IACrB,GAAA,EAAqB;AAAA,GACtB,CAAA;AAED,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,CAAC,QAAA,KAAa,OAAA,CAAQA,KAAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAC,CAAC,CAAC,CAAA;AAEvF,EAAA,OAAO,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC,EAAE,IAAA,EAAK;AACjC,CAAA;AAEA,IAAM,YAAA,GAAe,OAAO,IAAA,EAAc,OAAA,EAAiB,eAAA,KAA0D;AACnH,EAAA,MAAM,GAAA,GAAiBA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACjD,EAAA,MAAM,MAAiB,MAAM,QAAA,CAAsBA,MAAK,IAAA,CAAK,GAAA,EAAK,cAAc,CAAC,CAAA;AACjF,EAAA,MAAM,cAAA,GAAkB,MAAM,oBAAA,CAAqB,GAAA,EAAK,GAAG,CAAA,IAAM,eAAA;AACjE,EAAA,MAAM,IAAA,GAAiB,GAAA,EAAK,IAAA,IAAQA,KAAAA,CAAK,SAAS,GAAG,CAAA;AAErD,EAAA,MAAM,OAAA,GAAmB;AAAA,IACvB,EAAA,EAAI,OAAA,KAAY,GAAA,GAAM,MAAA,GAAS,OAAA;AAAA,IAC/B,IAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,mBAAmB,MAAA,GAAY,OAAA,GAAU,EAAE,GAAG,SAAS,cAAA,EAAe;AAC/E,CAAA;AAIO,IAAM,gBAAA,GAAmB,OAAO,IAAA,KAAqC;AAC1E,EAAA,MAAM,YAAA,GAAiBA,KAAAA,CAAK,OAAA,CAAQ,IAAI,CAAA;AACxC,EAAA,MAAM,MAAiB,MAAM,QAAA,CAAsBA,MAAK,IAAA,CAAK,YAAA,EAAc,cAAc,CAAC,CAAA;AAC1F,EAAA,MAAM,cAAA,GAAiB,MAAM,oBAAA,CAAqB,YAAA,EAAc,GAAG,CAAA;AACnE,EAAA,MAAM,IAAA,GAAiB,GAAA,EAAK,IAAA,IAAQA,KAAAA,CAAK,SAAS,YAAY,CAAA;AAE9D,EAAA,MAAM,MAAA,GAAc,MAAM,cAAA,CAAe,YAAA,EAAc,GAAG,CAAA;AAC1D,EAAA,MAAM,WAAA,GAAc,WAAW,MAAA,GAAY,KAAK,MAAM,iBAAA,CAAkB,YAAA,EAAc,MAAA,CAAO,KAAK,CAAA;AAElG,EAAA,MAAM,UAAA,GAAa,YAAY,MAAA,GAAS,CAAA;AACxC,EAAA,MAAM,QAAA,GAAa,UAAA,GAAa,WAAA,GAAc,CAAC,GAAG,CAAA;AAClD,EAAA,MAAM,QAAA,GAAa,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC/B,QAAA,CAAS,IAAI,CAAC,OAAA,KAAY,aAAa,YAAA,EAAc,OAAA,EAAS,cAAc,CAAC;AAAA,GAC/E;AAEA,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,IAAA;AAAA,IACA,IAAA,EAAM,QAAQ,YAAY,CAAA;AAAA,IAC1B,UAAA;AAAA,IACA,IAAA,EAAU,UAAA,IAAc,MAAA,KAAW,MAAA,GAAY,OAAO,IAAA,GAAM,MAAA;AAAA,IAC5D,UAAU,MAAA,CAAO,QAAA,EAAU,CAAC,OAAA,KAAY,QAAQ,EAAE;AAAA,GACpD;AAEA,EAAA,OAAO,mBAAmB,MAAA,GAAY,SAAA,GAAY,EAAE,GAAG,WAAW,cAAA,EAAe;AACnF;AC9JO,IAAM,aAAA,GAAgB,CAAC,QAAA,EAA4B,MAAA,KAAuC;AAC/F,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,CAAC,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAC,CAAA;AAEzE,EAAA,OAAO,MAAA,CACJ,GAAA,CAAI,CAAC,IAAA,KAAS,MAAA,CAAO,GAAA,CAAI,IAAI,CAAC,CAAA,CAC9B,MAAA,CAAO,CAAC,OAAA,KAA8B,YAAY,MAAS,CAAA;AAChE;AAIO,IAAM,aAAA,GAAgB,OAAO,MAAA,EAA0B,GAAA,KAAuD;AACnH,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,UAAU,KAAK,CAAA,IAAK,MAAM,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA,EAAG;AAC/C,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAIO,IAAM,eAAA,GAAkB,OAAO,MAAA,EAA0B,GAAA,KAA8C;AAC5G,EAAA,MAAM,UAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAI,WAAW,KAAK,CAAA,IAAK,MAAM,KAAA,CAAM,MAAA,CAAO,GAAG,CAAA,EAAG;AAChD,MAAA,OAAA,CAAQ,KAAK,KAAK,CAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;;;ACnBO,IAAM,IAAA,GAAO,OAAO,GAAA,KAA8C;AACvE,EAAA,MAAM,SAAiC,GAAA,CAAI,MAAA,IAAU,mBAAA,CAAoB,KAAA,CAAM,EAAE,CAAA;AACjF,EAAA,MAAM,YAAiC,MAAM,gBAAA,CAAiBA,MAAK,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAC,CAAA;AACpF,EAAA,MAAM,MAAA,GAAiC,aAAA,CAAc,GAAA,CAAI,QAAA,EAAU,OAAO,QAAQ,CAAA;AAClF,EAAA,MAAM,iBAAiC,EAAE,IAAA,EAAM,SAAA,CAAU,IAAA,EAAM,WAAW,MAAA,EAAO;AAEjF,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,MAAM,mBAA2C,EAAC;AAClD,EAAA,MAAM,qBAA+C,EAAC;AAEtD,EAAA,KAAA,MAAW,OAAA,IAAW,UAAU,QAAA,EAAU;AACxC,IAAA,MAAM,eAAA,GAAmC,EAAE,GAAG,cAAA,EAAgB,OAAA,EAAQ;AACtE,IAAA,MAAM,OAAA,GAAmC,MAAM,aAAA,CAAc,MAAA,EAAQ,eAAe,CAAA;AAEpF,IAAA,IAAI,YAAY,MAAA,EAAW;AAE3B,IAAA,gBAAA,CAAiB,OAAA,CAAQ,EAAE,CAAA,GAAI,OAAA,CAAQ,IAAA;AAEvC,IAAA,MAAM,UAAA,GAAa,MAAM,OAAA,CAAQ,QAAA,CAAS,eAAe,CAAA;AACzD,IAAA,MAAM,SAAA,GAAa,MAAM,eAAA,CAAgB,MAAA,EAAQ,eAAe,CAAA;AAEhE,IAAA,IAAI,SAAA,GAAY,MAAM,OAAA,CAAQ,OAAA,CAAQ,EAAE,GAAG,eAAA,EAAiB,KAAA,EAAO,UAAA,EAAY,CAAA;AAE/E,IAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,MAAA,MAAM,UAAA,GAAa,MAAM,QAAA,CAAS,MAAA,CAAO,EAAE,GAAG,eAAA,EAAiB,KAAA,EAAO,SAAA,CAAU,KAAA,EAAO,CAAA;AAEvF,MAAA,SAAA,GAAY,eAAA,CAAgB,SAAA,EAAW,QAAA,CAAS,IAAA,EAAM,UAAU,CAAA;AAAA,IAClE;AAEA,IAAA,kBAAA,CAAmB,OAAA,CAAQ,EAAE,CAAA,GAAI,SAAA,CAAU,IAAI,CAAC,QAAA,KAAa,SAAS,IAAI,CAAA;AAE1E,IAAA,OAAA,CAAQ,KAAK,SAAS,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,QAAA,GAAW,aAAA;AAAA,IACf,SAAA;AAAA,IACA,OAAA;AAAA,IACA,GAAA,CAAI,gBAAgB,MAAA,GAAY,KAAK,EAAE,WAAA,EAAa,IAAI,WAAA;AAAY,GACtE;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,SAAA,EAAW,gBAAA,EAAkB,kBAAA,EAAmB;AACrE;;;ACrDO,IAAM,WAAA,GAAc,CAAC,IAAA,KAAuB;AACjD,EAAA,OAAO,KAAK,IAAA,KAAS,GAAA,GAAM,SAAA,GAAY,CAAA,EAAG,KAAK,IAAI,CAAA,GAAA,CAAA;AACrD;AAEO,IAAM,cAAA,GAAiB;AAE9B,IAAM,WAAA,GAAc,CAAC,OAAA,KACnB;AAAA,EACE,KAAA;AAAA,EACA,GAAG,OAAA,CAAQ,GAAA;AAAA,IAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KACzB,OAAO,UAAU,QAAA,GAAW,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,KAAK,KAAK,CAAA,EAAG,GAAG,KAAK,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,GACnF;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAWN,IAAM,aAAA,GAAgB,CAAC,KAAA,KAAsC;AAClE,EAAA,MAAM,EAAE,MAAK,GAAI,KAAA;AACjB,EAAA,MAAM,QAAQ,IAAA,CAAK,IAAA,KAAS,SAAS,KAAA,CAAM,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA;AAE/D,EAAA,MAAM,OAAA,GAAqD;AAAA,IACzD,CAAC,SAAS,KAAK,CAAA;AAAA,IACf,CAAC,MAAA,EAAQ,IAAA,CAAK,EAAE,CAAA;AAAA,IAChB,CAAC,SAAA,EAAW,IAAA,CAAK,SAAS,CAAA;AAAA,IAC1B,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,IAClB,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA;AAAA,IAClB,CAAC,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,IACtC,CAAC,aAAA,EAAe,KAAA,CAAM,WAAW;AAAA,GACnC;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,KAAa,IAAA,EAAM;AACrC,IAAA,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAA,EAAG,CAAC,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAAA,EACzD;AAEA,EAAA,OAAO,CAAC,WAAA,CAAY,OAAO,CAAA,EAAG,EAAA,EAAI,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,EAAG,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACpE;AAOA,IAAM,eAAA,GAAkB,CAAC,KAAA,KAAmC;AAC1D,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AAEvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,KAAA,MAAW,KAAA,IAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW;AAC7C,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,QAAA,EAAA,CAAW,MAAA,CAAO,GAAA,CAAI,MAAM,QAAQ,CAAA,IAAK,CAAA,IAAK,KAAA,CAAM,KAAK,CAAA;AAAA,IAC5E;AAAA,EACF;AAEA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,EACxB,IAAA,CAAK,CAAC,CAAC,KAAA,EAAO,MAAM,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,MAAM,MAAA,GAAS,MAAA,IAAU,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC,CAAA,CAC1F,GAAA,CAAI,CAAC,CAAC,QAAA,EAAU,KAAK,CAAA,KAAM,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,CAAG,CAAA,CACnD,KAAK,IAAI,CAAA;AACd,CAAA;AAIO,IAAM,cAAA,GAAiB,CAAC,KAAA,KAAuC;AACpE,EAAA,MAAM,EAAE,UAAS,GAAI,KAAA;AACrB,EAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAM,GAAI,QAAA;AAE7B,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,WAAA,CAAY;AAAA,MACV,CAAC,OAAA,EAAS,SAAA,CAAU,IAAI,CAAA;AAAA,MACxB,CAAC,aAAA,EAAe,KAAA,CAAM,WAAW,CAAA;AAAA,MACjC,CAAC,OAAA,EAAS,KAAA,CAAM,MAAM;AAAA,KACvB,CAAA;AAAA,IACD,EAAA;AAAA,IACA,CAAA,EAAA,EAAK,UAAU,IAAI,CAAA,CAAA;AAAA,IACnB,EAAA;AAAA,IACA,SAAA,CAAU,aACN,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,eAAA,EAAkB,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,UAAA,CAAA,GAC5D,2BAAA;AAAA,IACJ;AAAA,GACF;AAEA,EAAA,KAAA,MAAW,OAAA,IAAW,UAAU,QAAA,EAAU;AACxC,IAAA,MAAM,YAAA,GAAe,MAAM,MAAA,CAAO,CAAC,SAAS,IAAA,CAAK,SAAA,KAAc,QAAQ,EAAE,CAAA;AAEzE,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,OAAA,CAAQ,IAAI,IAAI,EAAE,CAAA;AAEnC,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,KAAA,CAAM,IAAA,CAAK,wBAAwB,EAAE,CAAA;AACrC,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,IAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA;AAC/B,MAAA,MAAM,MAAA,GAAS,IAAA,KAAS,IAAA,GAAO,EAAA,GAAK,WAAM,IAAI,CAAA,CAAA;AAE9C,MAAA,KAAA,CAAM,IAAA;AAAA,QACJ,CAAA,GAAA,EAAM,IAAA,CAAK,IAAI,CAAA,IAAA,EAAO,YAAY,IAAI,CAAC,CAAA,SAAA,EAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,MAAM,SAAS,MAAM,CAAA;AAAA,OAC3F;AAAA,IACF;AACA,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACf;AAEA,EAAA,MAAM,SAAA,GAAY,gBAAgB,KAAK,CAAA;AAEvC,EAAA,IAAI,cAAc,EAAA,EAAI;AACpB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,SAAS,CAAA,CAAA,EAAI,EAAE,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;;;AChFA,IAAM,WAAA,GAAc,kCAAA;AAEpB,IAAM,cAAA,GAAsC;AAAA,EAC1C,IAAA,EAAa,MAAA;AAAA,EACb,IAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa;AACf,CAAA;AAGO,IAAM,kBAAA,GAAqB,OAAO,IAAA,KAA+C;AACtF,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAQ,MAAMD,GAAAA,CAAG,QAAA,CAAS,MAAM,MAAM,CAAA;AAC5C,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,IAAA,CAAK,GAAG,CAAA;AAElC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAkBE,KAAAA,CAAU,KAAA,CAAM,CAAC,KAAK,EAAE,CAAA;AAEhD,IAAA,IAAI,OAAO,MAAA,KAAW,QAAA,IAAY,MAAA,KAAW,IAAA,EAAM;AACjD,MAAA,OAAO,cAAA;AAAA,IACT;AAEA,IAAA,MAAM,MAAA,GAAS,MAAA;AAEf,IAAA,OAAO;AAAA,MACL,MAAa,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,KAAA,CAAA;AAAA,MAC7D,MAAa,OAAO,MAAA,CAAO,IAAA,KAAS,QAAA,GAAW,OAAO,IAAA,GAAO,KAAA,CAAA;AAAA,MAC7D,aAAa,OAAO,MAAA,CAAO,WAAA,KAAgB,QAAA,GAAW,OAAO,WAAA,GAAc,KAAA;AAAA,KAC7E;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,cAAA;AAAA,EACT;AACF;AAMA,IAAM,cAAA,GAAiB,CAACC,YAAAA,KAA8C;AACpE,EAAA,OACEA,aAAY,IAAA,KAAS,MAAA,IACrBA,aAAY,IAAA,KAAS,MAAA,IACrBA,aAAY,WAAA,KAAgB,MAAA;AAEhC,CAAA;AAEA,IAAM,QAAA,GAAW,OAAO,MAAA,KAAsC;AAC5D,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAMC,IAAAA,CAAK;AAAA,MACzB,QAAA,EAAqB,CAAC,SAAS,CAAA;AAAA,MAC/B,GAAA,EAAqB,MAAA;AAAA,MACrB,SAAA,EAAqB,IAAA;AAAA,MACrB,mBAAA,EAAqB;AAAA,KACtB,CAAA;AAED,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,CAAE,KAAK,cAAc,CAAA;AAAA,EACjD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF,CAAA;AAGO,IAAM,KAAA,GAAQ,OAAO,GAAA,KAA4C;AACtE,EAAA,MAAM,EAAE,QAAA,EAAS,GAA4B,MAAM,KAAK,GAAG,CAAA;AAE3D,EAAA,MAAM,IAAA,GAAW,MAAM,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,IAAI,GAAA,CAAI,QAAA,CAAS,MAAM,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,WAAA,CAAY,IAAI,CAAA,EAAG,IAAI,CAAC,CAAC,CAAA;AAEhF,EAAA,MAAM,WAAyB,EAAC;AAChC,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,MAAM,QAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAS,KAAA,EAAO;AACjC,IAAA,MAAM,OAAA,GAAY,YAAY,IAAI,CAAA;AAClC,IAAA,MAAM,SAAA,GAAY,EAAE,MAAA,EAAQ,IAAA,CAAK,IAAI,OAAA,EAAS,YAAA,EAAc,KAAK,IAAA,EAAK;AAEtE,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,KAAK,EAAE,GAAG,SAAA,EAAW,cAAA,EAAgB,QAAW,CAAA;AACxD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,IAAA,EAAK,GAAI,MAAM,kBAAA,CAAmBH,MAAK,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,OAAO,CAAC,CAAA;AAE3E,IAAA,IAAI,IAAA,KAAS,KAAK,IAAA,EAAM;AACtB,MAAA,QAAA,CAAS,KAAK,EAAE,GAAG,SAAA,EAAW,cAAA,EAAgB,MAAM,CAAA;AAAA,IACtD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,EAAE,GAAG,SAAA,EAAW,cAAA,EAAgB,MAAM,CAAA;AAAA,IACnD;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAqB,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,KAAQ,cAAA,IAAkB,CAAC,QAAA,CAAS,GAAA,CAAI,GAAG,CAAC,CAAA;AAC5F,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,MAAME,YAAAA,GAAc,MAAM,kBAAA,CAAmBF,KAAAA,CAAK,QAAQ,GAAA,CAAI,MAAA,EAAQ,GAAG,CAAC,CAAA;AAE1E,IAAA,IAAI,cAAA,CAAeE,YAAW,CAAA,EAAG,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,EACpD;AAEA,EAAA,QAAA,CAAS,KAAK,cAAc,CAAA;AAE5B,EAAA,MAAM,QAAA,GAAW,CAAC,OAAA,KAAwC;AACxD,IAAA,OAAO,MAAA,CAAO,OAAA,EAAS,CAAC,KAAA,KAAU,MAAM,MAAM,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA;AAAA,IAC5B,QAAA,EAAU,SAAS,QAAQ,CAAA;AAAA,IAC3B,OAAA,EAAU,SAAS,OAAO,CAAA;AAAA,IAC1B,KAAA,EAAU,SAAS,KAAK,CAAA;AAAA,IACxB,QAAA;AAAA,IACA,EAAA,EAAI,QAAQ,MAAA,KAAW,CAAA,IAAK,MAAM,MAAA,KAAW,CAAA,IAAK,SAAS,MAAA,KAAW;AAAA,GACxE;AACF;ACjJO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF;AAIO,IAAM,cAAA,GAAiB,OAAO,IAAA,KAA8C;AACjF,EAAA,KAAA,MAAW,YAAY,gBAAA,EAAkB;AACvC,IAAA,MAAM,SAAA,GAAYF,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA;AAC7C,IAAA,IAAI,MAAM,UAAA,CAAW,SAAS,CAAA,EAAG;AAC/B,MAAA,OAAO,QAAQ,SAAS,CAAA;AAAA,IAC1B;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAyBA,IAAM,aAAA,GAAgB,CAAC,KAAA,KAA2B;AAChD,EAAA,MAAM,UAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAErE,EAAA,OAAO,QAAQ,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA,EAAG,MAAK,IAAK,eAAA;AAC3C,CAAA;AAGA,IAAM,iBAAA,GAAoB,CAAC,IAAA,EAAc,KAAA,KAAgD;AACvF,EAAA,MAAM,MAAA,GAASI,mBAAAA,CAAoB,OAAA,EAAQ,CAAE,UAAU,KAAK,CAAA;AAE5D,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CACxB,GAAA;AAAA,MAAI,CAAC,KAAA,KACJ,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,IAAI,KAAA,CAAM,OAAA,GAAU,CAAA,EAAG,KAAA,CAAM,KAAK,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,MAAM,OAAO,CAAA;AAAA,KACrF,CACC,KAAK,IAAI,CAAA;AAEZ,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,KAAA,EAAM;AAAA,EACzC;AAEA,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,IAAA,CAAK,KAAgC,CAAA;AAE7D,EAAA,MAAM,SAAS,MAAA,CAAO,WAAA;AAAA,IACpB,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,QAAA,CAAS,QAAA,CAAS,GAAG,CAAC;AAAA,GACtE;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,IAAA,EAAM,MAAA,EAAO;AAC1C,CAAA;AAIO,IAAM,iBAAA,GAAoB,OAAO,IAAA,KAAyC;AAC/E,EAAA,MAAM,IAAA,GAAO,MAAM,cAAA,CAAe,IAAI,CAAA;AAEtC,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,OAAO,EAAE,QAAQ,SAAA,EAAU;AAAA,EAC7B;AAEA,EAAA,IAAI;AACF,IAAA,MAAM,OAAS,UAAA,CAAW,MAAA,CAAA,IAAA,CAAY,KAAK,EAAE,WAAA,EAAa,OAAO,CAAA;AACjE,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,MAAM,EAAE,OAAA,EAAS,MAAM,CAAA;AAExD,IAAA,OAAO,iBAAA,CAAkB,MAAM,MAAM,CAAA;AAAA,EACvC,SAAS,KAAA,EAAO;AACd,IAAA,OAAO,EAAE,MAAA,EAAQ,QAAA,EAAU,MAAM,KAAA,EAAO,aAAA,CAAc,KAAK,CAAA,EAAE;AAAA,EAC/D;AACF;AC9EA,IAAM,KAAA,GAAiF;AAAA,EACrF,CAAC,QAAQ,OAAO,CAAA;AAAA,EAChB,CAAC,WAAW,SAAS,CAAA;AAAA,EACrB,CAAC,cAAc,YAAY;AAC7B,CAAA;AAEA,IAAM,KAAA,GAAQ,CAAC,KAAA,KAA4B;AACzC,EAAA,OAAO,KAAA,KAAU,UAAa,EAAE,OAAO,UAAU,QAAA,IAAY,KAAA,CAAM,MAAK,KAAM,EAAA,CAAA;AAChF,CAAA;AAEA,IAAM,UAAA,GAAa,CAAC,MAAA,EAAiC,GAAA,KAA+C;AAClG,EAAA,MAAM,KAAA,GAAQ,OAAO,GAAG,CAAA;AAExB,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAK,KAAA,GAAqB,MAAA;AACtD,CAAA;AAYO,IAAM,aAAA,GAAgB,CAAC,OAAA,GAAyB,EAAC,KAAsB;AAC5E,EAAA,MAAM,SAAmC,EAAC;AAC1C,EAAA,MAAM,UAAmC,EAAC;AAE1C,EAAA,KAAA,MAAW,CAAC,QAAQ,GAAG,CAAA,IAAK,CAAC,GAAG,KAAK,CAAA,CAAE,OAAA,EAAQ,EAAG;AAChD,IAAA,MAAM,MAAA,GAAS,QAAQ,GAAG,CAAA;AAE1B,IAAA,IAAI,WAAW,MAAA,EAAW;AAE1B,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,MAAA,IAAI,CAAC,KAAA,CAAM,KAAK,CAAA,EAAG;AAEnB,MAAA,MAAA,CAAO,IAAI,CAAA,GAAK,KAAA;AAChB,MAAA,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,EAAC;AAEf,EAAA,KAAA,MAAW,OAAO,kBAAA,EAAoB;AACpC,IAAA,MAAM,QAAA,GAAW,kBAAkB,aAAA,CAAc,GAAG,GAAG,UAAA,CAAW,MAAA,EAAQ,GAAG,CAAC,CAAA;AAE9E,IAAA,KAAA,CAAM,GAAG,CAAA,GAAK,QAAA;AACd,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,CAAC,GAAG,SAAS,KAAK,CAAA;AAAA,EAClC;AAEA,EAAA,MAAM,MAAA,GAASA,mBAAAA,CAAoB,KAAA,CAAM,MAAM,CAAA;AAE/C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACtC,IAAA,OAAA,CAAQ,IAAI,CAAA,KAAM,SAAA;AAAA,EACpB;AAEA,EAAA,OAAO,EAAE,MAAA,EAAQ,OAAA,EAAS,KAAA,EAA8B;AAC1D;;;AC9EO,IAAM,mBAAA,GAAN,cAAkC,KAAA,CAAM;AAAA,EAC7C,YAAY,IAAA,EAAc;AACxB,IAAA,KAAA,CAAM,CAAA,EAAG,IAAI,CAAA,mBAAA,CAAqB,CAAA;AAClC,IAAA,IAAA,CAAK,IAAA,GAAO,qBAAA;AAAA,EACd;AACF;AAOO,IAAM,wBAAA,GAAN,cAAuC,KAAA,CAAM;AAAA,EACzC,KAAA;AAAA,EAET,YAAY,KAAA,EAA0B;AACpC,IAAA,KAAA;AAAA,MACE;AAAA,QACE,+BAAA;AAAA,QACA,EAAA;AAAA,QACA,iCAAA;AAAA,QACA,EAAA;AAAA,QACA,sDAAA;AAAA,QACA,uCAAA;AAAA,QACA,+DAAA;AAAA,QACA,EAAA;AAAA,QACA,8CAAA;AAAA,QACA,4CAAA;AAAA,QACA,oDAAA;AAAA,QACA,EAAA;AAAA,QACA;AAAA,OACF,CAAE,KAAK,IAAI;AAAA,KACb;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AACZ,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,GAAG,KAAK,CAAA;AAAA,EACxB;AACF;AAGO,IAAM,oBAAA,GAAN,cAAmC,KAAA,CAAM;AAAA,EAC9C,WAAA,CAAY,WAAmB,KAAA,EAA0B;AACvD,IAAA,KAAA,CAAM,CAAA,kBAAA,EAAqB,SAAS,CAAA,cAAA,EAAiB,CAAC,GAAG,KAAK,CAAA,CAAE,IAAA,EAAK,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AACnF,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AAAA,EACd;AACF;ACnCA,IAAM,gBAAA,GAAwB,CAAA;AAC9B,IAAM,qBAAA,GAAwB,GAAA;AAE9B,IAAM,YAAA,GAAe,CAAC,EAAA,KAA8B;AAClD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,UAAA,CAAW,OAAA,EAAS,EAAE,CAAA,CAAE,KAAA,IAAQ;AAAA,EAClC,CAAC,CAAA;AACH,CAAA;AAIO,IAAM,YAAA,GAAe,CAAC,OAAA,EAAiB,WAAA,KAAgC;AAC5E,EAAA,OAAO,WAAA,GAAc,MAAM,OAAA,GAAU,CAAA,CAAA;AACvC;AAIO,IAAM,SAAA,GAAY,OAAU,IAAA,EAAwB,OAAA,GAAwB,EAAC,KAAkB;AACpG,EAAA,MAAM,QAAA,GAAc,QAAQ,QAAA,IAAY,gBAAA;AACxC,EAAA,MAAM,WAAA,GAAc,QAAQ,WAAA,IAAe,qBAAA;AAC3C,EAAA,MAAM,KAAA,GAAc,QAAQ,KAAA,IAAS,YAAA;AAErC,EAAA,IAAI,SAAA;AAEJ,EAAA,KAAA,IAAS,OAAA,GAAU,CAAA,EAAG,OAAA,IAAW,QAAA,EAAU,WAAW,CAAA,EAAG;AACvD,IAAA,IAAI;AACF,MAAA,OAAO,MAAM,IAAA,EAAK;AAAA,IACpB,SAAS,KAAA,EAAO;AACd,MAAA,SAAA,GAAY,KAAA;AAEZ,MAAA,IAAI,OAAA,KAAY,QAAA,IAAY,CAAC,wBAAA,CAAyB,KAAK,CAAA,EAAG;AAC5D,QAAA,MAAM,KAAA;AAAA,MACR;AAEA,MAAA,OAAA,CAAQ,OAAA,GAAU,SAAS,KAAK,CAAA;AAEhC,MAAA,MAAM,KAAA,CAAM,YAAA,CAAa,OAAA,EAAS,WAAW,CAAC,CAAA;AAAA,IAChD;AAAA,EACF;AAEA,EAAA,MAAM,SAAA;AACR;AC5CO,IAAM,cAAA,GAAiB;AAE9B,IAAM,eAAA,GAAkB,CAAA;AAqBjB,IAAM,cAAA,GAAiB;AAGvB,IAAM,aAAA,GAAgB;AAAA,EAC3B,qFAAA;AAAA,EACA,EAAA;AAAA,EACA,+EAAA;AAAA,EACA,2EAAA;AAAA,EACA,EAAA;AAAA,EACA,uBAAA;AAAA,EACA,mDAAA;AAAA,EACA,4EAAA;AAAA,EACA,yEAAA;AAAA,EACA,sEAAA;AAAA,EACA,2EAAA;AAAA,EACA,yBAAA;AAAA,EACA,mEAAA;AAAA,EACA,6EAAA;AAAA,EACA,qCAAA;AAAA,EACA,EAAA;AAAA,EACA,gEAAA;AAAA,EACA,0EAAA;AAAA,EACA,kDAAA;AAAA,EACA,yDAAA;AAAA,EACA,uEAAA;AAAA,EACA,yDAAA;AAAA,EACA,6EAAA;AAAA,EACA,oDAAA;AAAA,EACA,4EAAA;AAAA,EACA,mCAAA;AAAA,EACA,EAAA;AAAA,EACA,0EAAA;AAAA,EACA,4EAAA;AAAA,EACA,yDAAA;AAAA,EACA,EAAA;AAAA,EACA,aAAA;AAAA,EACA,+EAAA;AAAA,EACA,mEAAA;AAAA,EACA,4EAAA;AAAA,EACA,gDAAA;AAAA,EACA,0EAAA;AAAA,EACA,8EAAA;AAAA,EACA,8EAAA;AAAA,EACA,+EAAA;AAAA,EACA,4EAAA;AAAA,EACA,8EAAA;AAAA,EACA,+EAAA;AAAA,EACA,yBAAA;AAAA,EACA,wDAAA;AAAA,EACA,EAAA;AAAA,EACA,6EAAA;AAAA,EACA,qCAAA;AAAA,EACA,4DAAA;AAAA,EACA,EAAA;AAAA,EACA,6EAAA;AAAA,EACA,6EAAA;AAAA,EACA,+EAAA;AAAA,EACA,8EAAA;AAAA,EACA,8EAAA;AAAA,EACA,0EAAA;AAAA,EACA,EAAA;AAAA,EACA,uEAAA;AAAA,EACA,6EAAA;AAAA,EACA,6EAAA;AAAA,EACA,kEAAA;AAAA,EACA,0EAAA;AAAA,EACA,EAAA;AAAA,EACA,2EAAA;AAAA,EACA,uEAAA;AAAA,EACA,EAAA;AAAA,EACA,sEAAA;AAAA,EACA,yEAAA;AAAA,EACA,2EAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI;AAEX,IAAM,KAAA,GAAQ,CAAC,MAAA,KACb;AAAA,EACE,QAAQ,MAAA,CAAO,IAAI,GAAG,MAAA,CAAO,SAAA,GAAY,iBAAiB,EAAE,CAAA,CAAA;AAAA,EAC5D,EAAA;AAAA,EACA,CAAA,MAAA,EAAS,OAAO,QAAQ,CAAA,CAAA;AAAA,EACxB,MAAA,CAAO,OAAA;AAAA,EACP,KAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAGb,IAAM,eAAA,GAAkB,CAAC,OAAA,KAA2C;AAClE,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAoB;AAEvC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAA,CAAO,GAAA,CAAI,OAAO,IAAA,EAAA,CAAO,MAAA,CAAO,IAAI,MAAA,CAAO,IAAI,CAAA,IAAK,CAAA,IAAK,CAAC,CAAA;AAAA,EAC5D;AAEA,EAAA,OAAO,CAAC,GAAG,MAAA,CAAO,OAAA,EAAS,EACxB,IAAA,CAAK,CAAC,CAAC,KAAA,EAAO,MAAM,CAAA,EAAG,CAAC,KAAA,EAAO,MAAM,MAAM,MAAA,GAAS,MAAA,IAAU,cAAA,CAAe,KAAA,EAAO,KAAK,CAAC,CAAA,CAC1F,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,KAAK,CAAA,KAAM,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE,CAAA,CACzC,KAAK,IAAI,CAAA;AACd,CAAA;AAEA,IAAM,SAAA,GAAY,CAAC,IAAA,KAAyB;AAC1C,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,CAAA,QAAA,EAAW,KAAK,IAAI,CAAA,CAAA;AAAA,IACpB,CAAA,QAAA,EAAW,KAAK,IAAI,CAAA,CAAA;AAAA,IACpB,CAAA,SAAA,EAAY,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,IACxC,gBAAgB,IAAA,CAAK,KAAA,CAAM,KAAK,SAAA,CAC7B,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,EAAG,KAAA,CAAM,QAAQ,KAAK,KAAA,CAAM,KAAK,GAAG,CAAA,CACnD,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,GACf;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAA,KAAa,IAAA,EAAM;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,oBAAA,EAAuB,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA,EAAG;AACxC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,CAAM,IAAA,CAAK,UAC3B,GAAA,CAAI,CAAC,SAAS,IAAA,CAAK,IAAA,CAAK,MAAM,IAAA,CAAK,IAAA,CAAK,YAAY,GAAG,CAAA,GAAI,CAAC,CAAC,CAAA,CAC7D,KAAK,cAAc,CAAA;AACtB,IAAA,KAAA,CAAM,KAAK,CAAA,kCAAA,EAAqC,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,WAAW,EAAC;AAEhD,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,eAAA,CAAgB,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAA,KAAc,MAAA,EAAW;AACtC,IAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AACtD,IAAA,IAAI,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAA,KAAS,MAAA,EAAW;AAC3C,MAAA,KAAA,CAAM,KAAK,CAAA,kBAAA,EAAqB,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,IAAI,CAAA,CAAE,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AAIO,IAAM,eAAA,GAAkB,CAAC,KAAA,KAA+C;AAC7E,EAAA,MAAM,MAAA,GAAS;AAAA,IACb,CAAA,WAAA,EAAc,MAAM,aAAa,CAAA,CAAA;AAAA,IACjC,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,QAAQ,OAAO,CAAA,CAAA,CAAA;AAAA,IACxD,EAAA;AAAA,IACA,UAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAG,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA;AAAA,IACvB,EAAA;AAAA,IACA,YAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAG,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,IAC1B,CAAA,2BAAA,EAA8B,MAAM,IAAI,CAAA,CAAA;AAAA,GAC1C,CAAE,KAAK,IAAI,CAAA;AAEX,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,aAAA;AAAA,IACR,MAAA;AAAA,IACA,GAAI,MAAM,KAAA,KAAU,MAAA,GAAY,EAAC,GAAI,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM;AAAA,IAC1D,GAAI,MAAM,WAAA,KAAgB,MAAA,GAAY,EAAC,GAAI,EAAE,WAAA,EAAa,KAAA,CAAM,WAAA,EAAY;AAAA,IAC5E,QAAA,EAAU,EAAE,MAAA,EAAQ,KAAA,CAAM,KAAK,EAAA,EAAI,SAAA,EAAW,KAAA,CAAM,IAAA,CAAK,SAAA;AAAU,GACrE;AACF;AAIO,IAAM,eAAA,GAAkB,OAAO,IAAA,EAAc,IAAA,KAAsC;AACxF,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC5B,KAAK,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAA8B;AAC7D,MAAA,MAAM,GAAA,GAAY,MAAML,GAAAA,CAAG,QAAA,CAASC,KAAAA,CAAK,QAAQ,IAAA,EAAM,IAAA,CAAK,IAAI,CAAA,EAAG,MAAM,CAAA;AACzE,MAAA,MAAM,SAAA,GAAY,IAAI,MAAA,GAAS,cAAA;AAE/B,MAAA,OAAO;AAAA,QACL,MAAU,IAAA,CAAK,IAAA;AAAA,QACf,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,SAAU,SAAA,GAAY,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,cAAc,CAAA,GAAG,GAAA;AAAA,QACpD;AAAA,OACF;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,OAAA;AACT;AAIO,IAAM,cAAA,GAAiB,CAAC,OAAA,KAAuC;AACpE,EAAA,OAAO,IAAA,CAAK,OAAO,OAAA,CAAQ,MAAA,EAAQ,UAAU,CAAA,IAAK,OAAA,CAAQ,MAAA,CAAO,MAAA,IAAU,eAAe,CAAA;AAC5F;;;ACxNO,IAAM,kBAAA,GAAqB,OAAa,KAAA,EAAqB,KAAA,EAAe,IAAA,KAAgD;AACjI,EAAA,MAAM,OAAA,GAAU,IAAI,KAAA,CAAS,KAAA,CAAM,MAAM,CAAA;AACzC,EAAA,IAAI,MAAA,GAAY,CAAA;AAEhB,EAAA,MAAM,SAAS,YAA2B;AACxC,IAAA,OAAO,MAAA,GAAS,MAAM,MAAA,EAAQ;AAC5B,MAAA,MAAM,KAAA,GAAQ,MAAA;AAEd,MAAA,MAAA,IAAU,CAAA;AAEV,MAAA,MAAM,IAAA,GAAO,MAAM,KAAK,CAAA;AAExB,MAAA,IAAI,SAAS,MAAA,EAAW;AAExB,MAAA,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IAClC;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,QAAQ,GAAA,CAAI,KAAA,CAAM,KAAK,EAAE,MAAA,EAAQ,KAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,OAAO,KAAA,CAAM,MAAM,CAAC,CAAA,EAAE,EAAG,MAAM,CAAC,CAAA;AAC5F,EAAA,OAAO,OAAA;AACT,CAAA;ACFO,IAAM,QAAA,GAAW,OAAO,MAAA,EAAgB,QAAA,EAAkB,OAAA,KAAmC;AAClG,EAAA,MAAM,MAAA,GAASA,KAAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AAE5C,EAAA,MAAMD,GAAAA,CAAG,MAAMC,KAAAA,CAAK,OAAA,CAAQ,MAAM,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,CAAA;AACxD,EAAA,MAAMD,GAAAA,CAAG,SAAA,CAAU,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAC5C,CAAA;AAIO,IAAM,SAAA,GAAY,OAAO,QAAA,EAAoB,MAAA,EAAuB,IAAA,KAAiC;AAC1G,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,UAAU,QAAA,CAAS,GAAA,CAAI,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,EAAA,EAAI,KAAK,CAAC,CAAC,CAAA;AAEzF,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA;AAAA,IACzB,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAmC;AAC3D,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,SAAS,CAAA;AAE9C,MAAA,IAAI,YAAY,MAAA,EAAW;AACzB,QAAA,OAAO,MAAA;AAAA,MACT;AAEA,MAAA,MAAM,UAAU,eAAA,CAAgB;AAAA,QAC9B,IAAA;AAAA,QACA,OAAA;AAAA,QACA,aAAA,EAAe,SAAS,SAAA,CAAU,IAAA;AAAA,QAClC,OAAA,EAAe,MAAM,eAAA,CAAgB,IAAA,EAAM,IAAI,CAAA;AAAA,QAC/C,MAAe,MAAA,CAAO,IAAA;AAAA,QACtB,OAAe,MAAA,CAAO,KAAA;AAAA,QACtB,aAAe,MAAA,CAAO;AAAA,OACvB,CAAA;AAED,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA,EAAiB,YAAY,IAAI,CAAA;AAAA,QACjC,eAAA,EAAiB,eAAe,OAAO;AAAA,OACzC;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAoB,QAAQ,MAAS,CAAA;AAC3D,CAAA;ACjDO,IAAM,aAAA,GAAgB,CAAC,MAAA,KAAkC,MAAA,CAAO,KAAA,IAAS;AAUzE,IAAM,MAAA,GAAS,OAAO,GAAA,EAAU,KAAA,EAA+B,OAAA,KAAsD;AAC1H,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAU,MAAA,EAAW;AACvB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM;AACpC,IAAA,OAAO,iBAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,kBAAkB,cAAA,EAAgB;AAC1C,IAAA,OAAO,wBAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,KAAA,KAAU,OAAA,CAAQ,KAAA,EAAO;AACjC,IAAA,OAAO,eAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,OAAA,CAAQ,IAAA,EAAM;AAC/B,IAAA,OAAO,cAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAE,MAAM,UAAA,CAAWC,KAAAA,CAAK,OAAA,CAAQ,QAAQ,MAAA,EAAQ,GAAA,CAAI,OAAO,CAAC,CAAA,EAAI;AAClE,IAAA,OAAO,gBAAA;AAAA,EACT;AAEA,EAAA,OAAO,QAAA;AACT,CAAA;AChDO,IAAM,mBAAA,GAAsB;AAE5B,IAAM,mBAAA,GAAsB;AAQnC,IAAM,oBAAA,GAA+C;AAAA,EACnD;AAAA,IACE,MAAA,EAAS,gEAAA;AAAA,IACT,OAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,MAAA,EAAS,qEAAA;AAAA,IACT,OAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,MAAA,EAAS,uCAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAS,0DAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAS,oDAAA;AAAA,IACT,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,MAAA,EAAS,oDAAA;AAAA,IACT,OAAA,EAAS;AAAA;AAEb,CAAA;AAEA,IAAM,KAAA,GAAc,mBAAA;AACpB,IAAM,WAAA,GAAc,qBAAA;AAQpB,IAAM,SAAA,GAAY,CAAC,IAAA,KAA+B;AAChD,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,IAAIK,MAAAA;AAEJ,EAAA,KAAA,MAAW,IAAA,IAAQ,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,EAAG;AACtC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAE7B,IAAA,IAAIA,WAAU,MAAA,EAAW;AACvB,MAAA,IAAI,UAAU,IAAA,EAAM;AAClB,QAAAA,MAAAA,GAAQ,MAAM,CAAC,CAAA;AAAA,MACjB;AAEA,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,MAAM,MAAA,EAAQ,KAAA,KAAU,MAAM,CAAA;AAEjD,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,MAAM,CAAA;AAEvC,IAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,CAAC,MAAMA,MAAAA,EAAO;AACxC,MAAAA,MAAAA,GAAQ,MAAA;AAAA,IACV;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT,CAAA;AAOA,IAAM,iBAAiB,CAAC,YAAA,EAAsB,MAAA,EAAgB,MAAA,KAC5D,IAAI,aAAA,CAAc;AAAA,EAChB,QAAA,EAAU,YAAA;AAAA,EACV,IAAA,EAAU,iBAAA;AAAA,EACV,OAAA,EAAU,mCAAmC,MAAM,CAAA,CAAA;AAAA,EACnD;AACF,CAAC,CAAA;AAGI,IAAM,OAAA,GAAU,CAAC,IAAA,EAAc,KAAA,KAA0B;AAC9D,EAAA,MAAM,OAAO,IAAA,CAAK,OAAA,CAAQ,MAAA,EAAQ,GAAG,EAAE,IAAA,EAAK;AAC5C,EAAA,OAAO,IAAA,CAAK,MAAA,IAAU,KAAA,GAAQ,IAAA,GAAO,CAAA,EAAG,KAAK,KAAA,CAAM,CAAA,EAAG,KAAA,GAAQ,CAAC,CAAC,CAAA,MAAA,CAAA;AAClE;AAGO,IAAM,iBAAA,GAAoB,CAAC,YAAA,EAAsB,IAAA,KAAqC;AAC3F,EAAA,MAAM,KAAA,GAAQ,UAAU,IAAI,CAAA;AAC5B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,SAAA,CAAU,CAAC,IAAA,KAAS,CAAC,IAAA,CAAK,MAAA,IAAU,WAAA,CAAY,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAEnF,EAAA,IAAI,UAAU,EAAA,EAAI;AAChB,IAAA,MAAM,cAAA;AAAA,MACJ,YAAA;AAAA,MACA,iCAAA;AAAA,MACA,OAAA,CAAQ,IAAA,EAAM,GAAG,CAAA,IAAK;AAAA,KACxB;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,KAAA,CACb,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA,CACd,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA,CACvB,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AAER,EAAA,IAAI,OAAA,CAAQ,SAAS,mBAAA,EAAqB;AACxC,IAAA,MAAM,cAAA;AAAA,MACJ,YAAA;AAAA,MACA,CAAA,EAAG,OAAA,CAAQ,MAAM,CAAA,yDAAA,EAA4D,mBAAmB,CAAA,MAAA,CAAA;AAAA,MAChG,OAAA,CAAQ,SAAS,GAAG;AAAA,KACtB;AAAA,EACF;AAEA,EAAA,MAAM,IAAA,GAAO,KAAA,CACV,KAAA,CAAM,KAAK,EACX,GAAA,CAAI,CAAC,IAAA,KAAS,IAAA,CAAK,IAAI,CAAA,CACvB,IAAA,CAAK,IAAI,EACT,IAAA,EAAK;AAER,EAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,OAAA,KAAY,EAAA,GAAK,SAAY,OAAA,EAAQ;AAChE;AAOA,IAAM,aAAA,GAAgB,CAAC,IAAA,EAAc,KAAA,KAA0B;AAC7D,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,EAAE,CAAA;AACpC,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,MAAA,EAAQ,KAAA,GAAQ,EAAE,CAAC,CAAA,EAAG,GAAG,CAAA;AAC1E,CAAA;AAGO,IAAM,kBAAA,GAAqB,CAAC,IAAA,KAA6C;AAC9E,EAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAE1B,EAAA,IAAI,OAAA,CAAQ,SAAS,mBAAA,EAAqB;AACxC,IAAA,OAAO;AAAA,MACL,MAAA,EAAS,CAAA,gBAAA,EAAmB,OAAA,CAAQ,MAAM,0BAA0B,mBAAmB,CAAA,QAAA,CAAA;AAAA,MACvF,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,GAAG;AAAA,KAC/B;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,oBAAA,EAAsB;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,CAAA;AAEvC,IAAA,IAAI,UAAU,IAAA,EAAM;AAClB,MAAA,OAAO,EAAE,QAAQ,IAAA,CAAK,MAAA,EAAQ,SAAS,aAAA,CAAc,OAAA,EAAS,KAAA,CAAM,KAAK,CAAA,EAAE;AAAA,IAC7E;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAGO,IAAM,qBAAA,GAAwB,CAAC,YAAA,EAAsB,IAAA,KAAuB;AACjF,EAAA,MAAM,OAAA,GAAU,mBAAmB,IAAI,CAAA;AAEvC,EAAA,IAAI,YAAY,MAAA,EAAW;AAE3B,EAAA,MAAM,cAAA,CAAe,YAAA,EAAc,OAAA,CAAQ,MAAA,EAAQ,QAAQ,OAAO,CAAA;AACpE;AAQO,IAAM,eAAA,GAAkB,CAAC,YAAA,EAAsB,IAAA,KAAmC;AACvF,EAAA,MAAM,EAAE,IAAA,EAAM,QAAA,EAAS,GAAI,iBAAA,CAAkB,cAAc,IAAI,CAAA;AAC/D,EAAA,qBAAA,CAAsB,cAAc,IAAI,CAAA;AAExC,EAAA,OAAO,EAAE,IAAA,EAAM,eAAA,EAAiB,QAAA,EAAS;AAC3C;;;ACjKA,IAAM,SAAA,GAAY,CAAC,IAAA,EAAc,MAAA,KAA2B;AAC1D,EAAA,MAAM,WAAW,OAAA,CAAQL,KAAAA,CAAK,QAAA,CAAS,IAAA,EAAM,MAAM,CAAC,CAAA;AAEpD,EAAA,OAAO,QAAA,KAAa,KAAK,GAAA,GAAM,QAAA;AACjC,CAAA;AAgBA,IAAM,QAAA,GAAW,CAAC,SAAA,EAAgC,QAAA,KAAmC;AACnF,EAAA,MAAM,WAAW,QAAA,CAAS,SAAA,CAAU,QAAA,CACjC,GAAA,CAAI,CAAC,OAAA,KAAY;AAChB,IAAA,MAAM,GAAA,GAAM,SAAA,CAAU,MAAA,CAAO,CAAC,EAAE,GAAA,EAAI,KAAM,GAAA,CAAI,IAAA,CAAK,SAAA,KAAc,OAAA,CAAQ,EAAE,CAAA;AAE3E,IAAA,OAAO;AAAA,MACL,IAAiB,OAAA,CAAQ,EAAA;AAAA,MACzB,MAAiB,OAAA,CAAQ,IAAA;AAAA,MACzB,OAAA,EAAiB,IAAI,MAAA,CAAO,CAAC,EAAE,MAAA,EAAO,KAAM,MAAA,KAAW,QAAQ,CAAA,CAAE,MAAA;AAAA,MACjE,MAAA,EAAiB,IAAI,MAAA,CAAO,CAAC,EAAE,MAAA,EAAO,KAAM,MAAA,KAAW,QAAQ,CAAA,CAAE,MAAA;AAAA,MACjE,iBAAiB,GAAA,CACd,MAAA,CAAO,CAAC,EAAE,MAAA,OAAa,MAAA,KAAW,QAAQ,EAC1C,MAAA,CAAO,CAAC,KAAK,EAAE,GAAA,OAAU,GAAA,GAAM,GAAA,CAAI,iBAAiB,CAAC;AAAA,KAC1D;AAAA,EACF,CAAC,EACA,MAAA,CAAO,CAAC,YAAY,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAE3D,EAAA,OAAO;AAAA,IACL,OAAA,EAAiB,SAAS,MAAA,CAAO,CAAC,KAAK,OAAA,KAAY,GAAA,GAAM,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA;AAAA,IAC3E,MAAA,EAAiB,SAAS,MAAA,CAAO,CAAC,KAAK,OAAA,KAAY,GAAA,GAAM,OAAA,CAAQ,MAAA,EAAQ,CAAC,CAAA;AAAA,IAC1E,eAAA,EAAiB,SAAS,MAAA,CAAO,CAAC,KAAK,OAAA,KAAY,GAAA,GAAM,OAAA,CAAQ,eAAA,EAAiB,CAAC,CAAA;AAAA,IACnF;AAAA,GACF;AACF,CAAA;AAGA,IAAM,WAAA,GAAc,CAAC,KAAA,EAAgB,KAAA,KAAsC;AACzE,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,UAAU,IAAA,IAAQ,EAAE,SAAS,KAAA,CAAA,EAAQ;AACpE,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAS,MAAkC,KAAK,CAAA;AAEtD,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C,CAAA;AAGO,IAAM,QAAA,GAAW,OAAO,GAAA,KAAkD;AAC/E,EAAA,MAAM,SAAc,GAAA,CAAI,MAAA,IAAUI,mBAAAA,CAAoB,KAAA,CAAM,EAAE,CAAA;AAC9D,EAAA,MAAM,OAAA,GAAc,MAAM,IAAA,CAAK,GAAG,CAAA;AAClC,EAAA,MAAM,WAAA,GAAc,QAAQ,QAAA,CAAS,WAAA;AACrC,EAAA,MAAM,IAAA,GAAc,OAAA,CAAQ,QAAA,CAAS,SAAA,CAAU,IAAA;AAC/C,EAAA,MAAM,QAAA,GAAc,EAAE,GAAG,OAAA,CAAQ,QAAA,EAAU,SAAS,SAAA,CAAU,IAAA,EAAM,GAAA,CAAI,MAAM,CAAA,EAAE;AAEhF,EAAA,MAAM,YAAkB,GAAA,CAAI,SAAA,IAAaJ,KAAAA,CAAK,OAAA,CAAQ,MAAM,kBAAkB,CAAA;AAC9E,EAAA,MAAM,KAAA,GAAkB,cAAc,MAAM,CAAA;AAC5C,EAAA,MAAM,QAAA,GAAkB,MAAM,SAAA,CAAU,SAAS,CAAA;AACjD,EAAA,MAAM,eAAA,GAAkB,WAAW,QAAQ,CAAA;AAE3C,EAAA,MAAM,OAAA,GAAU,MAAM,SAAA,CAAU,QAAA,EAAU,QAAQ,IAAI,CAAA;AAEtD,EAAA,MAAM,UAAU,GAAA,CAAI,IAAA,KAAS,SAAY,MAAA,GAAY,SAAA,CAAU,IAAI,IAAI,CAAA;AAEvE,EAAA,MAAM,aAAa,CAAC,GAAA,KAClB,YAAY,MAAA,IACZ,OAAA,CAAQ,IAAI,IAAA,CAAK,EAAE,CAAA,IACnB,OAAA,CAAQ,IAAI,IAAA,CAAK,IAAI,KACrB,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AAEvB,EAAA,MAAM,QAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAC7C,EAAA,MAAM,cAAc,OAAA,CACjB,MAAA,CAAO,CAAC,GAAA,KAAQ,CAAC,WAAW,GAAG,CAAC,CAAA,CAChC,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,EAAE,CAAA,CACxB,KAAK,cAAc,CAAA;AAEtB,EAAA,MAAM,eAAA,GAAmC;AAAA,IACvC,QAAQ,GAAA,CAAI,MAAA;AAAA,IACZ,KAAA;AAAA,IACA,MAAO,MAAA,CAAO,IAAA;AAAA,IACd,KAAA,EAAO,IAAI,KAAA,KAAU;AAAA,GACvB;AAEA,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC9B,QAAA,CAAS,GAAA,CAAI,OAAO,GAAA,MAAS;AAAA,MAC3B,GAAA;AAAA,MACA,MAAA,EAAQ,MAAM,MAAA,CAAO,GAAA,EAAK,eAAA,CAAgB,IAAI,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA,EAAG,eAAe;AAAA,KAC7E,CAAE;AAAA,GACJ;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,OAAA,KAA8C;AAC/D,IAAA,MAAMM,QAAO,OAAA,CACV,GAAA,CAAI,CAAC,EAAE,GAAA,EAAK,QAAO,MAAO;AAAA,MACzB,MAAA,EAAiB,IAAI,IAAA,CAAK,EAAA;AAAA,MAC1B,SAAiB,GAAA,CAAI,OAAA;AAAA,MACrB,KAAA,EAAiB,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,KAAK,KAAA,CAAM,MAAA;AAAA,MAC3C,iBAAiB,GAAA,CAAI,eAAA;AAAA,MACrB,MAAA;AAAA,MACA,YAAY,MAAA,KAAW;AAAA,KACzB,CAAE,CAAA,CACD,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAEpD,IAAA,MAAM,YAAY,CAAC,UAAA,KAAgCA,MAChD,MAAA,CAAO,CAAC,UAAU,KAAA,CAAM,UAAA,KAAe,UAAU,CAAA,CACjD,OAAO,CAAC,GAAA,EAAK,UAAU,GAAA,GAAM,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAExD,IAAA,OAAO;AAAA,MACL,IAAA,EAAAA,KAAAA;AAAA,MACA,eAAA,EAAiB,UAAU,IAAI,CAAA;AAAA,MAC/B,WAAA,EAAiB,UAAU,KAAK,CAAA;AAAA,MAChC,SAAA,EAAiBA,MAAK,MAAA,CAAO,CAAC,UAAU,CAAC,KAAA,CAAM,UAAU,CAAA,CAAE;AAAA,KAC7D;AAAA,EACF,CAAA;AAEA,EAAA,IAAI,GAAA,CAAI,MAAA,KAAW,IAAA,IAAQ,GAAA,CAAI,aAAa,MAAA,EAAW;AACrD,IAAA,MAAM,KAAA,GAAQ,UAAU,SAAS,CAAA;AAEjC,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,SAAS,EAAC;AAAA,MACV,MAAS,KAAA,CAAM,IAAA;AAAA,MACf,UAAU,EAAC;AAAA,MACX,UAAU,EAAC;AAAA,MACX,WAAA;AAAA,MACA,SAAS,EAAC;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,iBAAiB,KAAA,CAAM,eAAA;AAAA,MACvB,aAAiB,KAAA,CAAM,WAAA;AAAA,MACvB,SAAA,EAAiB,CAAA;AAAA,MACjB,WAAiB,KAAA,CAAM,SAAA;AAAA,MACvB,MAAA,EAAiB;AAAA,KACnB;AAAA,EACF;AAEA,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,UAAA,KAAe,MAAA,GACjC,IAAI,QAAA,GACH,MAAM,GAAA,CAAI,UAAA,CAAW,QAAA,CAAS,SAAA,EAAW,QAAQ,CAAC,KAAM,GAAA,CAAI,QAAA;AAEjE,EAAA,MAAM,OAAA,GAAU,SAAA,KAAc,MAAA,GAC1B,SAAA,GACA,UAAU,MAAA,CAAO,CAAC,EAAE,GAAA,OAAU,SAAA,CAAU,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,SAAS,CAAC,CAAA;AAExE,EAAA,MAAM,UAAA,GAAa,SAAA,KAAc,MAAA,GAC7B,EAAC,GACD,SAAA,CACG,MAAA,CAAO,CAAC,EAAE,GAAA,EAAI,KAAM,CAAC,SAAA,CAAU,SAAS,GAAA,CAAI,IAAA,CAAK,SAAS,CAAC,CAAA,CAC3D,GAAA,CAAI,CAAC,EAAE,GAAA,EAAI,KAAM,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AAEnC,EAAA,MAAM,EAAE,IAAA,EAAM,eAAA,EAAiB,aAAa,SAAA,EAAU,GAAI,UAAU,OAAO,CAAA;AAE3E,EAAA,MAAM,iBAAA,GAAoB,CAAC,GAAG,WAAA,EAAa,GAAG,UAAU,CAAA,CAAE,KAAK,cAAc,CAAA;AAE7E,EAAA,MAAM,WAA8B,GAAA,CAAI,QAAA;AACxC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,WAA8B,EAAC;AACrC,EAAA,MAAM,SAAA,uBAAkC,GAAA,EAAoB;AAC5D,EAAA,MAAM,OAAA,GAA8B,QAAQ,MAAA,CAAO,CAAC,EAAE,MAAA,EAAO,KAAM,WAAW,QAAQ,CAAA;AAEtF,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,IAAI,OAAA;AAEJ,EAAA,MAAM,QAAU,OAAA,CAAQ,MAAA;AACxB,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAA+B,GAAA,CAAI,UAAU,KAAK,CAAA;AAElE,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,EAAgB,OAAA,EAAsB,UAAA,KAA6B;AACnF,IAAA,SAAA,IAAa,CAAA;AACb,IAAA,MAAA,CAAO,EAAE,MAAM,WAAA,EAAa,MAAA,EAAQ,OAAO,SAAA,EAAW,KAAA,EAAO,OAAA,EAAS,UAAA,EAAY,CAAA;AAAA,EACpF,CAAA;AAEA,EAAA,KAAA,MAAW,EAAE,GAAA,EAAI,IAAK,OAAA,CAAQ,MAAA,CAAO,CAAC,EAAE,MAAA,EAAO,KAAM,MAAA,KAAW,QAAQ,CAAA,EAAG;AACzE,IAAA,MAAA,CAAO,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,SAAA,GAAY,CAAA,EAAG,KAAA,EAAO,CAAA;AAC/E,IAAA,QAAA,CAAS,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,QAAA,EAAU,CAAC,CAAA;AAAA,EACnC;AAEA,EAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,OAAA,EAAS,OAAO,WAAA,EAAa,OAAO,EAAE,GAAA,EAAI,KAAM;AACxF,IAAA,IAAI,YAAY,MAAA,EAAW;AACzB,MAAA,OAAA,CAAQ,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACxB,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,IAAA,MAAA,CAAO,EAAE,IAAA,EAAM,YAAA,EAAc,MAAA,EAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,KAAA,EAAO,SAAA,GAAY,CAAA,EAAG,KAAA,EAAO,CAAA;AAE/E,IAAA,IAAI;AACF,MAAA,MAAM,UAAA,GAAa,MAAM,SAAA,CAAU,MAAM,QAAA,CAAS,SAAS,GAAA,CAAI,OAAO,CAAA,EAAG,GAAA,CAAI,KAAK,CAAA;AAElF,MAAA,MAAM,QAAA,GAAW,eAAA,CAAgB,QAAA,CAAS,IAAA,EAAM,WAAW,IAAI,CAAA;AAE/D,MAAA,IAAI,QAAA,CAAS,oBAAoB,KAAA,CAAA,EAAW;AAC1C,QAAA,QAAA,CAAS,IAAA,CAAK;AAAA,UACZ,MAAA,EAAS,IAAI,IAAA,CAAK,EAAA;AAAA,UAClB,OAAA,EAAS,SAAS,eAAA,CAAgB,MAAA;AAAA,UAClC,OAAA,EAAS,OAAA,CAAQ,QAAA,CAAS,eAAA,EAAiB,GAAG;AAAA,SAC/C,CAAA;AAAA,MACH;AAEA,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,EAAA,EAAI,aAAa,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AACzD,MAAA,OAAO,EAAE,GAAA,EAAK,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK;AAAA,IACpC,SAAS,KAAA,EAAO;AACd,MAAA,MAAM,OAAA,GAA2B;AAAA,QAC/B,MAAA,EAAQ,IAAI,IAAA,CAAK,EAAA;AAAA,QACjB,QAAQ,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAS,OAAO,KAAK,CAAA;AAAA,QAC5D,IAAA,EAAQ,WAAA,CAAY,KAAA,EAAO,MAAM,CAAA;AAAA,QACjC,MAAA,EAAQ,WAAA,CAAY,KAAA,EAAO,QAAQ;AAAA,OACrC;AAEA,MAAA,QAAA,CAAS,KAAK,OAAO,CAAA;AAErB,MAAA,IAAI,OAAA,KAAY,MAAA,IAAa,oBAAA,CAAqB,KAAK,CAAA,EAAG;AACxD,QAAA,OAAA,GAAU;AAAA,UACR,QAAW,OAAA,CAAQ,MAAA;AAAA,UACnB,IAAA,EAAW,QAAQ,IAAA,IAAQ,SAAA;AAAA,UAC3B,QAAW,OAAA,CAAQ,MAAA;AAAA,UACnB,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AAEA,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,EAAA,EAAI,UAAU,IAAA,CAAK,GAAA,KAAQ,SAAS,CAAA;AACtD,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AAED,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,SAAA,EAAW,QAAQ,MAAA,EAAO;AAAA,EACpD;AAEA,EAAA,MAAM,UAAsB,EAAC;AAC7B,EAAA,MAAM,QAAsB,EAAC;AAE7B,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,IAAI,YAAY,MAAA,EAAW;AAE3B,IAAA,MAAM,QAAA;AAAA,MACJ,GAAA,CAAI,MAAA;AAAA,MACJ,QAAQ,GAAA,CAAI,OAAA;AAAA,MACZ,aAAA,CAAc;AAAA,QACZ,IAAA,EAAS,QAAQ,GAAA,CAAI,IAAA;AAAA,QACrB,OAAA,EAAS,QAAQ,GAAA,CAAI,OAAA;AAAA,QACrB,MAAS,OAAA,CAAQ,IAAA;AAAA,QACjB;AAAA,OACD;AAAA,KACH;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAC,CAAA;AACzC,IAAA,SAAA,CAAU,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,QAAQ,IAAI,CAAA;AAC/C,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,MAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,EAAA;AAAA,MAChC,QAAA,EAAe,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAA;AAAA,MAChC,aAAA,EAAe,cAAA;AAAA,MACf,KAAA;AAAA,MACA,MAAY,MAAA,CAAO,IAAA;AAAA,MACnB,UAAA,EAAY,QAAQ,GAAA,CAAI,OAAA;AAAA,MACxB;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,eAAe,CAAA;AAEtC,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,WAAA,GAAc,IAAI,GAAA,CAAI,QAAA,CAAS,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,EAAE,CAAC,CAAA;AAEjE,EAAA,MAAM,SAAA,GAAuB;AAAA,IAC3B,OAAA,EAAS,YAAW,CAAE,OAAA;AAAA,IACtB,OAAA,EAAS,CAAC,GAAG,MAAA,CAAO,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,KAAA,KAAU,WAAA,CAAY,GAAA,CAAI,KAAA,CAAM,MAAM,CAAC;AAAA,GAC/E;AAEA,EAAA,MAAM,UAAA,CAAW,WAAW,SAAS,CAAA;AACrC,EAAA,MAAM,QAAA,CAAS,IAAI,MAAA,EAAQ,cAAA,EAAgB,eAAe,EAAE,QAAA,EAAU,WAAA,EAAa,CAAC,CAAA;AAEpF,EAAA,OAAA,CAAQ,KAAK,cAAc,CAAA;AAE3B,EAAA,MAAM,eAAA,GAA0B,QAAA,CAAS,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAC3D,IAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,IAAA,CAAK,EAAE,CAAA;AACrC,IAAA,OAAO,YAAY,MAAA,GAAY,IAAA,GAAO,EAAE,GAAG,MAAM,OAAA,EAAQ;AAAA,EAC3D,CAAC,CAAA;AAED,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,EAAE,GAAG,QAAA,EAAU,OAAO,eAAA,EAAgB;AAAA,IAChD,OAAA,EAAU,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA;AAAA,IACrC,IAAA;AAAA,IACA,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACpE,QAAA,EAAU,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,cAAA,CAAe,CAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,MAAM,CAAC,CAAA;AAAA,IACpE,WAAA,EAAa,iBAAA;AAAA,IACb,OAAA,EAAa,OAAA,CAAQ,IAAA,CAAK,cAAc,CAAA;AAAA,IACxC,OAAA;AAAA,IACA,eAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAW,KAAA,CAAM,MAAA;AAAA,IACjB,SAAA;AAAA,IACA,MAAA,EAAQ;AAAA,GACV;AACF;;;AClUO,IAAM,mBAAA,GAAsB,CAAC,aAAA,EAAe,WAAW;AAc9D,IAAM,YAAA,GAAe,CAAC,SAAA,KACpB,CAAC,GAAG,SAAS,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5B,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAEhD,EAAA,IAAI,UAAU,KAAA,EAAO;AACnB,IAAA,IAAI,KAAA,KAAU,IAAI,OAAO,CAAA;AACzB,IAAA,IAAI,KAAA,KAAU,IAAI,OAAO,EAAA;AAEzB,IAAA,OAAO,KAAA,GAAQ,KAAA;AAAA,EACjB;AAEA,EAAA,OAAO,cAAA,CAAe,CAAA,CAAE,IAAA,EAAM,CAAA,CAAE,IAAI,CAAA;AACtC,CAAC,CAAA;AAGI,IAAM,cAAA,GAAiB,OAAO,SAAA,KACnC,OAAA,CAAQ,GAAA;AAAA,EACN,YAAA,CAAa,SAAS,CAAA,CAAE,GAAA,CAAI,OAAO,QAAA,MAAc;AAAA,IAC/C,MAAW,QAAA,CAAS,IAAA;AAAA,IACpB,WAAW,MAAM,QAAA,CAAS,WAAU,CAAE,KAAA,CAAM,MAAM,KAAK;AAAA,GACzD,CAAE;AACJ;AAOK,IAAM,eAAA,GAAkB,OAAO,OAAA,KAAuD;AAC3F,EAAA,MAAM,QAAW,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAC,QAAA,KAAa,SAAS,IAAI,CAAA;AAClE,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,MAAA,EAAQ,QAAA;AAEtD,EAAA,IAAI,QAAA,KAAa,MAAA,IAAa,QAAA,KAAa,EAAA,EAAI;AAC7C,IAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,CAAU,IAAA,CAAK,CAAC,QAAA,KAAa,QAAA,CAAS,SAAS,QAAQ,CAAA;AAE7E,IAAA,IAAI,UAAU,MAAA,EAAW;AACvB,MAAA,MAAM,IAAI,oBAAA,CAAqB,QAAA,EAAU,KAAK,CAAA;AAAA,IAChD;AAEA,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,QAAA,IAAY,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtD,IAAA,IAAI,MAAM,QAAA,CAAS,SAAA,GAAY,KAAA,CAAM,MAAM,KAAK,CAAA,EAAG;AACjD,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,IAAI,yBAAyB,KAAK,CAAA;AAC1C;;;ACpEO,IAAM,WAAN,MAA2C;AAAA,EACvC,MAAA,uBAAa,GAAA,EAAe;AAAA,EAErC,SAAS,IAAA,EAAe;AACtB,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAC/B,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,IAAA,EAA6B;AAC/B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEA,IAAI,IAAA,EAAuB;AACzB,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA;AAAA,EAC7B;AAAA,EAEA,IAAA,GAAY;AACV,IAAA,OAAO,CAAC,GAAG,IAAA,CAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,EACjC;AAAA,EAEA,IAAI,IAAA,GAAe;AACjB,IAAA,OAAO,KAAK,MAAA,CAAO,IAAA;AAAA,EACrB;AACF;AAKO,IAAM,qBAAA,GAAwB,CAAC,QAAA,GAAoB,EAAC,KAAuB;AAChF,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAgB;AAErC,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,QAAA,CAAS,SAAS,OAAO,CAAA;AAAA,EAC3B;AAEA,EAAA,OAAO,QAAA;AACT;AAEO,IAAM,sBAAA,GAAyB,CAAC,SAAA,GAAwB,EAAC,KAAwB;AACtF,EAAA,MAAM,QAAA,GAAW,IAAI,QAAA,EAAmB;AAExC,EAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,IAAA,QAAA,CAAS,SAAS,QAAQ,CAAA;AAAA,EAC5B;AAEA,EAAA,OAAO,QAAA;AACT;;;ACnCA,IAAM,eAAA,GAAkB,CAAC,OAAA,EAA4B,KAAA,KACnD;AAAA,EACE,iBAAA;AAAA,EACA,EAAA;AAAA,EACA,CAAA,0BAAA,EAA6B,KAAK,CAAA,KAAA,EAAQ,MAAA,CAAO,QAAQ,QAAA,CAAS,MAAA,IAAU,QAAQ,CAAC,CAAA,CAAA,CAAA;AAAA,EACrF,EAAA;AAAA,EACA,qBAAA;AAAA,EACA,EAAA;AAAA,EACA,sEAAA;AAAA,EACA,oEAAA;AAAA,EACA,EAAA;AAAA,EACA,oBAAA;AAAA,EACA,EAAA;AAAA,EACA,4DAAA;AAAA,EACA,EAAA;AAAA,EACA,4BAAA;AAAA,EACA,EAAA;AAAA,EACA;AACF,CAAA,CAAE,KAAK,IAAI,CAAA;AAIN,IAAM,kBAAA,GAAqB,CAAC,OAAA,GAA+B,EAAC,KAAoB;AACrF,EAAA,MAAM,QAA6B,EAAC;AAEpC,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,IACtB,KAAA;AAAA,IACA,SAAA,EAAW,YAAwD,OAAA,CAAQ,SAAA,IAAa,IAAA;AAAA,IACxF,QAAA,EAAW,OAAO,OAAA,KAA0D;AAC1E,MAAA,MAAM,QAAQ,KAAA,CAAM,MAAA;AACpB,MAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAElB,MAAA,MAAM,IAAA,GAAO,QAAQ,OAAA,GAAU,OAAA,EAAS,KAAK,CAAA,IAAK,eAAA,CAAgB,SAAS,KAAK,CAAA;AAChF,MAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,EAAE,WAAA,EAAa,EAAA,EAAI,YAAA,EAAc,CAAA,EAAE,EAAE;AAAA,IAClF;AAAA,GACF;AACF;;;ACjDO,IAAM,eAAuB,eAAA,CAAS","file":"index.js","sourcesContent":["{\n \"name\": \"@glossic/core\",\n \"version\": \"0.6.0\",\n \"description\": \"Glossic orchestration core: registries, pipeline and manifest plumbing\",\n \"keywords\": [\n \"documentation\",\n \"docs\",\n \"docs-as-code\",\n \"glossic\",\n \"orchestration\",\n \"pipeline\",\n \"manifest\",\n \"incremental\",\n \"cache\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Rody Huancas\",\n \"homepage\": \"https://github.com/rody-huancas/glossic#readme\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/rody-huancas/glossic.git\",\n \"directory\": \"packages/core\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/rody-huancas/glossic/issues\"\n },\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"files\": [\n \"dist\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"test\": \"vitest run\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@glossic/schema\": \"workspace:*\",\n \"jiti\": \"^2.6.1\",\n \"picomatch\": \"^4.0.3\",\n \"tinyglobby\": \"^0.2.15\",\n \"yaml\": \"^2.8.1\",\n \"zod\": \"^4.1.5\"\n }\n}\n","import fs from \"node:fs/promises\";\n\n/** True when the path can be reached; never throws. */\nexport const pathExists = async (target: string): Promise<boolean> => {\n try {\n await fs.access(target);\n return true;\n } catch {\n return false;\n }\n};\n\n/** File contents, or undefined when it cannot be read. */\nexport const readText = async (target: string): Promise<string | undefined> => {\n try {\n return await fs.readFile(target, \"utf8\");\n } catch {\n return undefined;\n }\n};\n\n/** Parsed JSON, or undefined when the file is missing or malformed. */\nexport const readJson = async <T>(target: string): Promise<T | undefined> => {\n const raw = await readText(target);\n \n if (raw === undefined) {\n return undefined;\n }\n\n try {\n return JSON.parse(raw) as T;\n } catch {\n return undefined;\n }\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\nimport { sortBy } from \"./utils/index.js\";\n\nexport const DEFAULT_CACHE_PATH = \".glossic/cache.json\";\n/** Bumped by hand when the entry shape changes; a mismatch discards the whole file. */\nexport const CACHE_VERSION = \"1\";\n\n/** What a unit was documented from, so the next run can tell whether anything moved. */\nexport const CacheEntrySchema = z.object({\n unitId : z.string().min(1),\n unitHash : z.string().min(1),\n promptVersion: z.string().min(1),\n model : z.string().min(1),\n lang : z.string().min(1),\n outputPath : z.string().min(1),\n generatedAt : z.string().min(1),\n});\nexport type CacheEntry = z.infer<typeof CacheEntrySchema>;\n\nexport const CacheFileSchema = z.object({\n version: z.string().min(1),\n entries: z.array(CacheEntrySchema),\n});\nexport type CacheFile = z.infer<typeof CacheFileSchema>;\n\nexport const emptyCache = (): CacheFile => ({ version: CACHE_VERSION, entries: [] });\n\n\n/** Reads the cache, returning an empty one for a missing, corrupt or outdated file. */\nexport const readCache = async (target: string): Promise<CacheFile> => {\n try {\n const raw = await fs.readFile(path.resolve(target), \"utf8\");\n const parsed = CacheFileSchema.parse(JSON.parse(raw));\n\n return parsed.version === CACHE_VERSION ? parsed : emptyCache();\n } catch {\n return emptyCache();\n }\n};\n\n/** JSON with the entries sorted by unit id, so the file does not churn between runs. */\nexport const serializeCache = (cache: CacheFile): string => {\n return `${JSON.stringify({ ...cache, entries: sortBy(cache.entries, (entry) => entry.unitId) }, null, 2)}\\n`;\n}\n\n/** Writes the cache, creating its directory. Returns the absolute path written. */\nexport const writeCache = async (cache: CacheFile, target: string): Promise<string> => {\n const absolute = path.resolve(target);\n\n await fs.mkdir(path.dirname(absolute), { recursive: true });\n await fs.writeFile(absolute, serializeCache(cache), \"utf8\");\n\n return absolute;\n};\n\n/** Entries keyed by unit id, for lookups while deciding what to regenerate. */\nexport const indexCache = (cache: CacheFile): Map<string, CacheEntry> => {\n return new Map(cache.entries.map((entry) => [entry.unitId, entry]));\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { ExtractResult, Manifest, Relation, Unit, Workspace } from \"@glossic/schema\";\nimport { MANIFEST_VERSION, ManifestSchema } from \"@glossic/schema\";\n\nimport { compareStrings, sortBy } from \"./utils/index.js\";\n\nexport const DEFAULT_MANIFEST_PATH = \".glossic/manifest.json\";\n\nexport interface BuildManifestOptions {\n generatedAt?: string;\n}\n\n/** Sorts everything inside one unit, so its hash does not depend on walk order. */\nconst sortUnit = (unit: Unit): Unit => ({\n ...unit,\n facts: {\n ...unit.facts,\n base: {\n ...unit.facts.base,\n files : sortBy(unit.facts.base.files, (file) => file.path),\n languages: [...unit.facts.base.languages].sort(\n (a, b) => b.count - a.count || compareStrings(a.language, b.language),\n ),\n },\n producedBy: [...unit.facts.producedBy].sort(compareStrings),\n },\n});\n\nconst compareRelations = (a: Relation, b: Relation): number => {\n return compareStrings(a.from, b.from) || compareStrings(a.to, b.to) || compareStrings(a.kind, b.kind);\n}\n\n\n/** Assembles the manifest, sorting every list so two runs over the same code match. */\nexport const buildManifest = (workspace: Workspace, results: readonly ExtractResult[], options: BuildManifestOptions = {}): Manifest => {\n const units = results.flatMap((result) => result.units).map(sortUnit);\n const relations = results.flatMap((result) => result.relations);\n\n return ManifestSchema.parse({\n version : MANIFEST_VERSION,\n generatedAt: options.generatedAt ?? new Date().toISOString(),\n workspace : {\n ...workspace,\n projects: sortBy(workspace.projects, (project) => project.id),\n },\n units : sortBy(units, (unit) => unit.id),\n relations: [...relations].sort(compareRelations),\n });\n};\n\n/** The manifest as it lands on disk: JSON, two-space indent, trailing newline. */\nexport const serializeManifest = (manifest: Manifest): string => {\n return `${JSON.stringify(manifest, null, 2)}\\n`;\n}\n\n\n/** Writes the manifest, creating its directory. Returns the absolute path written. */\nexport const writeManifest = async (manifest: Manifest, target: string): Promise<string> => {\n const absolute = path.resolve(target);\n\n await fs.mkdir(path.dirname(absolute), { recursive: true });\n await fs.writeFile(absolute, serializeManifest(manifest), \"utf8\");\n \n return absolute;\n};\n\n/** Reads and validates a manifest, or undefined when it is missing or invalid. */\nexport const readManifest = async (target: string): Promise<Manifest | undefined> => {\n try {\n const raw = await fs.readFile(path.resolve(target), \"utf8\");\n return ManifestSchema.parse(JSON.parse(raw));\n } catch {\n return undefined;\n }\n};\n","import type { EnrichResult, ExtractResult, SymbolFact, Unit, UnitEnrichment } from \"@glossic/schema\";\n\nimport { compareStrings } from \"../utils/index.js\";\n\n/** Total order over symbols, so the list does not depend on which pass found them. */\nconst compareSymbols = (a: SymbolFact, b: SymbolFact): number => {\n return compareStrings(a.file, b.file)\n || (a.line ?? 0) - (b.line ?? 0)\n || compareStrings(a.kind, b.kind)\n || compareStrings(a.name, b.name);\n};\n\n\n/**\n * Folds one pass into one unit. Symbols accumulate across passes; a framework\n * block replaces the previous one, there being nothing to merge in a name.\n */\nconst mergeUnit = (unit: Unit, name: string, enrichment: UnitEnrichment | undefined): Unit => {\n if (enrichment?.symbols === undefined && enrichment?.framework === undefined) {\n return unit;\n }\n\n const symbols = enrichment.symbols === undefined\n ? unit.facts.symbols\n : {\n symbols: [...(unit.facts.symbols?.symbols ?? []), ...enrichment.symbols.symbols]\n .sort(compareSymbols),\n };\n\n const framework = enrichment.framework ?? unit.facts.framework;\n\n return {\n ...unit,\n facts: {\n ...unit.facts,\n ...(symbols === undefined ? {} : { symbols }),\n ...(framework === undefined ? {} : { framework }),\n producedBy: [...unit.facts.producedBy, name],\n },\n };\n};\n\n\n/**\n * Applies one pass to what the adapter extracted. A unit the pass said nothing\n * about comes back untouched, `producedBy` included, and a relation naming a\n * unit that is not there is dropped: an enricher never invents one.\n */\nexport const applyEnrichment = (extracted: ExtractResult, name: string, result: EnrichResult): ExtractResult => {\n const units = extracted.units.map((unit) => mergeUnit(unit, name, result.facts[unit.id]));\n const known = new Set(units.map((unit) => unit.id));\n\n return {\n units,\n relations: [\n ...extracted.relations,\n ...result.relations.filter(({ from, to }) => known.has(from) && known.has(to)),\n ],\n };\n};\n","import path from \"node:path\";\nimport type { Project, Workspace, WorkspaceTool } from \"@glossic/schema\";\nimport { glob } from \"tinyglobby\";\nimport { parse as parseYaml } from \"yaml\";\n\nimport { pathExists, readJson, readText, sortBy, toPosix } from \"./utils/index.js\";\n\ninterface PackageJson {\n name ?: string;\n packageManager?: string;\n workspaces ?: string[] | { packages?: string[] };\n}\n\ninterface MonorepoMarker {\n tool : WorkspaceTool;\n globs: string[];\n}\n\nconst GLOB_IGNORES = [\"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/.git/**\"];\n\nconst LOCKFILE_PACKAGE_MANAGERS: ReadonlyArray<readonly [string, string]> = [\n [\"pnpm-lock.yaml\", \"pnpm\"],\n [\"yarn.lock\", \"yarn\"],\n [\"package-lock.json\", \"npm\"],\n [\"bun.lock\", \"bun\"],\n [\"bun.lockb\", \"bun\"],\n [\"composer.lock\", \"composer\"],\n [\"composer.json\", \"composer\"],\n];\n\nconst asStringArray = (value: unknown): string[] =>\n Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n\n/** The package manager in use, from the packageManager field or from the lockfile. */\nconst detectPackageManager = async (dir: string, pkg: PackageJson | undefined): Promise<string | undefined> => {\n const declared = pkg?.packageManager;\n\n if (typeof declared === \"string\" && declared.length > 0) {\n const [name] = declared.split(\"@\");\n\n if (name !== undefined && name.length > 0) {\n return name;\n }\n }\n\n for (const [lockfile, manager] of LOCKFILE_PACKAGE_MANAGERS) {\n if (await pathExists(path.join(dir, lockfile))) {\n return manager;\n }\n }\n\n return undefined;\n};\n\n\n/** The monorepo tool and the globs defining its projects, when this repo is one. */\nconst detectMonorepo = async (root: string, pkg: PackageJson | undefined): Promise<MonorepoMarker | undefined> => {\n const pnpmWorkspace = await readText(path.join(root, \"pnpm-workspace.yaml\"));\n\n if (pnpmWorkspace !== undefined) {\n const parsed: unknown = parseYaml(pnpmWorkspace);\n const globs = asStringArray((parsed as { packages?: unknown } | null)?.packages);\n\n if (globs.length > 0) {\n return { tool: \"pnpm\", globs };\n }\n }\n\n const workspaces = Array.isArray(pkg?.workspaces) ? pkg.workspaces : asStringArray(pkg?.workspaces?.packages);\n\n if (workspaces.length > 0) {\n return { tool: \"npm-workspaces\", globs: workspaces };\n }\n\n if (await pathExists(path.join(root, \"turbo.json\"))) {\n return { tool: \"turbo\", globs: [\"apps/*\", \"packages/*\"] };\n }\n\n if (await pathExists(path.join(root, \"nx.json\"))) {\n return { tool: \"nx\", globs: [\"apps/*\", \"libs/*\", \"packages/*\"] };\n }\n\n const lerna = await readJson<{ packages?: unknown }>(path.join(root, \"lerna.json\"));\n\n if (lerna !== undefined) {\n const globs = asStringArray(lerna.packages);\n return { tool: \"lerna\", globs: globs.length > 0 ? globs : [\"packages/*\"] };\n }\n\n return undefined;\n};\n\nconst expandProjectDirs = async (root: string, globs: string[]): Promise<string[]> => {\n const patterns: string[] = [];\n const ignore = [...GLOB_IGNORES];\n\n for (const entry of globs) {\n if (entry.startsWith(\"!\")) {\n ignore.push(`${entry.slice(1)}/**`);\n continue;\n }\n \n patterns.push(`${entry}/package.json`);\n }\n\n if (patterns.length === 0) return [];\n\n const manifests = await glob({\n patterns,\n cwd: root,\n ignore,\n onlyFiles : true,\n followSymbolicLinks: false,\n dot : false,\n });\n\n const dirs = manifests.map((manifest) => toPosix(path.posix.dirname(toPosix(manifest))));\n\n return [...new Set(dirs)].sort();\n};\n\nconst buildProject = async (root: string, rootDir: string, fallbackManager: string | undefined): Promise<Project> => {\n const dir = path.resolve(root, rootDir);\n const pkg = await readJson<PackageJson>(path.join(dir, \"package.json\"));\n const packageManager = (await detectPackageManager(dir, pkg)) ?? fallbackManager;\n const name = pkg?.name ?? path.basename(dir);\n\n const project: Project = {\n id: rootDir === \".\" ? \"root\" : rootDir,\n name,\n rootDir,\n };\n\n return packageManager === undefined ? project : { ...project, packageManager };\n};\n\n\n/** Identifies the repository and lists its projects, monorepo or not. */\nexport const resolveWorkspace = async (root: string): Promise<Workspace> => {\n const absoluteRoot = path.resolve(root);\n const pkg = await readJson<PackageJson>(path.join(absoluteRoot, \"package.json\"));\n const packageManager = await detectPackageManager(absoluteRoot, pkg);\n const name = pkg?.name ?? path.basename(absoluteRoot);\n\n const marker = await detectMonorepo(absoluteRoot, pkg);\n const projectDirs = marker === undefined ? [] : await expandProjectDirs(absoluteRoot, marker.globs);\n\n const isMonorepo = projectDirs.length > 0;\n const rootDirs = isMonorepo ? projectDirs : [\".\"];\n const projects = await Promise.all(\n rootDirs.map((rootDir) => buildProject(absoluteRoot, rootDir, packageManager)),\n );\n\n const workspace: Workspace = {\n name,\n root: toPosix(absoluteRoot),\n isMonorepo,\n tool : isMonorepo && marker !== undefined ? marker.tool: \"none\",\n projects: sortBy(projects, (project) => project.id),\n };\n\n return packageManager === undefined ? workspace : { ...workspace, packageManager };\n};\n","import { isAdapter, isEnricher } from \"@glossic/schema\";\nimport type { Adapter, DiscoverContext, Enricher, Layer } from \"@glossic/schema\";\n\n/** Puts the adapters in the order the config asks for, dropping the ones it omits. */\nexport const orderAdapters = (adapters: readonly Layer[], wanted: readonly string[]): Layer[] => {\n const byName = new Map(adapters.map((adapter) => [adapter.name, adapter]));\n\n return wanted\n .map((name) => byName.get(name))\n .filter((adapter): adapter is Layer => adapter !== undefined);\n};\n\n\n/** The first adapter that claims the project; enrichers in the chain are skipped here. */\nexport const selectAdapter = async (layers: readonly Layer[], ctx: DiscoverContext): Promise<Adapter | undefined> => {\n for (const layer of layers) {\n if (isAdapter(layer) && await layer.detect(ctx)) {\n return layer;\n }\n }\n\n return undefined;\n};\n\n\n/** Every enricher that claims the project, in the order the chain lists them. */\nexport const selectEnrichers = async (layers: readonly Layer[], ctx: DiscoverContext): Promise<Enricher[]> => {\n const claimed: Enricher[] = [];\n\n for (const layer of layers) {\n if (isEnricher(layer) && await layer.detect(ctx)) {\n claimed.push(layer);\n }\n }\n\n return claimed;\n};\n","import path from \"node:path\";\n\nimport { GlossicConfigSchema } from \"@glossic/schema\";\nimport type { AdapterContext, DiscoverContext, ExtractResult } from \"@glossic/schema\";\n\nimport { buildManifest } from \"../manifest.js\";\nimport { applyEnrichment } from \"./enrich.js\";\nimport { resolveWorkspace } from \"../workspace.js\";\nimport { orderAdapters, selectAdapter, selectEnrichers } from \"./layers.js\";\nimport type { PipelineContext, ScanResult } from \"./types.js\";\n\nexport * from \"./types.js\";\nexport { applyEnrichment } from \"./enrich.js\";\nexport { orderAdapters, selectAdapter, selectEnrichers } from \"./layers.js\";\n\n\n/** Walks the workspace and turns it into a manifest, calling no provider. */\nexport const scan = async (ctx: PipelineContext): Promise<ScanResult> => {\n const config = ctx.config ?? GlossicConfigSchema.parse({});\n const workspace = await resolveWorkspace(path.resolve(ctx.root));\n const layers = orderAdapters(ctx.adapters, config.adapters);\n const adapterContext: AdapterContext = { root: workspace.root, workspace, config };\n\n const results: ExtractResult[] = [];\n const adapterByProject: Record<string, string> = {};\n const enrichersByProject: Record<string, string[]> = {};\n\n for (const project of workspace.projects) {\n const discoverContext: DiscoverContext = { ...adapterContext, project };\n const adapter = await selectAdapter(layers, discoverContext);\n\n if (adapter === undefined) continue;\n\n adapterByProject[project.id] = adapter.name;\n\n const discovered = await adapter.discover(discoverContext);\n const enrichers = await selectEnrichers(layers, discoverContext);\n\n let extracted = await adapter.extract({ ...discoverContext, units: discovered });\n\n for (const enricher of enrichers) {\n const enrichment = await enricher.enrich({ ...discoverContext, units: extracted.units });\n\n extracted = applyEnrichment(extracted, enricher.name, enrichment);\n }\n\n enrichersByProject[project.id] = enrichers.map((enricher) => enricher.name);\n\n results.push(extracted);\n }\n\n const manifest = buildManifest(\n workspace,\n results,\n ctx.generatedAt === undefined ? {} : { generatedAt: ctx.generatedAt },\n );\n\n return { manifest, workspace, adapterByProject, enrichersByProject };\n};\n","import type { Manifest, Project, Unit } from \"@glossic/schema\";\n\nimport { compareStrings } from \"./utils/index.js\";\n\n/** Where a unit's page goes, relative to the output directory. */\nexport const unitDocPath = (unit: Unit): string => {\n return unit.path === \".\" ? \"root.md\" : `${unit.path}.md`;\n}\n\nexport const INDEX_DOC_PATH = \"index.md\";\n\nconst frontmatter = (entries: ReadonlyArray<readonly [string, string | number]>): string =>\n [\n \"---\",\n ...entries.map(([key, value]) =>\n typeof value === \"number\" ? `${key}: ${value}` : `${key}: ${JSON.stringify(value)}`,\n ),\n \"---\",\n ].join(\"\\n\");\n\nexport interface RenderUnitDocInput {\n unit : Unit;\n project : Project;\n body : string;\n generatedAt: string;\n}\n\n\n/** One unit's page: frontmatter carrying the hash, then the prose the provider wrote. */\nexport const renderUnitDoc = (input: RenderUnitDocInput): string => {\n const { unit } = input;\n const title = unit.name === \"root\" ? input.project.name : unit.name;\n\n const entries: Array<readonly [string, string | number]> = [\n [\"title\", title],\n [\"unit\", unit.id],\n [\"project\", unit.projectId],\n [\"path\", unit.path],\n [\"hash\", unit.hash],\n [\"files\", unit.facts.base.files.length],\n [\"generatedAt\", input.generatedAt],\n ];\n\n if (unit.facts.base.roleHint !== null) {\n entries.splice(4, 0, [\"role\", unit.facts.base.roleHint]);\n }\n\n return [frontmatter(entries), \"\", input.body.trim(), \"\"].join(\"\\n\");\n};\n\nexport interface RenderIndexDocInput {\n manifest : Manifest;\n generatedAt: string;\n}\n\nconst languageSummary = (units: readonly Unit[]): string => {\n const totals = new Map<string, number>();\n\n for (const unit of units) {\n for (const entry of unit.facts.base.languages) {\n totals.set(entry.language, (totals.get(entry.language) ?? 0) + entry.count);\n }\n }\n\n return [...totals.entries()]\n .sort(([aLang, aCount], [bLang, bCount]) => bCount - aCount || compareStrings(aLang, bLang))\n .map(([language, count]) => `${language} (${count})`)\n .join(\", \");\n};\n\n\n/** The index page listing every unit in the workspace. */\nexport const renderIndexDoc = (input: RenderIndexDocInput): string => {\n const { manifest } = input;\n const { workspace, units } = manifest;\n\n const lines: string[] = [\n frontmatter([\n [\"title\", workspace.name],\n [\"generatedAt\", input.generatedAt],\n [\"units\", units.length],\n ]),\n \"\",\n `# ${workspace.name}`,\n \"\",\n workspace.isMonorepo\n ? `${workspace.tool} monorepo with ${workspace.projects.length} projects.`\n : \"Single-project workspace.\",\n \"\",\n ];\n\n for (const project of workspace.projects) {\n const projectUnits = units.filter((unit) => unit.projectId === project.id);\n\n lines.push(`## ${project.name}`, \"\");\n\n if (projectUnits.length === 0) {\n lines.push(\"No documented units.\", \"\");\n continue;\n }\n\n for (const unit of projectUnits) {\n const role = unit.facts.base.roleHint;\n const suffix = role === null ? \"\" : ` — ${role}`;\n\n lines.push(\n `- [${unit.name}](./${unitDocPath(unit)}) — ${unit.facts.base.files.length} files${suffix}`,\n );\n }\n lines.push(\"\");\n }\n\n const languages = languageSummary(units);\n\n if (languages !== \"\") {\n lines.push(`Languages: ${languages}`, \"\");\n }\n\n return lines.join(\"\\n\");\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { Manifest } from \"@glossic/schema\";\nimport { glob } from \"tinyglobby\";\nimport { parse as parseYaml } from \"yaml\";\n\nimport { scan } from \"./scan/index.js\";\nimport { INDEX_DOC_PATH, unitDocPath } from \"./markdown.js\";\nimport { compareStrings, sortBy, toPosix } from \"./utils/index.js\";\nimport type { PipelineContext } from \"./scan/index.js\";\n\nexport interface CheckContext extends PipelineContext {\n outDir: string;\n}\n\nexport interface CheckEntry {\n unitId : string;\n docPath : string;\n expectedHash : string;\n documentedHash: string | undefined;\n}\n\n/** `orphaned` names only documents glossic wrote: markdown it did not generate is left alone. */\nexport interface CheckResult {\n outDir : string;\n upToDate: CheckEntry[];\n missing : CheckEntry[];\n stale : CheckEntry[];\n orphaned: string[];\n ok : boolean;\n}\n\ninterface DocumentFrontmatter {\n unit : string | undefined;\n hash : string | undefined;\n generatedAt: string | undefined;\n}\n\nconst FRONTMATTER = /^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n/;\n\nconst NO_FRONTMATTER: DocumentFrontmatter = {\n unit : undefined,\n hash : undefined,\n generatedAt: undefined,\n};\n\n/** The fields `renderUnitDoc` writes, all undefined when there is no readable frontmatter. */\nexport const readDocFrontmatter = async (file: string): Promise<DocumentFrontmatter> => {\n try {\n const raw = await fs.readFile(file, \"utf8\");\n const match = FRONTMATTER.exec(raw);\n\n if (match === null) {\n return NO_FRONTMATTER;\n }\n\n const parsed: unknown = parseYaml(match[1] ?? \"\");\n\n if (typeof parsed !== \"object\" || parsed === null) {\n return NO_FRONTMATTER;\n }\n\n const record = parsed as Record<string, unknown>;\n\n return {\n unit : typeof record.unit === \"string\" ? record.unit : undefined,\n hash : typeof record.hash === \"string\" ? record.hash : undefined,\n generatedAt: typeof record.generatedAt === \"string\" ? record.generatedAt : undefined,\n };\n } catch {\n return NO_FRONTMATTER;\n }\n};\n\n/**\n * Whether glossic wrote the page: only a document of ours carries all three\n * fields, so hand-written markdown in the output directory is never touched.\n */\nconst isGeneratedDoc = (frontmatter: DocumentFrontmatter): boolean => {\n return (\n frontmatter.unit !== undefined &&\n frontmatter.hash !== undefined &&\n frontmatter.generatedAt !== undefined\n );\n};\n\nconst listDocs = async (outDir: string): Promise<string[]> => {\n try {\n const entries = await glob({\n patterns : [\"**/*.md\"],\n cwd : outDir,\n onlyFiles : true,\n followSymbolicLinks: false,\n });\n\n return entries.map(toPosix).sort(compareStrings);\n } catch {\n return [];\n }\n};\n\n\nexport const check = async (ctx: CheckContext): Promise<CheckResult> => {\n const { manifest }: { manifest: Manifest } = await scan(ctx);\n\n const docs = await listDocs(ctx.outDir);\n const expected = new Map(manifest.units.map((unit) => [unitDocPath(unit), unit]));\n\n const upToDate: CheckEntry[] = [];\n const missing : CheckEntry[] = [];\n const stale : CheckEntry[] = [];\n\n for (const unit of manifest.units) {\n const docPath = unitDocPath(unit);\n const entryBase = { unitId: unit.id, docPath, expectedHash: unit.hash };\n\n if (!docs.includes(docPath)) {\n missing.push({ ...entryBase, documentedHash: undefined });\n continue;\n }\n\n const { hash } = await readDocFrontmatter(path.resolve(ctx.outDir, docPath));\n\n if (hash === unit.hash) {\n upToDate.push({ ...entryBase, documentedHash: hash });\n } else {\n stale.push({ ...entryBase, documentedHash: hash });\n }\n }\n\n const unclaimed = docs.filter((doc) => doc !== INDEX_DOC_PATH && !expected.has(doc));\n const orphaned: string[] = [];\n\n for (const doc of unclaimed) {\n const frontmatter = await readDocFrontmatter(path.resolve(ctx.outDir, doc));\n\n if (isGeneratedDoc(frontmatter)) orphaned.push(doc);\n }\n\n orphaned.sort(compareStrings);\n\n const byUnitId = (entries: CheckEntry[]): CheckEntry[] => {\n return sortBy(entries, (entry) => entry.unitId);\n }\n\n return {\n outDir : toPosix(ctx.outDir),\n upToDate: byUnitId(upToDate),\n missing : byUnitId(missing),\n stale : byUnitId(stale),\n orphaned,\n ok: missing.length === 0 && stale.length === 0 && orphaned.length === 0,\n };\n};\n","import path from \"node:path\";\n\nimport { createJiti } from \"jiti\";\nimport { GlossicConfigSchema } from \"@glossic/schema\";\nimport type { GlossicUserConfig } from \"@glossic/schema\";\n\nimport { pathExists, toPosix } from \"./utils/index.js\";\n\n/** Config filenames, in the order they are looked for. */\nexport const CONFIG_FILENAMES = [\n \"glossic.config.ts\",\n \"glossic.config.mts\",\n \"glossic.config.js\",\n \"glossic.config.mjs\",\n];\n\n\n/** Posix path of the project's config file, when it has one. */\nexport const findConfigFile = async (root: string): Promise<string | undefined> => {\n for (const filename of CONFIG_FILENAMES) {\n const candidate = path.resolve(root, filename);\n if (await pathExists(candidate)) {\n return toPosix(candidate);\n }\n }\n\n return undefined;\n};\n\n/** The project has no config file at all. */\nexport interface MissingConfig {\n status: \"missing\";\n}\n\n/** The file is there but unusable, and `error` is the reason to put in front of the user. */\nexport interface FailedConfig {\n status: \"failed\";\n file : string;\n error : string;\n}\n\n/** `values` carries only the keys the file actually set, so a no-op config leaves it empty. */\nexport interface LoadedConfig {\n status: \"loaded\";\n file : string;\n values: GlossicUserConfig;\n}\n\n/** The three things a config file can be, so a missing file never reads as a broken one. */\nexport type ProjectConfig = MissingConfig | FailedConfig | LoadedConfig;\n\n/** The reason ends up on one terminal line, so the stack and the rest of the message go. */\nconst describeError = (cause: unknown): string => {\n const message = cause instanceof Error ? cause.message : String(cause);\n\n return message.split(\"\\n\")[0]?.trim() || \"unknown error\";\n};\n\n/** The module's default export as a config, or why it is not one. */\nconst readDefaultExport = (file: string, value: unknown): FailedConfig | LoadedConfig => {\n const parsed = GlossicConfigSchema.partial().safeParse(value);\n\n if (!parsed.success) {\n const error = parsed.error.issues\n .map((issue) =>\n issue.path.length === 0 ? issue.message : `${issue.path.join(\".\")}: ${issue.message}`,\n )\n .join(\"; \");\n\n return { status: \"failed\", file, error };\n }\n\n const declared = Object.keys(value as Record<string, unknown>);\n\n const values = Object.fromEntries(\n Object.entries(parsed.data).filter(([key]) => declared.includes(key)),\n ) as GlossicUserConfig;\n\n return { status: \"loaded\", file, values };\n};\n\n\n/** Never throws: a config that cannot be loaded is reported as such, not hidden. */\nexport const loadProjectConfig = async (root: string): Promise<ProjectConfig> => {\n const file = await findConfigFile(root);\n\n if (file === undefined) {\n return { status: \"missing\" };\n }\n\n try {\n const jiti = createJiti(import.meta.url, { moduleCache: false });\n const loaded = await jiti.import(file, { default: true });\n\n return readDefaultExport(file, loaded);\n } catch (cause) {\n return { status: \"failed\", file, error: describeError(cause) };\n }\n};\n","import type { GlossicConfig, GlossicUserConfig, ListOverride, ListOverrides } from \"@glossic/schema\";\nimport { ADDITIVE_LIST_KEYS, applyListOverride, GlossicConfigSchema, LIST_DEFAULTS } from \"@glossic/schema\";\n\n/** Which source decided one option's value; `glossic doctor` prints it. */\nexport type ConfigOrigin = \"flag\" | \"project\" | \"preference\" | \"default\";\n\nexport type ConfigOrigins = Record<string, ConfigOrigin>;\n\nexport interface ConfigSources {\n flags ?: GlossicUserConfig | undefined;\n project ?: GlossicUserConfig | undefined;\n preference?: GlossicUserConfig | undefined;\n}\n\nexport interface ResolvedConfig {\n config : GlossicConfig;\n origins: ConfigOrigins;\n lists : ListOverrides;\n}\n\nconst ORDER: ReadonlyArray<[\"flag\" | \"project\" | \"preference\", keyof ConfigSources]> = [\n [\"flag\", \"flags\"],\n [\"project\", \"project\"],\n [\"preference\", \"preference\"],\n];\n\nconst isSet = (value: unknown): boolean => {\n return value !== undefined && !(typeof value === \"string\" && value.trim() === \"\");\n}\n\nconst entriesFor = (merged: Record<string, unknown>, key: string): readonly string[] | undefined => {\n const value = merged[key];\n\n return Array.isArray(value) ? (value as string[]) : undefined;\n};\n\n\n/**\n * Merges the sources under one precedence chain (flags, project config, saved\n * preference, schema defaults) and records which one won each key.\n *\n * `exclude`, `ignoreUnits` and `excludeFromContent` are folded into their\n * defaults rather than replacing them, so adding one pattern does not silently\n * cost the other twenty-nine. This is the only place that happens: the schema\n * keeps the raw entries so a caller can still report what a config changed.\n */\nexport const resolveConfig = (sources: ConfigSources = {}): ResolvedConfig => {\n const merged : Record<string, unknown> = {};\n const origins: ConfigOrigins = {};\n\n for (const [origin, key] of [...ORDER].reverse()) {\n const source = sources[key];\n\n if (source === undefined) continue;\n\n for (const [name, value] of Object.entries(source)) {\n if (!isSet(value)) continue;\n\n merged[name] = value;\n origins[name] = origin;\n }\n }\n\n const lists = {} as Record<string, ListOverride>;\n\n for (const key of ADDITIVE_LIST_KEYS) {\n const override = applyListOverride(LIST_DEFAULTS[key], entriesFor(merged, key));\n\n lists[key] = override;\n merged[key] = [...override.value];\n }\n\n const config = GlossicConfigSchema.parse(merged);\n\n for (const name of Object.keys(config)) {\n origins[name] ??= \"default\";\n }\n\n return { config, origins, lists: lists as ListOverrides };\n};\n","/** Placeholder for a code path that is scaffolded but not written yet. */\nexport class NotImplementedError extends Error {\n constructor(what: string) {\n super(`${what} is not implemented`);\n this.name = \"NotImplementedError\";\n }\n}\n\n\n/**\n * Nothing on this machine can write prose. The message is the install\n * instructions, because this is the first wall a new user hits.\n */\nexport class NoProviderAvailableError extends Error {\n readonly tried: string[];\n\n constructor(tried: readonly string[]) {\n super(\n [\n \"No LLM provider is available.\",\n \"\",\n \"glossic needs one of these two:\",\n \"\",\n \" 1. Claude Code — install the CLI and sign in:\",\n \" https://claude.com/claude-code\",\n \" glossic picks it up as soon as `claude --version` works.\",\n \"\",\n \" 2. Anthropic API — export an API key:\",\n \" export ANTHROPIC_API_KEY=sk-ant-...\",\n \" https://console.anthropic.com/settings/keys\",\n \"\",\n \"Run `glossic doctor` to see what glossic can find on this machine.\",\n ].join(\"\\n\"),\n );\n this.name = \"NoProviderAvailableError\";\n this.tried = [...tried];\n }\n}\n\n/** The provider named by a flag or by the config does not exist. */\nexport class UnknownProviderError extends Error {\n constructor(requested: string, known: readonly string[]) {\n super(`unknown provider \"${requested}\". Available: ${[...known].sort().join(\", \")}`);\n this.name = \"UnknownProviderError\";\n }\n}\n","import { isRetryableProviderError } from \"@glossic/schema\";\n\n/** `sleep` and `onRetry` exist so a test can drive the loop without waiting. */\nexport interface RetryOptions {\n attempts ?: number;\n baseDelayMs?: number;\n sleep ?: (ms: number) => Promise<void>;\n onRetry ?: (attempt: number, error: unknown) => void;\n}\n\nconst DEFAULT_ATTEMPTS = 3;\nconst DEFAULT_BASE_DELAY_MS = 500;\n\nconst defaultSleep = (ms: number): Promise<void> => {\n return new Promise((resolve) => {\n setTimeout(resolve, ms).unref?.();\n });\n}\n\n\n/** Exponential backoff: the delay doubles with every attempt. */\nexport const backoffDelay = (attempt: number, baseDelayMs: number): number => {\n return baseDelayMs * 2 ** (attempt - 1);\n}\n\n\n/** Runs a task again while it fails with a retryable provider error. */\nexport const withRetry = async <T>(task: () => Promise<T>, options: RetryOptions = {}): Promise<T> => {\n const attempts = options.attempts ?? DEFAULT_ATTEMPTS;\n const baseDelayMs = options.baseDelayMs ?? DEFAULT_BASE_DELAY_MS;\n const sleep = options.sleep ?? defaultSleep;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n try {\n return await task();\n } catch (error) {\n lastError = error;\n\n if (attempt === attempts || !isRetryableProviderError(error)) {\n throw error;\n }\n\n options.onRetry?.(attempt, error);\n\n await sleep(backoffDelay(attempt, baseDelayMs));\n }\n }\n\n throw lastError;\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { CompletionRequest, Project, SymbolFact, Unit } from \"@glossic/schema\";\nimport { compareStrings } from \"./utils/index.js\";\n\n/** A file longer than this is truncated before it goes into a prompt. */\nexport const MAX_FILE_BYTES = 24_000;\n\nconst CHARS_PER_TOKEN = 4;\n\nexport interface UnitSource {\n path : string;\n language : string;\n content : string;\n truncated: boolean;\n}\n\nexport interface BuildPromptInput {\n unit : Unit;\n project : Project;\n workspaceName : string;\n sources : readonly UnitSource[];\n lang : string;\n model ?: string | undefined;\n temperature ?: number | undefined;\n}\n\n\n/** Bumped by hand when the prompt changes, which invalidates every cached unit. */\nexport const PROMPT_VERSION = \"5\";\n\n/** The rules the model is held to; assertDocumentContent checks the answer against them. */\nexport const SYSTEM_PROMPT = [\n \"You are a technical writer documenting a codebase for the engineers who work on it.\",\n \"\",\n \"You are given one unit of code: a directory, its extracted facts and the full\",\n \"content of its source files. Write reference documentation for that unit.\",\n \"\",\n \"Cover, in this order:\",\n \" 1. What the unit does, in one or two sentences.\",\n \" 2. Its responsibilities, and what it deliberately leaves to other units.\",\n \" 3. The public elements a consumer needs: the ones you would name when\",\n \" telling somebody how to use this unit, and what each is for. Be\",\n \" selective. Do not enumerate every export and do not turn the section\",\n \" into an inventory.\",\n \" 4. What the code reveals when it is read as a whole: dependency\",\n \" direction, patterns, error handling, boundaries, trade-offs, and above\",\n \" all whatever does not line up.\",\n \"\",\n \" That last part is the one worth your attention. Look for:\",\n \" - a declared interface, schema, annotation or documented contract\",\n \" that the implementation does not match;\",\n \" - a dependency the code uses but never declares;\",\n \" - data lost without a word: a truncation, a swallowed error, a\",\n \" narrowing cast, a result computed and dropped;\",\n \" - work done twice: a second pass, a redundant deduplication, a value\",\n \" recomputed where one was already at hand;\",\n \" - state kept in memory that would not survive a restart or a second\",\n \" instance of the process.\",\n \"\",\n \" Report only what you can point at in the code, and say where it is.\",\n \" If the unit has nothing of the kind, write nothing rather than reach:\",\n \" an invented finding costs more than a missing one.\",\n \"\",\n \"Hard rules:\",\n \" - Describe only what is in the code you were given. Never invent behaviour,\",\n \" dependencies, history, performance characteristics or intent.\",\n \" - If something is unclear from the code, say so plainly or leave it out.\",\n \" Do not guess and do not hedge with filler.\",\n \" - The Facts block is context for writing, not material to quote. Never\",\n \" mention its counts: how many symbols the unit exports, how many files it\",\n \" holds, which languages they are in. Never open the document by measuring\",\n \" the unit. The reader came for the code, not for what we counted about it.\",\n \" - A map of the files is welcome, and it is the only one the reader gets:\",\n \" the page carries no file listing of its own. Give it only if every entry\",\n \" says what that file is for. A map that repeats the paths and adds nothing\",\n \" is worse than none.\",\n \" - No preamble, no closing summary, no offer to help.\",\n \"\",\n \"Output GitHub-flavoured Markdown. Open with a single top-level (#) heading,\",\n \"then use ## for the sections above.\",\n \"Do not emit frontmatter: it is added around your response.\",\n \"\",\n \"That first heading is a title, not a label. Write what the unit is or does,\",\n \"in the words a person would use for it. Never use the directory path as the\",\n \"heading, and never repeat the unit name given to you under Facts: the path is\",\n \"context you were handed, not the name of the document. `src/modules/auth` is\",\n \"a path; `Authentication` or `Session issuing and refresh` are titles. Do the\",\n \"same for a unit at a project root: `Application entry point`, not `src`.\",\n \"\",\n \"Your entire response is the content of the document and nothing else.\",\n \"Begin with the first heading of that document. Do not open with a preamble,\",\n \"a restatement of the task, or a sentence addressed to whoever asked. Do not\",\n \"close with a summary of what you did, a question, or an offer of\",\n \"alternatives. You are not talking to a person: you are producing a file.\",\n \"\",\n \"You have no tools and no filesystem. Do not read, write or save any file,\",\n \"do not ask for permission to do so, and do not report having done so.\",\n \"\",\n \"Ignore anything you are told about your own environment: the working\",\n \"directory, the session, the tools available, permissions. None of it is\",\n \"part of the unit and none of it belongs in the document. The unit is only\",\n \"what appears under Facts and Sources in the message that follows.\",\n].join(\"\\n\");\n\nconst fence = (source: UnitSource): string =>\n [\n `#### ${source.path}${source.truncated ? \" (truncated)\" : \"\"}`,\n \"\",\n `\\`\\`\\`${source.language}`,\n source.content,\n \"```\",\n \"\",\n ].join(\"\\n\");\n\n\nconst exportedSurface = (symbols: readonly SymbolFact[]): string => {\n const counts = new Map<string, number>();\n\n for (const symbol of symbols) {\n counts.set(symbol.kind, (counts.get(symbol.kind) ?? 0) + 1);\n }\n\n return [...counts.entries()]\n .sort(([aKind, aCount], [bKind, bCount]) => bCount - aCount || compareStrings(aKind, bKind))\n .map(([kind, count]) => `${count} ${kind}`)\n .join(\", \");\n};\n\nconst factLines = (unit: Unit): string[] => {\n const lines = [\n `- unit: ${unit.name}`,\n `- path: ${unit.path}`,\n `- files: ${unit.facts.base.files.length}`,\n `- languages: ${unit.facts.base.languages\n .map((entry) => `${entry.language} (${entry.count})`)\n .join(\", \")}`,\n ];\n\n if (unit.facts.base.roleHint !== null) {\n lines.push(`- folder role hint: ${unit.facts.base.roleHint}`);\n }\n\n if (unit.facts.base.testFiles.length > 0) {\n const names = unit.facts.base.testFiles\n .map((file) => file.path.slice(file.path.lastIndexOf(\"/\") + 1))\n .sort(compareStrings);\n lines.push(`- test files (content not shown): ${names.join(\", \")}`);\n }\n\n const symbols = unit.facts.symbols?.symbols ?? [];\n\n if (symbols.length > 0) {\n lines.push(`- exported surface: ${exportedSurface(symbols)}`);\n }\n\n if (unit.facts.framework !== undefined) {\n lines.push(`- framework: ${unit.facts.framework.name}`);\n if (unit.facts.framework.role !== undefined) {\n lines.push(`- framework role: ${unit.facts.framework.role}`);\n }\n }\n\n return lines;\n};\n\n\n/** Turns a unit and its sources into the one request a provider will answer. */\nexport const buildUnitPrompt = (input: BuildPromptInput): CompletionRequest => {\n const prompt = [\n `Workspace: ${input.workspaceName}`,\n `Project: ${input.project.name} (${input.project.rootDir})`,\n \"\",\n \"## Facts\",\n \"\",\n ...factLines(input.unit),\n \"\",\n \"## Sources\",\n \"\",\n ...input.sources.map(fence),\n `Write the documentation in ${input.lang}.`,\n ].join(\"\\n\");\n\n return {\n system: SYSTEM_PROMPT,\n prompt,\n ...(input.model === undefined ? {} : { model: input.model }),\n ...(input.temperature === undefined ? {} : { temperature: input.temperature }),\n metadata: { unitId: input.unit.id, projectId: input.unit.projectId },\n };\n};\n\n\n/** Reads a unit's documentable files, truncating any that run too long. */\nexport const readUnitSources = async (root: string, unit: Unit): Promise<UnitSource[]> => {\n const sources = await Promise.all(\n unit.facts.base.files.map(async (file): Promise<UnitSource> => {\n const raw = await fs.readFile(path.resolve(root, file.path), \"utf8\");\n const truncated = raw.length > MAX_FILE_BYTES;\n\n return {\n path : file.path,\n language: file.language,\n content : truncated ? raw.slice(0, MAX_FILE_BYTES): raw,\n truncated,\n };\n }),\n );\n\n return sources;\n};\n\n\n/** Rough token count, for the estimate a dry run prints before anything is spent. */\nexport const estimateTokens = (request: CompletionRequest): number => {\n return Math.ceil(((request.system?.length ?? 0) + request.prompt.length) / CHARS_PER_TOKEN);\n}\n","/** Maps over items with at most `limit` tasks in flight, preserving input order. */\nexport const mapWithConcurrency = async <T, R>(items: readonly T[], limit: number, task: (item: T) => Promise<R>): Promise<R[]> => {\n const results = new Array<R>(items.length);\n let cursor = 0;\n\n const worker = async (): Promise<void> => {\n while (cursor < items.length) {\n const index = cursor;\n \n cursor += 1;\n\n const item = items[index];\n\n if (item === undefined) continue;\n\n results[index] = await task(item);\n }\n };\n\n await Promise.all(Array.from({ length: Math.max(1, Math.min(limit, items.length)) }, worker));\n return results;\n};\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport type { CompletionRequest, GlossicConfig, Manifest, Project, Unit } from \"@glossic/schema\";\n\nimport { unitDocPath } from \"../markdown.js\";\nimport { buildUnitPrompt, estimateTokens, readUnitSources } from \"../prompt.js\";\n\n/** One unit ready to be sent: its prompt built and its destination known. */\nexport interface Job {\n unit : Unit;\n project : Project;\n request : CompletionRequest;\n docPath : string;\n estimatedTokens: number;\n}\n\n\n/** Writes a page under the output directory, creating the directories it needs. */\nexport const writeDoc = async (outDir: string, relative: string, content: string): Promise<void> => {\n const target = path.resolve(outDir, relative);\n\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(target, content, \"utf8\");\n};\n\n\n/** Reads the sources and builds a prompt for every unit in the manifest. */\nexport const buildJobs = async (manifest: Manifest, config: GlossicConfig, root: string): Promise<Job[]> => {\n const projectById = new Map(manifest.workspace.projects.map((entry) => [entry.id, entry]));\n\n const jobs = await Promise.all(\n manifest.units.map(async (unit): Promise<Job | undefined> => {\n const project = projectById.get(unit.projectId);\n\n if (project === undefined) {\n return undefined;\n }\n\n const request = buildUnitPrompt({\n unit,\n project,\n workspaceName: manifest.workspace.name,\n sources : await readUnitSources(root, unit),\n lang : config.lang,\n model : config.model,\n temperature : config.temperature,\n });\n\n return {\n unit,\n project,\n request,\n docPath : unitDocPath(unit),\n estimatedTokens: estimateTokens(request),\n };\n }),\n );\n\n return jobs.filter((job): job is Job => job !== undefined);\n};\n","import path from \"node:path\";\n\nimport type { GlossicConfig } from \"@glossic/schema\";\n\nimport { PROMPT_VERSION } from \"../prompt.js\";\nimport { pathExists } from \"../utils/index.js\";\nimport type { Job } from \"./jobs.js\";\nimport type { CacheEntry } from \"../cache.js\";\nimport type { GenerateReason } from \"./types.js\";\n\n/** The model a cache entry was written under, with a name for the unset case. */\nexport const modelCacheKey = (config: GlossicConfig): string => config.model ?? \"default\";\n\nexport interface DecisionContext {\n outDir: string;\n model : string;\n lang : string;\n force : boolean;\n}\n\n/** Why this unit has to be regenerated, or `cached` when nothing changed. */\nexport const decide = async (job: Job, entry: CacheEntry | undefined, context: DecisionContext): Promise<GenerateReason> => {\n if (context.force) {\n return \"forced\";\n }\n\n if (entry === undefined) {\n return \"new\";\n }\n\n if (entry.unitHash !== job.unit.hash) {\n return \"content-changed\";\n }\n\n if (entry.promptVersion !== PROMPT_VERSION) {\n return \"prompt-version-changed\";\n }\n\n if (entry.model !== context.model) {\n return \"model-changed\";\n }\n\n if (entry.lang !== context.lang) {\n return \"lang-changed\";\n }\n\n if (!(await pathExists(path.resolve(context.outDir, job.docPath)))) {\n return \"output-missing\";\n }\n\n return \"cached\";\n};\n","import { ProviderError } from \"@glossic/schema\";\n\n/** Under this many characters the answer reads as a refusal, not as a document. */\nexport const MIN_DOCUMENT_LENGTH = 200;\n/** Over this, what precedes the first heading is an answer rather than a preamble. */\nexport const MAX_PREAMBLE_LENGTH = 500;\n\ninterface ContentRule {\n reason : string;\n pattern: RegExp;\n}\n\n/** Shapes that mean the model addressed the reader instead of writing the document. */\nconst CONVERSATIONAL_RULES: readonly ContentRule[] = [\n {\n reason : \"the model asked for permission instead of writing the document\",\n pattern:\n /\\b(permission to (write|save|create)|(write|read) permission|need (write )?access)\\b/i,\n },\n {\n reason : \"the model reported on saving a file instead of writing the document\",\n pattern:\n /\\bI( have|['’]ve)? ?(drafted|prepared|written|created|saved|generated) (the|this|a) /i,\n },\n {\n reason : \"the model asked the reader a question\",\n pattern: /\\b(let me know|say the word|shall I|would you (like|prefer|want))\\b/i,\n },\n {\n reason : \"the model opened with a preamble instead of the document\",\n pattern: /^\\s*(here(['’]s| is)|below is|sure[,!]|certainly[,!]|I['’]ll)\\b/i,\n },\n {\n reason : \"the model addressed the reader in the first person\",\n pattern: /\\bI['’](ve|m|ll|d)\\b/,\n },\n {\n reason : \"the model addressed the reader in the first person\",\n pattern: /\\bI (need|cannot|can't|could not|couldn't|have|am|was|tried|noticed|assume)\\b/,\n },\n];\n\nconst FENCE = /^\\s{0,3}(```|~~~)/;\nconst TOP_HEADING = /^\\s{0,3}#{1,2}\\s+\\S/;\n\ninterface SourceLine {\n text : string;\n fenced: boolean;\n}\n\n/** Lines tagged with whether they sit inside a fenced code block. */\nconst scanLines = (text: string): SourceLine[] => {\n const lines: SourceLine[] = [];\n let fence: string | undefined;\n\n for (const line of text.split(/\\r?\\n/)) {\n const match = FENCE.exec(line);\n\n if (fence === undefined) {\n if (match !== null) {\n fence = match[1];\n }\n\n lines.push({ text: line, fenced: match !== null });\n\n continue;\n }\n\n lines.push({ text: line, fenced: true });\n\n if (match !== null && match[1] === fence) {\n fence = undefined;\n }\n }\n\n return lines;\n};\n\nexport interface NormalizedDocument {\n body : string;\n preamble: string | undefined;\n}\n\nconst invalidContent = (providerName: string, reason: string, detail: string): ProviderError =>\n new ProviderError({\n provider: providerName,\n code : \"invalid-content\",\n message : `the response is not a document: ${reason}`,\n detail,\n });\n\n/** Shortens text for an error message, onto a single line. */\nexport const excerpt = (text: string, limit: number): string => {\n const flat = text.replace(/\\s+/g, \" \").trim();\n return flat.length <= limit ? flat : `${flat.slice(0, limit - 1)}…`;\n};\n\n/** Splits a response into the document and whatever the model said before it. */\nexport const normalizeDocument = (providerName: string, text: string): NormalizedDocument => {\n const lines = scanLines(text);\n const first = lines.findIndex((line) => !line.fenced && TOP_HEADING.test(line.text));\n\n if (first === -1) {\n throw invalidContent(\n providerName,\n \"it contains no markdown heading\",\n excerpt(text, 120) || \"(empty)\",\n );\n }\n\n const dropped = lines\n .slice(0, first)\n .map((line) => line.text)\n .join(\"\\n\")\n .trim();\n\n if (dropped.length > MAX_PREAMBLE_LENGTH) {\n throw invalidContent(\n providerName,\n `${dropped.length} characters of prose precede the first heading, over the ${MAX_PREAMBLE_LENGTH} limit`,\n excerpt(dropped, 120),\n );\n }\n\n const body = lines\n .slice(first)\n .map((line) => line.text)\n .join(\"\\n\")\n .trim();\n\n return { body, preamble: dropped === \"\" ? undefined : dropped };\n};\n\nexport interface ContentProblem {\n reason : string;\n excerpt: string;\n}\n\nconst excerptAround = (text: string, index: number): string => {\n const start = Math.max(0, index - 30);\n return excerpt(text.slice(start, Math.min(text.length, index + 90)), 200);\n};\n\n/** The first conversational tell in the text, ignoring fenced code. */\nexport const findContentProblem = (text: string): ContentProblem | undefined => {\n const trimmed = text.trim();\n\n if (trimmed.length < MIN_DOCUMENT_LENGTH) {\n return {\n reason : `the response is ${trimmed.length} characters, below the ${MIN_DOCUMENT_LENGTH} minimum`,\n excerpt: excerpt(trimmed, 120),\n };\n }\n\n for (const rule of CONVERSATIONAL_RULES) {\n const match = rule.pattern.exec(trimmed);\n\n if (match !== null) {\n return { reason: rule.reason, excerpt: excerptAround(trimmed, match.index) };\n }\n }\n\n return undefined;\n};\n\n/** Throws a ProviderError when the response reads as conversation, not documentation. */\nexport const assertDocumentContent = (providerName: string, text: string): void => {\n const problem = findContentProblem(text);\n\n if (problem === undefined) return;\n\n throw invalidContent(providerName, problem.reason, problem.excerpt);\n};\n\nexport interface PreparedDocument {\n body : string;\n droppedPreamble: string | undefined;\n}\n\n/** Normalises and validates in one pass: what generate writes is what survives this. */\nexport const prepareDocument = (providerName: string, text: string): PreparedDocument => {\n const { body, preamble } = normalizeDocument(providerName, text);\n assertDocumentContent(providerName, body);\n\n return { body, droppedPreamble: preamble };\n};\n","import path from \"node:path\";\n\nimport picomatch from \"picomatch\";\nimport { GlossicConfigSchema, isFatalProviderError } from \"@glossic/schema\";\nimport type { Manifest, Unit } from \"@glossic/schema\";\n\nimport { scan } from \"../scan/index.js\";\nimport { withRetry } from \"../retry.js\";\nimport { PROMPT_VERSION } from \"../prompt.js\";\nimport { mapWithConcurrency } from \"../utils/concurrency.js\";\nimport { buildJobs, writeDoc } from \"./jobs.js\";\nimport { decide, modelCacheKey } from \"./decide.js\";\nimport { compareStrings, toPosix } from \"../utils/index.js\";\nimport { excerpt, prepareDocument } from \"../validate.js\";\nimport { INDEX_DOC_PATH, renderIndexDoc, renderUnitDoc } from \"../markdown.js\";\nimport { type CacheEntry, type CacheFile, DEFAULT_CACHE_PATH, emptyCache, indexCache, readCache, writeCache } from \"../cache.js\";\nimport type { Job } from \"./jobs.js\";\nimport type { DecisionContext } from \"./decide.js\";\nimport type { GenerateAbort, GenerateContext, GenerateEvent, GenerateFailure, GeneratePlanEntry, GenerateReason, GenerateResult, GenerateWarning, PlanReview, UnitOutcome } from \"./types.js\";\n\nexport * from \"./types.js\";\nexport { modelCacheKey } from \"./decide.js\";\n\n\nconst docsDirOf = (root: string, outDir: string): string => {\n const relative = toPosix(path.relative(root, outDir));\n\n return relative === \"\" ? \".\" : relative;\n};\n\n\ninterface Decision {\n job : Job;\n reason: GenerateReason;\n}\n\ninterface PlanSummary {\n plan : GeneratePlanEntry[];\n estimatedTokens: number;\n savedTokens : number;\n fromCache : number;\n}\n\n\nconst reviewOf = (decisions: readonly Decision[], manifest: Manifest): PlanReview => {\n const projects = manifest.workspace.projects\n .map((project) => {\n const own = decisions.filter(({ job }) => job.unit.projectId === project.id);\n\n return {\n id : project.id,\n name : project.name,\n pending : own.filter(({ reason }) => reason !== \"cached\").length,\n cached : own.filter(({ reason }) => reason === \"cached\").length,\n estimatedTokens: own\n .filter(({ reason }) => reason !== \"cached\")\n .reduce((sum, { job }) => sum + job.estimatedTokens, 0),\n };\n })\n .filter((project) => project.pending + project.cached > 0);\n\n return {\n pending : projects.reduce((sum, project) => sum + project.pending, 0),\n cached : projects.reduce((sum, project) => sum + project.cached, 0),\n estimatedTokens: projects.reduce((sum, project) => sum + project.estimatedTokens, 0),\n projects,\n };\n};\n\n\nconst stringField = (cause: unknown, field: string): string | undefined => {\n if (typeof cause !== \"object\" || cause === null || !(field in cause)) {\n return undefined;\n }\n\n const value = (cause as Record<string, unknown>)[field];\n\n return typeof value === \"string\" ? value : undefined;\n};\n\n\nexport const generate = async (ctx: GenerateContext): Promise<GenerateResult> => {\n const config = ctx.config ?? GlossicConfigSchema.parse({});\n const scanned = await scan(ctx);\n const generatedAt = scanned.manifest.generatedAt;\n const root = scanned.manifest.workspace.root;\n const manifest = { ...scanned.manifest, docsDir: docsDirOf(root, ctx.outDir) };\n\n const cachePath = ctx.cachePath ?? path.resolve(root, DEFAULT_CACHE_PATH);\n const model = modelCacheKey(config);\n const previous = await readCache(cachePath);\n const previousEntries = indexCache(previous);\n\n const allJobs = await buildJobs(manifest, config, root);\n\n const matches = ctx.only === undefined ? undefined : picomatch(ctx.only);\n\n const isSelected = (job: Job): boolean =>\n matches === undefined ||\n matches(job.unit.id) ||\n matches(job.unit.name) ||\n matches(job.unit.path);\n\n const selected = allJobs.filter(isSelected);\n const filteredOut = allJobs\n .filter((job) => !isSelected(job))\n .map((job) => job.unit.id)\n .sort(compareStrings);\n\n const decisionContext: DecisionContext = {\n outDir: ctx.outDir,\n model,\n lang : config.lang,\n force: ctx.force === true,\n };\n\n const decisions = await Promise.all(\n selected.map(async (job) => ({\n job,\n reason: await decide(job, previousEntries.get(job.unit.id), decisionContext),\n })),\n );\n\n const summarise = (entries: readonly Decision[]): PlanSummary => {\n const plan = entries\n .map(({ job, reason }) => ({\n unitId : job.unit.id,\n docPath : job.docPath,\n files : job.unit.facts.base.files.length,\n estimatedTokens: job.estimatedTokens,\n reason,\n regenerate: reason !== \"cached\",\n }))\n .sort((a, b) => compareStrings(a.unitId, b.unitId));\n\n const sumTokens = (regenerate: boolean): number => plan\n .filter((entry) => entry.regenerate === regenerate)\n .reduce((sum, entry) => sum + entry.estimatedTokens, 0);\n\n return {\n plan,\n estimatedTokens: sumTokens(true),\n savedTokens : sumTokens(false),\n fromCache : plan.filter((entry) => !entry.regenerate).length,\n };\n };\n\n if (ctx.dryRun === true || ctx.provider === undefined) {\n const whole = summarise(decisions);\n\n return {\n manifest,\n written: [],\n plan : whole.plan,\n failures: [],\n warnings: [],\n filteredOut,\n skipped: [],\n aborted: undefined,\n estimatedTokens: whole.estimatedTokens,\n savedTokens : whole.savedTokens,\n generated : 0,\n fromCache : whole.fromCache,\n dryRun : true,\n };\n }\n\n const requested = ctx.reviewPlan === undefined\n ? ctx.projects\n : (await ctx.reviewPlan(reviewOf(decisions, manifest))) ?? ctx.projects;\n\n const inScope = requested === undefined\n ? decisions\n : decisions.filter(({ job }) => requested.includes(job.unit.projectId));\n\n const outOfScope = requested === undefined\n ? []\n : decisions\n .filter(({ job }) => !requested.includes(job.unit.projectId))\n .map(({ job }) => job.unit.id);\n\n const { plan, estimatedTokens, savedTokens, fromCache } = summarise(inScope);\n\n const scopedFilteredOut = [...filteredOut, ...outOfScope].sort(compareStrings);\n\n const provider = ctx.provider;\n const failures: GenerateFailure[] = [];\n const warnings: GenerateWarning[] = [];\n const summaries = new Map<string, string>();\n const pending = inScope.filter(({ reason }) => reason !== \"cached\");\n\n const skipped: string[] = [];\n let aborted: GenerateAbort | undefined;\n\n const total = inScope.length;\n let completed = 0;\n\n const report = (event: GenerateEvent): void => ctx.onEvent?.(event);\n\n const finished = (unitId: string, outcome: UnitOutcome, durationMs: number): void => {\n completed += 1;\n report({ type: \"unit-done\", unitId, index: completed, total, outcome, durationMs });\n };\n\n for (const { job } of inScope.filter(({ reason }) => reason === \"cached\")) {\n report({ type: \"unit-start\", unitId: job.unit.id, index: completed + 1, total });\n finished(job.unit.id, \"cached\", 0);\n }\n\n const outcomes = await mapWithConcurrency(pending, config.concurrency, async ({ job }) => {\n if (aborted !== undefined) {\n skipped.push(job.unit.id);\n return undefined;\n }\n\n const startedAt = Date.now();\n report({ type: \"unit-start\", unitId: job.unit.id, index: completed + 1, total });\n\n try {\n const completion = await withRetry(() => provider.complete(job.request), ctx.retry);\n\n const prepared = prepareDocument(provider.name, completion.text);\n\n if (prepared.droppedPreamble !== undefined) {\n warnings.push({\n unitId : job.unit.id,\n dropped: prepared.droppedPreamble.length,\n excerpt: excerpt(prepared.droppedPreamble, 120),\n });\n }\n\n finished(job.unit.id, \"generated\", Date.now() - startedAt);\n return { job, body: prepared.body };\n } catch (cause) {\n const failure: GenerateFailure = {\n unitId: job.unit.id,\n reason: cause instanceof Error ? cause.message: String(cause),\n code : stringField(cause, \"code\"),\n detail: stringField(cause, \"detail\"),\n };\n\n failures.push(failure);\n\n if (aborted === undefined && isFatalProviderError(cause)) {\n aborted = {\n unitId : failure.unitId,\n code : failure.code ?? \"unknown\",\n reason : failure.reason,\n remaining: 0,\n };\n }\n\n finished(job.unit.id, \"failed\", Date.now() - startedAt);\n return undefined;\n }\n });\n\n if (aborted !== undefined) {\n aborted = { ...aborted, remaining: skipped.length };\n }\n\n const written: string[] = [];\n const fresh: CacheEntry[] = [];\n\n for (const outcome of outcomes) {\n if (outcome === undefined) continue;\n\n await writeDoc(\n ctx.outDir,\n outcome.job.docPath,\n renderUnitDoc({\n unit : outcome.job.unit,\n project: outcome.job.project,\n body : outcome.body,\n generatedAt,\n }),\n );\n\n written.push(toPosix(outcome.job.docPath));\n summaries.set(outcome.job.unit.id, outcome.body);\n fresh.push({\n unitId : outcome.job.unit.id,\n unitHash : outcome.job.unit.hash,\n promptVersion: PROMPT_VERSION,\n model,\n lang : config.lang,\n outputPath: outcome.job.docPath,\n generatedAt,\n });\n }\n\n const merged = new Map(previousEntries);\n\n for (const entry of fresh) {\n merged.set(entry.unitId, entry);\n }\n\n const liveUnitIds = new Set(manifest.units.map((unit) => unit.id));\n\n const nextCache: CacheFile = {\n version: emptyCache().version,\n entries: [...merged.values()].filter((entry) => liveUnitIds.has(entry.unitId)),\n };\n\n await writeCache(nextCache, cachePath);\n await writeDoc(ctx.outDir, INDEX_DOC_PATH, renderIndexDoc({ manifest, generatedAt }));\n\n written.push(INDEX_DOC_PATH);\n\n const documentedUnits: Unit[] = manifest.units.map((unit) => {\n const summary = summaries.get(unit.id);\n return summary === undefined ? unit : { ...unit, summary };\n });\n\n return {\n manifest: { ...manifest, units: documentedUnits },\n written : written.sort(compareStrings),\n plan,\n failures: failures.sort((a, b) => compareStrings(a.unitId, b.unitId)),\n warnings: warnings.sort((a, b) => compareStrings(a.unitId, b.unitId)),\n filteredOut: scopedFilteredOut,\n skipped : skipped.sort(compareStrings),\n aborted,\n estimatedTokens,\n savedTokens,\n generated: fresh.length,\n fromCache,\n dryRun: false,\n };\n};\n","import type { GlossicConfig, Provider } from \"@glossic/schema\";\n\nimport { NoProviderAvailableError, UnknownProviderError } from \"./errors.js\";\nimport { compareStrings } from \"./utils/index.js\";\n\n\n/** Auto-detection order: the local CLI first, the paid API second. */\nexport const PROVIDER_PREFERENCE = [\"claude-code\", \"anthropic\"];\n\nexport interface ResolveProviderOptions {\n providers : readonly Provider[];\n config ?: Pick<GlossicConfig, \"provider\"> | undefined;\n requested?: string | undefined;\n}\n\nexport interface ProviderStatus {\n name : string;\n available: boolean;\n}\n\n/** Providers in auto-detection order, with unknown names last and sorted. */\nconst byPreference = (providers: readonly Provider[]): Provider[] =>\n [...providers].sort((a, b) => {\n const rankA = PROVIDER_PREFERENCE.indexOf(a.name);\n const rankB = PROVIDER_PREFERENCE.indexOf(b.name);\n\n if (rankA !== rankB) {\n if (rankA === -1) return 1;\n if (rankB === -1) return -1;\n\n return rankA - rankB;\n }\n\n return compareStrings(a.name, b.name);\n });\n\n/** Asks every provider whether it can run, in preference order. Never throws. */\nexport const probeProviders = async (providers: readonly Provider[]): Promise<ProviderStatus[]> =>\n Promise.all(\n byPreference(providers).map(async (provider) => ({\n name : provider.name,\n available: await provider.available().catch(() => false),\n })),\n );\n\n\n/**\n * The provider to use: the one named by a flag or the config, otherwise the\n * first one available in preference order.\n */\nexport const resolveProvider = async (options: ResolveProviderOptions): Promise<Provider> => {\n const known = options.providers.map((provider) => provider.name);\n const explicit = options.requested ?? options.config?.provider;\n\n if (explicit !== undefined && explicit !== \"\") {\n const match = options.providers.find((provider) => provider.name === explicit);\n\n if (match === undefined) {\n throw new UnknownProviderError(explicit, known);\n }\n\n return match;\n }\n\n for (const provider of byPreference(options.providers)) {\n if (await provider.available().catch(() => false)) {\n return provider;\n }\n }\n\n throw new NoProviderAvailableError(known);\n};\n","import type { Layer, Provider } from \"@glossic/schema\";\n\n/** A name-keyed collection of layers or providers, kept in insertion order. */\nexport class Registry<T extends { name: string }> {\n readonly #items = new Map<string, T>();\n\n register(item: T): this {\n this.#items.set(item.name, item);\n return this;\n }\n\n get(name: string): T | undefined {\n return this.#items.get(name);\n }\n\n has(name: string): boolean {\n return this.#items.has(name);\n }\n\n list(): T[] {\n return [...this.#items.values()];\n }\n\n get size(): number {\n return this.#items.size;\n }\n}\n\nexport type AdapterRegistry = Registry<Layer>;\nexport type ProviderRegistry = Registry<Provider>;\n\nexport const createAdapterRegistry = (adapters: Layer[] = []): AdapterRegistry => {\n const registry = new Registry<Layer>();\n\n for (const adapter of adapters) {\n registry.register(adapter);\n }\n\n return registry;\n};\n\nexport const createProviderRegistry = (providers: Provider[] = []): ProviderRegistry => {\n const registry = new Registry<Provider>();\n\n for (const provider of providers) {\n registry.register(provider);\n }\n\n return registry;\n};\n","import type { CompletionRequest, CompletionResult, Provider } from \"@glossic/schema\";\n\n/** A provider that records what it was asked, for assertions. */\nexport interface FakeProvider extends Provider {\n readonly calls: CompletionRequest[];\n}\n\nexport interface FakeProviderOptions {\n name ?: string;\n available?: boolean;\n respond ?: (request: CompletionRequest, index: number) => string;\n}\n\n\nconst defaultDocument = (request: CompletionRequest, index: number): string =>\n [\n \"## What it does\",\n \"\",\n `Fake documentation number ${index} for ${String(request.metadata.unitId ?? \"a unit\")}.`,\n \"\",\n \"## Responsibilities\",\n \"\",\n \"The unit owns its own behaviour and delegates everything else to its\",\n \"neighbours. Nothing here reaches outside the boundary it declares.\",\n \"\",\n \"## Public elements\",\n \"\",\n \"- Everything the unit exports, described in one line each.\",\n \"\",\n \"## Architectural decisions\",\n \"\",\n \"Dependencies point one way, errors are typed, and the ordering is total.\",\n ].join(\"\\n\");\n\n\n/** A provider that answers from memory, so a test can drive the pipeline end to end. */\nexport const createFakeProvider = (options: FakeProviderOptions = {}): FakeProvider => {\n const calls: CompletionRequest[] = [];\n\n return {\n name: options.name ?? \"fake\",\n calls,\n available: async () : Promise<boolean> => options.available ?? true,\n complete : async (request: CompletionRequest): Promise<CompletionResult> => {\n const index = calls.length;\n calls.push(request);\n\n const text = options.respond?.(request, index) ?? defaultDocument(request, index);\n return { text, model: \"fake-model\", usage: { inputTokens: 10, outputTokens: 5 } };\n },\n };\n};\n","import manifest from \"../package.json\" with { type: \"json\" };\n\nexport const CORE_VERSION: string = manifest.version;\n\nexport * from \"./cache.js\";\nexport * from \"./check.js\";\nexport * from \"./config-file.js\";\nexport * from \"./config-resolve.js\";\nexport * from \"./errors.js\";\nexport * from \"./generate/index.js\";\nexport * from \"./manifest.js\";\nexport * from \"./markdown.js\";\nexport * from \"./prompt.js\";\nexport * from \"./provider.js\";\nexport * from \"./registry.js\";\nexport * from \"./retry.js\";\nexport * from \"./scan/index.js\";\nexport * from \"./testing.js\";\nexport * from \"./utils/index.js\";\nexport * from \"./validate.js\";\nexport * from \"./workspace.js\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@glossic/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Glossic orchestration core: registries, pipeline and manifest plumbing",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"documentation",
|
|
@@ -51,7 +51,7 @@
|
|
|
51
51
|
"tinyglobby": "^0.2.15",
|
|
52
52
|
"yaml": "^2.8.1",
|
|
53
53
|
"zod": "^4.1.5",
|
|
54
|
-
"@glossic/schema": "0.
|
|
54
|
+
"@glossic/schema": "0.6.0"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
57
57
|
"build": "tsup",
|