@foss.global/codefeed 2.0.1 → 2.1.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.
@@ -0,0 +1,842 @@
1
+ import * as transport from './forgeinventory.transport.js';
2
+ import * as validation from './forgeinventory.validation.js';
3
+ import { ForgeRequestClient } from './forgeinventory.client.js';
4
+ /** The only limitation: data Gitea exposes to no administrator read and that the migration reissues. */
5
+ export const giteaSourceInventoryLimitations = [
6
+ 'Gitea has no read that lists user-scoped Actions secrets; they are reissued.',
7
+ ];
8
+ const lfsNotMeasured = { status: 'notMeasured', reason: 'Gitea exposes no API that lists LFS objects.' };
9
+ const complete = (valueArg) => ({ status: 'complete', value: BigInt(valueArg).toString() });
10
+ const partial = (observedArg, reasonArg) => ({ status: 'partial', observedValue: BigInt(observedArg).toString(), reason: reasonArg });
11
+ const notMeasured = (reasonArg) => ({ status: 'notMeasured', reason: reasonArg });
12
+ const unitDisabled = (unitArg) => notMeasured(`The ${unitArg} unit is disabled; Gitea's API hides its data.`);
13
+ /** The value a measure observed so far. */
14
+ const observed = (measureArg) => measureArg.status === 'complete' ? BigInt(measureArg.value)
15
+ : measureArg.status === 'partial' ? BigInt(measureArg.observedValue) : 0n;
16
+ /**
17
+ * Sums measures: complete only when every addend is, not measured when any
18
+ * addend is, otherwise partial with the observed sum and the first reason.
19
+ */
20
+ const sumMeasures = (measuresArg) => {
21
+ const missing = measuresArg.find((measureArg) => measureArg.status === 'notMeasured');
22
+ if (missing)
23
+ return missing;
24
+ const total = measuresArg.reduce((sumArg, measureArg) => sumArg + observed(measureArg), 0n);
25
+ const unfinished = measuresArg.find((measureArg) => measureArg.status === 'partial');
26
+ return unfinished?.status === 'partial' ? partial(total, unfinished.reason) : complete(total);
27
+ };
28
+ const listingMeasure = (listingArg, valueArg = BigInt(listingArg.items.length)) => listingArg.failure === null ? complete(valueArg) : partial(valueArg, listingArg.failure);
29
+ /** A sanitized failure reason: adapter-owned error codes only, never remote text. */
30
+ const reason = (errorArg) => errorArg instanceof validation.ForgeInventoryError ? errorArg.code : 'unexpected-error';
31
+ const requiredBoolean = (valueArg) => {
32
+ if (typeof valueArg !== 'boolean')
33
+ throw new validation.ForgeInventoryError('invalid-boolean');
34
+ return valueArg;
35
+ };
36
+ const requiredString = (valueArg) => {
37
+ const value = validation.optionalString(valueArg);
38
+ if (value === null)
39
+ throw new validation.ForgeInventoryError('invalid-string');
40
+ return value;
41
+ };
42
+ /** One provider path segment, as an owner or repository name. */
43
+ const segment = (valueArg) => {
44
+ const segments = validation.segments(valueArg);
45
+ if (segments.length !== 1)
46
+ throw new validation.ForgeInventoryError('invalid-path');
47
+ return segments[0];
48
+ };
49
+ const ownerVisibility = (valueArg) => {
50
+ if (valueArg === 'limited')
51
+ return 'internal';
52
+ const visibility = validation.visibility(valueArg);
53
+ if (visibility === null)
54
+ throw new validation.ForgeInventoryError('invalid-visibility');
55
+ return visibility;
56
+ };
57
+ /** Files attached to an issue, pull request, comment or release, with their bytes. */
58
+ const assets = (valueArg) => {
59
+ if (valueArg === undefined || valueArg === null)
60
+ return { count: 0n, bytes: 0n };
61
+ if (!Array.isArray(valueArg))
62
+ throw new validation.ForgeInventoryError('invalid-assets');
63
+ return valueArg.reduce((sumArg, assetArg) => ({
64
+ count: sumArg.count + 1n, bytes: sumArg.bytes + BigInt(validation.decimal(validation.record(assetArg).size)),
65
+ }), { count: 0n, bytes: 0n });
66
+ };
67
+ /** A `{ <rows>, total_count }` envelope whose rows must match its total. */
68
+ const countedEnvelope = (bodyArg, rowsKeyArg) => {
69
+ const body = validation.record(bodyArg);
70
+ const rows = body[rowsKeyArg] ?? [];
71
+ if (!Array.isArray(rows))
72
+ throw new validation.ForgeInventoryError('invalid-page');
73
+ return { rows, failure: validation.decimal(body.total_count) === String(rows.length) ? null : 'count-mismatch' };
74
+ };
75
+ const unitKey = (unitArg) => unitArg.kind === 'instance' ? 'instance'
76
+ : unitArg.kind === 'owner' ? `owner:${unitArg.ownerKind}:${unitArg.name}` : `repository:${unitArg.owner}/${unitArg.name}`;
77
+ const compareText = (aArg, bArg) => aArg < bArg ? -1 : aArg > bArg ? 1 : 0;
78
+ /**
79
+ * Authenticated, read-only inventory of a Gitea instance through its REST API,
80
+ * read with a site administrator's token. It only sends GET requests, counts
81
+ * secrets and variables without retaining their values, and reports every
82
+ * read that did not finish as a partial or unmeasured value instead of a count.
83
+ */
84
+ export class GiteaSourceInventory {
85
+ #options;
86
+ #client;
87
+ constructor(optionsArg) {
88
+ const baseUrl = validation.httpUrl(optionsArg.baseUrl);
89
+ if (!baseUrl || !baseUrl.startsWith('https:') || typeof optionsArg.instanceId !== 'string' || !optionsArg.instanceId.trim() ||
90
+ typeof optionsArg.token !== 'string' || !optionsArg.token || /[\s\u0000-\u001f\u007f]/.test(optionsArg.token)) {
91
+ throw new validation.ForgeInventoryError('invalid-options');
92
+ }
93
+ const limits = {
94
+ pageSize: optionsArg.pageSize ?? 50,
95
+ maxPages: optionsArg.maxPages ?? 10_000,
96
+ requestTimeoutMs: optionsArg.requestTimeoutMs ?? 60_000,
97
+ maxResponseBytes: optionsArg.maxResponseBytes ?? 16 * 1024 * 1024,
98
+ };
99
+ for (const [name, maximum] of [
100
+ ['pageSize', 100], ['maxPages', 1_000_000], ['requestTimeoutMs', 300_000], ['maxResponseBytes', 64 * 1024 * 1024],
101
+ ]) {
102
+ const value = limits[name];
103
+ if (!Number.isSafeInteger(value) || value < 1 || value > maximum)
104
+ throw new validation.ForgeInventoryError('invalid-limits');
105
+ }
106
+ this.#options = { instanceId: optionsArg.instanceId, baseUrl: baseUrl.replace(/\/+$/, ''), pageSize: limits.pageSize, maxPages: limits.maxPages };
107
+ this.#client = new ForgeRequestClient({
108
+ transport: optionsArg.caCertificates === undefined ? transport.globalFetchTransport
109
+ : transport.createHttpsTransport(validation.caCertificates(optionsArg.caCertificates)),
110
+ headers: { authorization: `token ${optionsArg.token}` },
111
+ requestTimeoutMs: limits.requestTimeoutMs,
112
+ maxResponseBytes: limits.maxResponseBytes,
113
+ });
114
+ }
115
+ /** Validated, normalized instance root; contains no credentials or API suffix. */
116
+ get baseUrl() { return this.#options.baseUrl; }
117
+ get metrics() { return this.#client.metrics; }
118
+ /**
119
+ * Identifies the source and its reader and lists every owner and repository.
120
+ * Rejects unless the token belongs to a site administrator; a listing that
121
+ * does not finish is reported in `incompleteReasons`.
122
+ */
123
+ async discover(signalArg) {
124
+ const reader = validation.record((await this.#get('/user', { signal: signalArg })).body);
125
+ if (reader.is_admin !== true)
126
+ throw new validation.ForgeInventoryError('reader-not-site-admin');
127
+ const version = validation.record((await this.#get('/version', { signal: signalArg })).body).version;
128
+ if (typeof version !== 'string' || version.length > 128 || !/^\d+\.\d+\.\d+(?:[-+][A-Za-z0-9][A-Za-z0-9.+-]*)?$/.test(version)) {
129
+ throw new validation.ForgeInventoryError('invalid-server-version');
130
+ }
131
+ const incompleteReasons = [];
132
+ const organizations = await this.#list('/admin/orgs', { signal: signalArg });
133
+ const users = await this.#list('/admin/users', { signal: signalArg });
134
+ const repositories = await this.#list('/repos/search', {
135
+ signal: signalArg, query: { private: 'true', sort: 'id', order: 'asc' },
136
+ rows: (bodyArg) => {
137
+ const envelope = validation.record(bodyArg);
138
+ if (envelope.ok !== true)
139
+ throw new validation.ForgeInventoryError('search-not-successful');
140
+ return envelope.data;
141
+ },
142
+ });
143
+ for (const [name, listing] of [['organizations', organizations], ['users', users], ['repositories', repositories]]) {
144
+ if (listing.failure !== null)
145
+ incompleteReasons.push(`discovery: ${name}: ${listing.failure}`);
146
+ }
147
+ const owners = [
148
+ ...organizations.items.map((itemArg) => ({ kind: 'organization', name: segment(validation.record(itemArg).name) })),
149
+ ...users.items.map((itemArg) => ({ kind: 'user', name: segment(validation.record(itemArg).login) })),
150
+ ].sort((aArg, bArg) => compareText(aArg.kind, bArg.kind) || compareText(aArg.name, bArg.name));
151
+ const discovered = repositories.items.map((itemArg) => {
152
+ const item = validation.record(itemArg);
153
+ return { owner: segment(validation.record(item.owner).login), name: segment(item.name) };
154
+ }).sort((aArg, bArg) => compareText(aArg.owner, bArg.owner) || compareText(aArg.name, bArg.name));
155
+ return {
156
+ source: { instanceId: this.#options.instanceId, kind: 'gitea', baseUrl: this.#options.baseUrl, version },
157
+ reader: { login: segment(reader.login), siteAdmin: true },
158
+ owners,
159
+ repositories: discovered,
160
+ incompleteReasons: incompleteReasons.sort(compareText),
161
+ };
162
+ }
163
+ /** Every unit a run over this discovery measures: the instance, then owners, then repositories. */
164
+ units(discoveryArg) {
165
+ return [
166
+ { kind: 'instance' },
167
+ ...discoveryArg.owners.map((ownerArg) => ({ kind: 'owner', ownerKind: ownerArg.kind, name: ownerArg.name })),
168
+ ...discoveryArg.repositories.map((repositoryArg) => ({ kind: 'repository', owner: repositoryArg.owner, name: repositoryArg.name })),
169
+ ];
170
+ }
171
+ /** Measures one unit. Never rejects: a unit whose primary record cannot be read is `failed`. */
172
+ async measureUnit(unitArg, signalArg) {
173
+ try {
174
+ if (unitArg.kind === 'instance')
175
+ return { kind: 'instance', instance: await this.#instance(signalArg) };
176
+ if (unitArg.kind === 'owner') {
177
+ return { kind: 'owner', owner: unitArg.ownerKind === 'organization' ? await this.#organization(unitArg.name, signalArg) : await this.#user(unitArg.name, signalArg) };
178
+ }
179
+ return { kind: 'repository', repository: await this.#repository(unitArg.owner, unitArg.name, signalArg) };
180
+ }
181
+ catch (error) {
182
+ return { kind: 'failed', unit: unitArg, reason: reason(error) };
183
+ }
184
+ }
185
+ /**
186
+ * Measures units with bounded concurrency; results keep the order of `unitsArg`.
187
+ * An aborted signal or a rejected `onResult` aborts the units in flight, hands
188
+ * over no further result and rejects once every worker has stopped.
189
+ */
190
+ async measureUnits(unitsArg, optionsArg = {}) {
191
+ const concurrency = optionsArg.concurrency ?? 4;
192
+ if (!Number.isSafeInteger(concurrency) || concurrency < 1 || concurrency > 16)
193
+ throw new validation.ForgeInventoryError('invalid-concurrency');
194
+ const results = new Array(unitsArg.length);
195
+ // The first failure aborts the units in flight; nothing is handed over after it.
196
+ const controller = new AbortController();
197
+ const abort = () => controller.abort();
198
+ if (optionsArg.signal?.aborted)
199
+ abort();
200
+ optionsArg.signal?.addEventListener('abort', abort, { once: true });
201
+ let failure = null;
202
+ let next = 0;
203
+ const worker = async () => {
204
+ while (failure === null && next < unitsArg.length) {
205
+ const index = next++;
206
+ try {
207
+ if (controller.signal.aborted)
208
+ throw new validation.ForgeInventoryError('request-aborted');
209
+ const result = await this.measureUnit(unitsArg[index], controller.signal);
210
+ if (failure !== null)
211
+ return;
212
+ if (controller.signal.aborted)
213
+ throw new validation.ForgeInventoryError('request-aborted');
214
+ results[index] = result;
215
+ await optionsArg.onResult?.(result);
216
+ }
217
+ catch (error) {
218
+ failure ??= { error };
219
+ abort();
220
+ }
221
+ }
222
+ };
223
+ try {
224
+ await Promise.all(Array.from({ length: Math.min(concurrency, unitsArg.length) }, worker));
225
+ }
226
+ finally {
227
+ optionsArg.signal?.removeEventListener('abort', abort);
228
+ }
229
+ if (failure !== null)
230
+ throw failure.error;
231
+ return results;
232
+ }
233
+ async #instance(signalArg) {
234
+ const users = await this.#list('/admin/users', { signal: signalArg });
235
+ const flagged = (predicateArg) => listingMeasure(users, BigInt(users.items.filter((itemArg) => predicateArg(validation.record(itemArg))).length));
236
+ const runners = await this.#runners('/admin/actions/runners', { signal: signalArg });
237
+ return {
238
+ users: {
239
+ total: listingMeasure(users),
240
+ active: flagged((userArg) => requiredBoolean(userArg.active)),
241
+ admins: flagged((userArg) => requiredBoolean(userArg.is_admin)),
242
+ restricted: flagged((userArg) => requiredBoolean(userArg.restricted)),
243
+ prohibitLogin: flagged((userArg) => requiredBoolean(userArg.prohibit_login)),
244
+ externalAuth: flagged((userArg) => validation.decimal(userArg.source_id) !== '0'),
245
+ twoFactor: await this.#count('/admin/users', { signal: signalArg, query: { is_2fa_enabled: 'true' } }),
246
+ },
247
+ organizations: await this.#count('/admin/orgs', { signal: signalArg }),
248
+ systemWebhooks: await this.#count('/admin/hooks', { signal: signalArg, query: { type: 'all' } }),
249
+ runners,
250
+ unadoptedRepositories: await this.#count('/admin/unadopted', { signal: signalArg }),
251
+ };
252
+ }
253
+ async #ownerBase(nameArg, recordArg, repositoriesPathArg, signalArg) {
254
+ return {
255
+ name: nameArg,
256
+ id: validation.decimal(recordArg.id),
257
+ visibility: ownerVisibility(recordArg.visibility),
258
+ repositories: await this.#count(repositoriesPathArg, { signal: signalArg }),
259
+ packages: await this.#packages(nameArg, signalArg),
260
+ };
261
+ }
262
+ async #organization(nameArg, signalArg) {
263
+ const path = `/orgs/${encodeURIComponent(nameArg)}`;
264
+ const organization = validation.record((await this.#get(path, { signal: signalArg })).body);
265
+ if (segment(organization.name) !== nameArg)
266
+ throw new validation.ForgeInventoryError('owner-identity-changed');
267
+ const teams = await this.#list(`${path}/teams`, { signal: signalArg });
268
+ const memberships = [];
269
+ const grants = [];
270
+ for (const team of teams.items) {
271
+ const teamPath = `/teams/${validation.decimal(validation.record(team).id)}`;
272
+ memberships.push(await this.#count(`${teamPath}/members`, { signal: signalArg }));
273
+ grants.push(await this.#count(`${teamPath}/repos`, { signal: signalArg }));
274
+ }
275
+ const teamsMeasure = listingMeasure(teams);
276
+ const fromTeams = (measuresArg) => sumMeasures([...measuresArg, ...(teamsMeasure.status === 'complete' ? [] : [partial(0, teams.failure)])]);
277
+ return {
278
+ kind: 'organization',
279
+ ...await this.#ownerBase(nameArg, organization, `${path}/repos`, signalArg),
280
+ webhooks: await this.#count(`${path}/hooks`, { signal: signalArg }),
281
+ actionsVariables: await this.#count(`${path}/actions/variables`, { signal: signalArg }),
282
+ runners: await this.#runners(`${path}/actions/runners`, { signal: signalArg }),
283
+ members: await this.#count(`${path}/members`, { signal: signalArg }),
284
+ teams: teamsMeasure,
285
+ teamMemberships: fromTeams(memberships),
286
+ teamRepositoryGrants: fromTeams(grants),
287
+ labels: await this.#count(`${path}/labels`, { signal: signalArg }),
288
+ actionsSecrets: await this.#count(`${path}/actions/secrets`, { signal: signalArg }),
289
+ };
290
+ }
291
+ async #user(nameArg, signalArg) {
292
+ const path = `/users/${encodeURIComponent(nameArg)}`;
293
+ const user = validation.record((await this.#get(path, { signal: signalArg })).body);
294
+ if (segment(user.login) !== nameArg)
295
+ throw new validation.ForgeInventoryError('owner-identity-changed');
296
+ // User-scoped settings are only readable as that user, through the administrator's Sudo header.
297
+ const sudo = { signal: signalArg, sudo: nameArg };
298
+ return {
299
+ kind: 'user',
300
+ ...await this.#ownerBase(nameArg, user, `${path}/repos`, signalArg),
301
+ account: {
302
+ admin: requiredBoolean(user.is_admin),
303
+ active: requiredBoolean(user.active),
304
+ restricted: requiredBoolean(user.restricted),
305
+ prohibitLogin: requiredBoolean(user.prohibit_login),
306
+ externalAuth: validation.decimal(user.source_id) !== '0',
307
+ },
308
+ webhooks: await this.#count('/user/hooks', sudo),
309
+ actionsVariables: await this.#count('/user/actions/variables', sudo),
310
+ runners: await this.#runners('/user/actions/runners', sudo),
311
+ sshKeys: await this.#count(`${path}/keys`, { signal: signalArg }),
312
+ gpgKeys: await this.#count(`${path}/gpg_keys`, { signal: signalArg }),
313
+ };
314
+ }
315
+ /** Package versions by type, with their files and bytes. */
316
+ async #packages(ownerArg, signalArg) {
317
+ const ownerPath = `/packages/${encodeURIComponent(ownerArg)}`;
318
+ // Gitea lists one row per package version.
319
+ const versions = await this.#list(ownerPath, { signal: signalArg });
320
+ const byType = new Map();
321
+ for (const itemArg of versions.items) {
322
+ const item = validation.record(itemArg);
323
+ const type = requiredString(item.type);
324
+ // The type is reported and names reason paths, so it must be one of Gitea's plain identifiers.
325
+ if (!/^[a-z][a-z0-9_-]{0,31}$/.test(type))
326
+ throw new validation.ForgeInventoryError('invalid-package-type');
327
+ const name = requiredString(item.name);
328
+ const version = requiredString(item.version);
329
+ const entry = byType.get(type) ?? { names: new Set(), versions: 0, files: [], bytes: [] };
330
+ byType.set(type, entry);
331
+ entry.names.add(name);
332
+ entry.versions++;
333
+ try {
334
+ const files = (await this.#get(`${ownerPath}/${[type, name, version].map(encodeURIComponent).join('/')}/files`, { signal: signalArg })).body;
335
+ if (!Array.isArray(files))
336
+ throw new validation.ForgeInventoryError('invalid-page');
337
+ const bytes = files.reduce((sumArg, fileArg) => sumArg + BigInt(validation.decimal(validation.record(fileArg).size)), 0n);
338
+ entry.files.push(complete(files.length));
339
+ entry.bytes.push(complete(bytes));
340
+ }
341
+ catch (error) {
342
+ entry.files.push(partial(0, reason(error)));
343
+ entry.bytes.push(partial(0, reason(error)));
344
+ }
345
+ }
346
+ const unfinished = versions.failure === null ? [] : [partial(0, versions.failure)];
347
+ const counts = [...byType.entries()].sort(([aArg], [bArg]) => compareText(aArg, bArg)).map(([type, entry]) => ({
348
+ type,
349
+ packages: sumMeasures([complete(entry.names.size), ...unfinished]),
350
+ versions: sumMeasures([complete(entry.versions), ...unfinished]),
351
+ files: sumMeasures([...entry.files, ...unfinished]),
352
+ bytes: sumMeasures([...entry.bytes, ...unfinished]),
353
+ }));
354
+ // A listing that failed before its first row still has to surface as partial.
355
+ if (counts.length === 0 && versions.failure !== null) {
356
+ const failed = partial(0, versions.failure);
357
+ counts.push({ type: 'unknown', packages: failed, versions: failed, files: failed, bytes: failed });
358
+ }
359
+ return counts;
360
+ }
361
+ async #repository(ownerArg, nameArg, signalArg) {
362
+ const path = `/repos/${encodeURIComponent(ownerArg)}/${encodeURIComponent(nameArg)}`;
363
+ const item = validation.record((await this.#get(path, { signal: signalArg })).body);
364
+ const owner = validation.record(item.owner);
365
+ if (segment(owner.login) !== ownerArg || segment(item.name) !== nameArg)
366
+ throw new validation.ForgeInventoryError('repository-identity-changed');
367
+ const visibility = validation.giteaRepositoryVisibility(item.private, item.internal, owner.visibility);
368
+ if (visibility === null)
369
+ throw new validation.ForgeInventoryError('invalid-visibility');
370
+ const empty = requiredBoolean(item.empty);
371
+ const features = {
372
+ issues: requiredBoolean(item.has_issues),
373
+ pullRequests: requiredBoolean(item.has_pull_requests),
374
+ wiki: requiredBoolean(item.has_wiki),
375
+ releases: requiredBoolean(item.has_releases),
376
+ packages: requiredBoolean(item.has_packages),
377
+ actions: requiredBoolean(item.has_actions),
378
+ projects: requiredBoolean(item.has_projects),
379
+ };
380
+ const fork = requiredBoolean(item.fork);
381
+ const parent = item.parent === undefined || item.parent === null ? null : requiredString(validation.record(item.parent).full_name);
382
+ if (fork !== (parent !== null))
383
+ throw new validation.ForgeInventoryError('inconsistent-fork-parent');
384
+ const options = { signal: signalArg };
385
+ return {
386
+ owner: ownerArg,
387
+ name: nameArg,
388
+ id: validation.decimal(item.id),
389
+ visibility,
390
+ fork,
391
+ parent,
392
+ mirror: requiredBoolean(item.mirror),
393
+ template: requiredBoolean(item.template),
394
+ archived: requiredBoolean(item.archived),
395
+ empty,
396
+ objectFormat: requiredString(item.object_format_name),
397
+ defaultBranch: requiredString(item.default_branch),
398
+ features,
399
+ git: await this.#git(path, item, empty, signalArg),
400
+ lfs: { objects: lfsNotMeasured, bytes: lfsNotMeasured },
401
+ collaboration: await this.#collaboration(path, features, signalArg),
402
+ // Releases stay readable while their unit is disabled; a disabled wiki answers 404.
403
+ releases: await this.#releases(path, signalArg),
404
+ wikiPages: features.wiki ? await this.#count(`${path}/wiki/pages`, { ...options, missingIsEmpty: true }) : unitDisabled('wiki'),
405
+ access: {
406
+ collaborators: await this.#count(`${path}/collaborators`, options),
407
+ teams: await this.#repositoryTeams(path, options),
408
+ deployKeys: await this.#count(`${path}/keys`, options),
409
+ webhooks: await this.#count(`${path}/hooks`, options),
410
+ branchProtections: await this.#unpagedCount(`${path}/branch_protections`, options),
411
+ tagProtections: await this.#unpagedCount(`${path}/tag_protections`, options),
412
+ pushMirrors: await this.#count(`${path}/push_mirrors`, options),
413
+ },
414
+ actions: await this.#actions(path, empty, signalArg),
415
+ };
416
+ }
417
+ /** Gitea answers 405 for a repository that no organization owns, which therefore has no teams. */
418
+ async #repositoryTeams(pathArg, optionsArg) {
419
+ try {
420
+ const body = (await this.#get(`${pathArg}/teams`, optionsArg)).body;
421
+ if (!Array.isArray(body))
422
+ throw new validation.ForgeInventoryError('invalid-page');
423
+ return complete(body.length);
424
+ }
425
+ catch (error) {
426
+ if (error instanceof validation.ForgeInventoryError && error.code === 'http-405')
427
+ return complete(0);
428
+ return partial(0, reason(error));
429
+ }
430
+ }
431
+ async #git(pathArg, itemArg, emptyArg, signalArg) {
432
+ const reportedSizeKiB = complete(BigInt(validation.decimal(itemArg.size)));
433
+ if (emptyArg)
434
+ return { reportedSizeKiB, branches: complete(0), tags: complete(0), pullRequestRefs: complete(0), otherRefs: complete(0) };
435
+ try {
436
+ const refs = (await this.#get(`${pathArg}/git/refs`, { signal: signalArg })).body;
437
+ if (!Array.isArray(refs))
438
+ throw new validation.ForgeInventoryError('invalid-page');
439
+ const counts = { branches: 0, tags: 0, pullRequestRefs: 0, otherRefs: 0 };
440
+ for (const refArg of refs) {
441
+ const ref = requiredString(validation.record(refArg).ref);
442
+ if (ref.startsWith('refs/heads/'))
443
+ counts.branches++;
444
+ else if (ref.startsWith('refs/tags/'))
445
+ counts.tags++;
446
+ else if (ref.startsWith('refs/pull/'))
447
+ counts.pullRequestRefs++;
448
+ else
449
+ counts.otherRefs++;
450
+ }
451
+ return {
452
+ reportedSizeKiB, branches: complete(counts.branches), tags: complete(counts.tags),
453
+ pullRequestRefs: complete(counts.pullRequestRefs), otherRefs: complete(counts.otherRefs),
454
+ };
455
+ }
456
+ catch (error) {
457
+ const failed = partial(0, reason(error));
458
+ return { reportedSizeKiB, branches: failed, tags: failed, pullRequestRefs: failed, otherRefs: failed };
459
+ }
460
+ }
461
+ async #collaboration(pathArg, featuresArg, signalArg) {
462
+ const options = { signal: signalArg };
463
+ // Labels and milestones stay readable while the issue units are disabled.
464
+ const labels = await this.#count(`${pathArg}/labels`, options);
465
+ const milestones = await this.#count(`${pathArg}/milestones`, { ...options, query: { state: 'all' } });
466
+ if (!featuresArg.issues || !featuresArg.pullRequests) {
467
+ // A disabled unit silently drops its items from the shared issue listing; with both disabled the listings answer 404.
468
+ const hidden = unitDisabled(featuresArg.issues ? 'pull requests' : 'issues');
469
+ return {
470
+ issues: hidden, pullRequests: hidden, comments: hidden, reviews: hidden, reviewComments: hidden,
471
+ labels, milestones, reactions: hidden, attachments: hidden, attachmentBytes: hidden,
472
+ };
473
+ }
474
+ // Issues and pull requests share one listing and one number sequence.
475
+ const issues = await this.#list(`${pathArg}/issues`, { ...options, query: { state: 'all' } });
476
+ const unfinished = issues.failure === null ? [] : [partial(0, issues.failure)];
477
+ let issueCount = 0n;
478
+ let pullCount = 0n;
479
+ let attachments = { count: 0n, bytes: 0n };
480
+ const reactions = [...unfinished];
481
+ const reviews = [...unfinished];
482
+ const reviewComments = [...unfinished];
483
+ for (const itemArg of issues.items) {
484
+ const item = validation.record(itemArg);
485
+ const number = validation.decimal(item.number);
486
+ const isPull = item.pull_request !== undefined && item.pull_request !== null;
487
+ if (isPull)
488
+ pullCount++;
489
+ else
490
+ issueCount++;
491
+ const itemAssets = assets(item.assets);
492
+ attachments = { count: attachments.count + itemAssets.count, bytes: attachments.bytes + itemAssets.bytes };
493
+ reactions.push(await this.#count(`${pathArg}/issues/${number}/reactions`, { ...options, nullIsEmpty: true }));
494
+ if (isPull) {
495
+ const pullReviews = await this.#list(`${pathArg}/pulls/${number}/reviews`, options);
496
+ reviews.push(listingMeasure(pullReviews));
497
+ const inline = pullReviews.items.reduce((sumArg, reviewArg) => sumArg + BigInt(validation.decimal(validation.record(reviewArg).comments_count)), 0n);
498
+ reviewComments.push(listingMeasure(pullReviews, inline));
499
+ }
500
+ }
501
+ const comments = await this.#list(`${pathArg}/issues/comments`, options);
502
+ const commentUnfinished = comments.failure === null ? [] : [partial(0, comments.failure)];
503
+ for (const commentArg of comments.items) {
504
+ const comment = validation.record(commentArg);
505
+ const commentAssets = assets(comment.assets);
506
+ attachments = { count: attachments.count + commentAssets.count, bytes: attachments.bytes + commentAssets.bytes };
507
+ reactions.push(await this.#unpagedCount(`${pathArg}/issues/comments/${validation.decimal(comment.id)}/reactions`, { ...options, nullIsEmpty: true }));
508
+ }
509
+ const attachmentUnfinished = [...unfinished, ...commentUnfinished];
510
+ return {
511
+ issues: listingMeasure(issues, issueCount),
512
+ pullRequests: listingMeasure(issues, pullCount),
513
+ comments: listingMeasure(comments),
514
+ reviews: sumMeasures(reviews),
515
+ reviewComments: sumMeasures(reviewComments),
516
+ labels,
517
+ milestones,
518
+ reactions: sumMeasures([...reactions, ...commentUnfinished]),
519
+ attachments: sumMeasures([complete(attachments.count), ...attachmentUnfinished]),
520
+ attachmentBytes: sumMeasures([complete(attachments.bytes), ...attachmentUnfinished]),
521
+ };
522
+ }
523
+ async #releases(pathArg, signalArg) {
524
+ // An administrator's listing includes drafts.
525
+ const releases = await this.#list(`${pathArg}/releases`, { signal: signalArg });
526
+ let drafts = 0n;
527
+ let releaseAssets = { count: 0n, bytes: 0n };
528
+ for (const itemArg of releases.items) {
529
+ const item = validation.record(itemArg);
530
+ if (requiredBoolean(item.draft))
531
+ drafts++;
532
+ const itemAssets = assets(item.assets);
533
+ releaseAssets = { count: releaseAssets.count + itemAssets.count, bytes: releaseAssets.bytes + itemAssets.bytes };
534
+ }
535
+ return {
536
+ releases: listingMeasure(releases),
537
+ drafts: listingMeasure(releases, drafts),
538
+ assets: listingMeasure(releases, releaseAssets.count),
539
+ assetBytes: listingMeasure(releases, releaseAssets.bytes),
540
+ };
541
+ }
542
+ /** Every Actions read stays available while the repository's Actions unit is disabled. */
543
+ async #actions(pathArg, emptyArg, signalArg) {
544
+ const options = { signal: signalArg };
545
+ const settings = {
546
+ secrets: await this.#count(`${pathArg}/actions/secrets`, options),
547
+ variables: await this.#count(`${pathArg}/actions/variables`, options),
548
+ runners: await this.#runners(`${pathArg}/actions/runners`, options),
549
+ };
550
+ let workflows;
551
+ if (emptyArg) {
552
+ workflows = complete(0);
553
+ }
554
+ else {
555
+ try {
556
+ const listing = countedEnvelope((await this.#get(`${pathArg}/actions/workflows`, options)).body, 'workflows');
557
+ workflows = listing.failure === null ? complete(listing.rows.length) : partial(listing.rows.length, listing.failure);
558
+ }
559
+ catch (error) {
560
+ workflows = partial(0, reason(error));
561
+ }
562
+ }
563
+ let runs;
564
+ try {
565
+ // The run history is archived, not migrated; its total sizes the archive without reading every run.
566
+ const body = validation.record((await this.#get(`${pathArg}/actions/runs`, { ...options, query: { limit: '1', page: '1' } })).body);
567
+ runs = complete(BigInt(validation.decimal(body.total_count)));
568
+ }
569
+ catch (error) {
570
+ runs = partial(0, reason(error));
571
+ }
572
+ let artifacts;
573
+ let artifactBytes;
574
+ try {
575
+ const listing = countedEnvelope((await this.#get(`${pathArg}/actions/artifacts`, options)).body, 'artifacts');
576
+ const bytes = listing.rows.reduce((sumArg, artifactArg) => sumArg + BigInt(validation.decimal(validation.record(artifactArg).size_in_bytes)), 0n);
577
+ artifacts = listing.failure === null ? complete(listing.rows.length) : partial(listing.rows.length, listing.failure);
578
+ artifactBytes = listing.failure === null ? complete(bytes) : partial(bytes, listing.failure);
579
+ }
580
+ catch (error) {
581
+ artifacts = artifactBytes = partial(0, reason(error));
582
+ }
583
+ return { workflows, ...settings, runs, artifacts, artifactBytes };
584
+ }
585
+ /** Runner listings are unpaged `{ runners, total_count }` envelopes. */
586
+ async #runners(pathArg, optionsArg) {
587
+ try {
588
+ const listing = countedEnvelope((await this.#get(pathArg, optionsArg)).body, 'runners');
589
+ return listing.failure === null ? complete(listing.rows.length) : partial(listing.rows.length, listing.failure);
590
+ }
591
+ catch (error) {
592
+ return partial(0, reason(error));
593
+ }
594
+ }
595
+ async #unpagedCount(pathArg, optionsArg) {
596
+ try {
597
+ const response = (await this.#get(pathArg, optionsArg)).body;
598
+ const body = response === null && optionsArg.nullIsEmpty ? [] : response;
599
+ if (!Array.isArray(body))
600
+ throw new validation.ForgeInventoryError('invalid-page');
601
+ return complete(body.length);
602
+ }
603
+ catch (error) {
604
+ return partial(0, reason(error));
605
+ }
606
+ }
607
+ async #count(pathArg, optionsArg) {
608
+ return listingMeasure(await this.#list(pathArg, optionsArg));
609
+ }
610
+ /**
611
+ * Reads every page of a listing. It ends at an empty page or once the rows
612
+ * reach `X-Total-Count`, and is partial when the total disagrees with the
613
+ * rows read, a page repeats, the page limit is reached or a page fails.
614
+ */
615
+ async #list(pathArg, optionsArg) {
616
+ const items = [];
617
+ let previousPage = null;
618
+ let total = null;
619
+ for (let page = 1;; page++) {
620
+ if (page > this.#options.maxPages)
621
+ return { items, failure: 'page-limit' };
622
+ let rows;
623
+ let totalHeader;
624
+ try {
625
+ const response = await this.#get(pathArg, {
626
+ ...optionsArg, query: { ...optionsArg.query, limit: String(this.#options.pageSize), page: String(page) },
627
+ });
628
+ rows = optionsArg.rows ? optionsArg.rows(response.body) : response.body;
629
+ if (rows === null && optionsArg.nullIsEmpty)
630
+ rows = [];
631
+ totalHeader = response.headers.get('x-total-count');
632
+ }
633
+ catch (error) {
634
+ if (page === 1 && optionsArg.missingIsEmpty && error instanceof validation.ForgeInventoryError && error.code === 'http-404') {
635
+ return { items, failure: null };
636
+ }
637
+ return { items, failure: reason(error) };
638
+ }
639
+ if (!Array.isArray(rows) || rows.length > this.#options.pageSize)
640
+ return { items, failure: 'invalid-page' };
641
+ if (totalHeader !== null) {
642
+ let pageTotal;
643
+ try {
644
+ pageTotal = BigInt(validation.decimal(totalHeader));
645
+ }
646
+ catch {
647
+ return { items, failure: 'invalid-total-count' };
648
+ }
649
+ if (total !== null && pageTotal !== total)
650
+ return { items, failure: 'total-changed' };
651
+ total = pageTotal;
652
+ }
653
+ if (rows.length === 0)
654
+ break;
655
+ const signature = JSON.stringify(rows);
656
+ if (signature === previousPage)
657
+ return { items, failure: 'repeated-page' };
658
+ previousPage = signature;
659
+ items.push(...rows);
660
+ if (total !== null && BigInt(items.length) >= total)
661
+ break;
662
+ }
663
+ if (total !== null && BigInt(items.length) !== total)
664
+ return { items, failure: 'count-mismatch' };
665
+ return { items, failure: null };
666
+ }
667
+ #get(pathArg, optionsArg) {
668
+ const url = new URL(`${this.#options.baseUrl}/api/v1${pathArg}`);
669
+ for (const [key, value] of Object.entries(optionsArg.query ?? {}))
670
+ url.searchParams.set(key, value);
671
+ const request = { signal: optionsArg.signal };
672
+ if (optionsArg.sudo !== undefined)
673
+ request.headers = { sudo: optionsArg.sudo };
674
+ return this.#client.request(url, request);
675
+ }
676
+ }
677
+ /** Repository-shaped groups, summed over repositories. */
678
+ const sumGroup = (groupsArg, keysArg, missingArg) => Object.fromEntries(keysArg.map((keyArg) => [keyArg, sumMeasures([...groupsArg.map((groupArg) => groupArg[keyArg]), ...missingArg])]));
679
+ const indicator = (measureArg, predicateArg) => measureArg.status === 'complete' ? complete(predicateArg(BigInt(measureArg.value)) ? 1 : 0)
680
+ : measureArg.status === 'partial' ? partial(predicateArg(BigInt(measureArg.observedValue)) ? 1 : 0, measureArg.reason) : measureArg;
681
+ /** Every measure of a document with its dotted path. */
682
+ const measuresOf = (valueArg, pathArg, outArg) => {
683
+ if (!valueArg || typeof valueArg !== 'object')
684
+ return;
685
+ const value = valueArg;
686
+ if (typeof value.status === 'string' && (value.status === 'complete' || value.status === 'partial' || value.status === 'notMeasured')) {
687
+ outArg.push({ path: pathArg, measure: value });
688
+ return;
689
+ }
690
+ for (const [key, child] of Object.entries(value)) {
691
+ // Package counts are keyed by their type rather than their position.
692
+ const name = Array.isArray(value) && child && typeof child === 'object' && typeof child.type === 'string'
693
+ ? child.type : key;
694
+ measuresOf(child, pathArg ? `${pathArg}.${name}` : name, outArg);
695
+ }
696
+ };
697
+ /**
698
+ * Composes the deterministic inventory from a discovery and its unit results.
699
+ * Repeated results for one unit keep the last. Units without a successful
700
+ * result, owner repository counts that disagree with discovery, and every
701
+ * partial or unmeasured value make the inventory incomplete, with reasons
702
+ * aggregated per subject kind, path and reason.
703
+ */
704
+ export const composeGiteaSourceInventory = (discoveryArg, resultsArg, generatorsArg) => {
705
+ const results = new Map();
706
+ for (const result of resultsArg) {
707
+ const unit = result.kind === 'failed' ? result.unit : result.kind === 'instance' ? { kind: 'instance' }
708
+ : result.kind === 'owner' ? { kind: 'owner', ownerKind: result.owner.kind, name: result.owner.name }
709
+ : { kind: 'repository', owner: result.repository.owner, name: result.repository.name };
710
+ results.set(unitKey(unit), result);
711
+ }
712
+ const reasons = new Map();
713
+ const addReason = (textArg) => reasons.set(textArg, (reasons.get(textArg) ?? 0) + 1);
714
+ for (const text of discoveryArg.incompleteReasons)
715
+ addReason(text);
716
+ const instanceResult = results.get('instance');
717
+ let instance;
718
+ if (instanceResult?.kind === 'instance') {
719
+ instance = instanceResult.instance;
720
+ }
721
+ else {
722
+ const missing = notMeasured(instanceResult?.kind === 'failed' ? `The instance unit failed: ${instanceResult.reason}.` : 'The instance unit was not measured.');
723
+ instance = {
724
+ users: { total: missing, active: missing, admins: missing, restricted: missing, prohibitLogin: missing, externalAuth: missing, twoFactor: missing },
725
+ organizations: missing, systemWebhooks: missing, runners: missing, unadoptedRepositories: missing,
726
+ };
727
+ }
728
+ const owners = [];
729
+ const failedOwners = [];
730
+ for (const owner of discoveryArg.owners) {
731
+ const result = results.get(unitKey({ kind: 'owner', ownerKind: owner.kind, name: owner.name }));
732
+ if (result?.kind === 'owner')
733
+ owners.push(result.owner);
734
+ else {
735
+ failedOwners.push(owner.name);
736
+ addReason(`${owner.kind}: ${result?.kind === 'failed' ? `unit failed: ${result.reason}` : 'unit not measured'}`);
737
+ }
738
+ }
739
+ const repositories = [];
740
+ const failedRepositories = [];
741
+ for (const repository of discoveryArg.repositories) {
742
+ const result = results.get(unitKey({ kind: 'repository', ...repository }));
743
+ if (result?.kind === 'repository')
744
+ repositories.push(result.repository);
745
+ else {
746
+ failedRepositories.push(`${repository.owner}/${repository.name}`);
747
+ addReason(`repository: ${result?.kind === 'failed' ? `unit failed: ${result.reason}` : 'unit not measured'}`);
748
+ }
749
+ }
750
+ owners.sort((aArg, bArg) => compareText(aArg.kind, bArg.kind) || compareText(aArg.name, bArg.name));
751
+ repositories.sort((aArg, bArg) => compareText(aArg.owner, bArg.owner) || compareText(aArg.name, bArg.name));
752
+ // Each owner's own repository listing must agree with the instance-wide discovery.
753
+ const discoveredPerOwner = new Map();
754
+ for (const repository of discoveryArg.repositories)
755
+ discoveredPerOwner.set(repository.owner, (discoveredPerOwner.get(repository.owner) ?? 0) + 1);
756
+ for (const owner of owners) {
757
+ if (owner.repositories.status === 'complete' && owner.repositories.value !== String(discoveredPerOwner.get(owner.name) ?? 0)) {
758
+ addReason(`${owner.kind}: repositories: the owner listing disagrees with the instance-wide repository search`);
759
+ }
760
+ }
761
+ const ownerNames = new Set(discoveryArg.owners.map((ownerArg) => ownerArg.name));
762
+ for (const owner of discoveredPerOwner.keys()) {
763
+ if (!ownerNames.has(owner))
764
+ addReason('repository: owner missing from the owner discovery');
765
+ }
766
+ const missingOwners = failedOwners.length ? [partial(0, `Owner units not measured: ${failedOwners.length}.`)] : [];
767
+ const missingRepositories = failedRepositories.length ? [partial(0, `Repository units not measured: ${failedRepositories.length}.`)] : [];
768
+ const repositoryCount = (predicateArg) => sumMeasures([complete(repositories.filter(predicateArg).length), ...missingRepositories]);
769
+ const organizationOwners = owners.filter((ownerArg) => ownerArg.kind === 'organization');
770
+ const userOwners = owners.filter((ownerArg) => ownerArg.kind === 'user');
771
+ const ownerSum = (measuresArg) => sumMeasures([...measuresArg, ...missingOwners]);
772
+ const packageTypes = new Map();
773
+ for (const owner of owners)
774
+ for (const counts of owner.packages)
775
+ packageTypes.set(counts.type, [...packageTypes.get(counts.type) ?? [], counts]);
776
+ const inventory = {
777
+ generators: [...generatorsArg].sort((aArg, bArg) => compareText(aArg.package, bArg.package)),
778
+ source: discoveryArg.source,
779
+ reader: discoveryArg.reader,
780
+ limitations: [...giteaSourceInventoryLimitations],
781
+ instance,
782
+ owners,
783
+ repositories,
784
+ totals: {
785
+ organizations: instance.organizations,
786
+ users: instance.users.total,
787
+ repositories: {
788
+ total: repositoryCount(() => true),
789
+ private: repositoryCount((repositoryArg) => repositoryArg.visibility === 'private'),
790
+ internal: repositoryCount((repositoryArg) => repositoryArg.visibility === 'internal'),
791
+ forks: repositoryCount((repositoryArg) => repositoryArg.fork),
792
+ mirrors: repositoryCount((repositoryArg) => repositoryArg.mirror),
793
+ templates: repositoryCount((repositoryArg) => repositoryArg.template),
794
+ archived: repositoryCount((repositoryArg) => repositoryArg.archived),
795
+ empty: repositoryCount((repositoryArg) => repositoryArg.empty),
796
+ withWiki: sumMeasures([...repositories.map((repositoryArg) => indicator(repositoryArg.wikiPages, (valueArg) => valueArg > 0n)), ...missingRepositories]),
797
+ },
798
+ git: sumGroup(repositories.map((repositoryArg) => repositoryArg.git), ['reportedSizeKiB', 'branches', 'tags', 'pullRequestRefs', 'otherRefs'], missingRepositories),
799
+ lfs: sumGroup(repositories.map((repositoryArg) => repositoryArg.lfs), ['objects', 'bytes'], missingRepositories),
800
+ collaboration: sumGroup(repositories.map((repositoryArg) => repositoryArg.collaboration), ['issues', 'pullRequests', 'comments', 'reviews', 'reviewComments', 'labels', 'milestones', 'reactions', 'attachments', 'attachmentBytes'], missingRepositories),
801
+ releases: sumGroup(repositories.map((repositoryArg) => repositoryArg.releases), ['releases', 'drafts', 'assets', 'assetBytes'], missingRepositories),
802
+ wikiPages: sumMeasures([...repositories.map((repositoryArg) => repositoryArg.wikiPages), ...missingRepositories]),
803
+ access: sumGroup(repositories.map((repositoryArg) => repositoryArg.access), ['collaborators', 'teams', 'deployKeys', 'webhooks', 'branchProtections', 'tagProtections', 'pushMirrors'], missingRepositories),
804
+ actions: sumGroup(repositories.map((repositoryArg) => repositoryArg.actions), ['workflows', 'secrets', 'variables', 'runners', 'runs', 'artifacts', 'artifactBytes'], missingRepositories),
805
+ owners: {
806
+ webhooks: ownerSum(owners.map((ownerArg) => ownerArg.webhooks)),
807
+ actionsSecrets: ownerSum(organizationOwners.map((ownerArg) => ownerArg.actionsSecrets)),
808
+ actionsVariables: ownerSum(owners.map((ownerArg) => ownerArg.actionsVariables)),
809
+ runners: ownerSum(owners.map((ownerArg) => ownerArg.runners)),
810
+ members: ownerSum(organizationOwners.map((ownerArg) => ownerArg.members)),
811
+ teams: ownerSum(organizationOwners.map((ownerArg) => ownerArg.teams)),
812
+ teamMemberships: ownerSum(organizationOwners.map((ownerArg) => ownerArg.teamMemberships)),
813
+ teamRepositoryGrants: ownerSum(organizationOwners.map((ownerArg) => ownerArg.teamRepositoryGrants)),
814
+ labels: ownerSum(organizationOwners.map((ownerArg) => ownerArg.labels)),
815
+ sshKeys: ownerSum(userOwners.map((ownerArg) => ownerArg.sshKeys)),
816
+ gpgKeys: ownerSum(userOwners.map((ownerArg) => ownerArg.gpgKeys)),
817
+ },
818
+ packages: [...packageTypes.entries()].sort(([aArg], [bArg]) => compareText(aArg, bArg)).map(([type, countsArg]) => ({
819
+ type,
820
+ ...sumGroup(countsArg.map(({ type: _type, ...measures }) => measures), ['packages', 'versions', 'files', 'bytes'], missingOwners),
821
+ })),
822
+ },
823
+ };
824
+ // Every value that is not complete is a reason, aggregated per subject kind, path and reason.
825
+ const collected = [];
826
+ measuresOf(instance, 'instance', collected);
827
+ for (const owner of owners) {
828
+ const { name: _name, id: _id, ...measures } = owner;
829
+ measuresOf(measures, owner.kind, collected);
830
+ }
831
+ for (const repository of repositories)
832
+ measuresOf(repository, 'repository', collected);
833
+ for (const { path, measure } of collected) {
834
+ if (measure.status !== 'complete')
835
+ addReason(`${path}: ${measure.reason}`);
836
+ }
837
+ const incompleteReasons = [...reasons.entries()]
838
+ .map(([text, count]) => count > 1 ? `${text} (${count} times)` : text)
839
+ .sort(compareText);
840
+ return { ...inventory, inventoryComplete: incompleteReasons.length === 0, incompleteReasons };
841
+ };
842
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5naXRlYXNvdXJjZWludmVudG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZ2l0ZWFzb3VyY2VpbnZlbnRvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxLQUFLLFNBQVMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEtBQUssVUFBVSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBNERoRSx3R0FBd0c7QUFDeEcsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQXNCO0lBQ2hFLDhFQUE4RTtDQUMvRSxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQWEsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSw4Q0FBOEMsRUFBRSxDQUFDO0FBRW5ILE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBeUIsRUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkgsTUFBTSxPQUFPLEdBQUcsQ0FBQyxXQUE0QixFQUFFLFNBQWlCLEVBQVksRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDekssTUFBTSxXQUFXLEdBQUcsQ0FBQyxTQUFpQixFQUFZLEVBQUUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUNwRyxNQUFNLFlBQVksR0FBRyxDQUFDLE9BQWUsRUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDLE9BQU8sT0FBTyxnREFBZ0QsQ0FBQyxD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