specguard-mcp 0.1.12 → 0.1.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +113 -58
- package/dist/src/config.d.ts +100 -18
- package/dist/src/config.js +125 -5
- package/dist/src/config.js.map +1 -1
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +7 -6
- package/dist/src/index.js.map +1 -1
- package/dist/src/support/specguard-api.d.ts +2 -2
- package/dist/src/support/specguard-api.js +11 -10
- package/dist/src/support/specguard-api.js.map +1 -1
- package/dist/src/tools/add-repository.js +3 -2
- package/dist/src/tools/add-repository.js.map +1 -1
- package/dist/src/tools/index.d.ts +4 -3
- package/dist/src/tools/index.js +4 -3
- package/dist/src/tools/index.js.map +1 -1
- package/dist/src/tools/list-repositories.d.ts +47 -25
- package/dist/src/tools/list-repositories.js +79 -40
- package/dist/src/tools/list-repositories.js.map +1 -1
- package/dist/src/tools/list-repository-members.js +3 -2
- package/dist/src/tools/list-repository-members.js.map +1 -1
- package/dist/src/tools/near-duplicate-clusters.d.ts +20 -8
- package/dist/src/tools/near-duplicate-clusters.js +70 -23
- package/dist/src/tools/near-duplicate-clusters.js.map +1 -1
- package/dist/src/tools/registrable-repositories.js +2 -2
- package/dist/src/tools/registrable-repositories.js.map +1 -1
- package/dist/src/tools/repository-overview.d.ts +41 -1
- package/dist/src/tools/repository-overview.js +107 -6
- package/dist/src/tools/repository-overview.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { requireApiConfig } from "../config.js";
|
|
1
|
+
import { requireAgentApiConfig, requireApiConfig } from "../config.js";
|
|
2
2
|
import { getJsonObject } from "../support/specguard-api.js";
|
|
3
3
|
import { optionalBoolean, optionalString } from "./args.js";
|
|
4
4
|
/**
|
|
@@ -20,6 +20,41 @@ import { optionalBoolean, optionalString } from "./args.js";
|
|
|
20
20
|
* has grown — so the tool is described in those terms rather than as "get
|
|
21
21
|
* repository", which is not a question anybody asks.
|
|
22
22
|
*
|
|
23
|
+
* == `repository` chooses WHICH REPOSITORY, and the credential changes with it
|
|
24
|
+
*
|
|
25
|
+
* Everything above answers about the one repository the configured `sgk_` key
|
|
26
|
+
* RESOLVES TO — with five repositories in play, four of them are invisible to
|
|
27
|
+
* every agent holding a single-repository key. `repository` is the ask that
|
|
28
|
+
* fixes that: name one by its numeric id (the id `list_repositories` reports,
|
|
29
|
+
* not the `org/repo` handle — the plural endpoint looks the id up inside the
|
|
30
|
+
* calling credential's own read boundary) and the tool calls the PLURAL
|
|
31
|
+
* endpoint, `GET /api/v1/repositories/:id`, which serves the same
|
|
32
|
+
* `RepositoryOverview` body with every parameter below honoured exactly as the
|
|
33
|
+
* singular one serves it — with ONE DELIBERATE OMISSION this branch owns:
|
|
34
|
+
* `api_key` is ABSENT from the plural body, not null. That block describes the
|
|
35
|
+
* credential that made the REQUEST, and the singular controller is the only
|
|
36
|
+
* caller that has one to describe (`RepositoriesController#show` passes
|
|
37
|
+
* `api_key_block: serialized_api_key`; `UserRepositoriesController#show`
|
|
38
|
+
* passes none and says why at length: a block of nulls would be a sentence
|
|
39
|
+
* about a credential that does not exist, because this request was made with
|
|
40
|
+
* an agent or person key, and the repository's own `sgk_` keys are not the
|
|
41
|
+
* caller's to describe). So the `api_key.last_used_at` paragraph below is
|
|
42
|
+
* about the SINGULAR response; under `repository` the key is simply not there,
|
|
43
|
+
* and its absence is the plural surface's shape — never this bridge dropping
|
|
44
|
+
* a key. The two health blocks come from `RepositoryOverview` itself and DO
|
|
45
|
+
* travel. The ladder moves; the subject moves; `api_key` does not.
|
|
46
|
+
*
|
|
47
|
+
* THE CREDENTIAL MOVES WITH IT, because the endpoints refuse each other's
|
|
48
|
+
* tokens before any table is read: the singular path still authenticates with
|
|
49
|
+
* `SPECGUARD_API_KEY` (`sgk_`, one repository), the plural path with
|
|
50
|
+
* `SPECGUARD_AGENT_API_KEY` (`sga_`, the agent credential minted for exactly
|
|
51
|
+
* this — one key, many repositories, each read bounded by the key's own
|
|
52
|
+
* granted set server-side). Omitting `repository` is byte-for-byte today's
|
|
53
|
+
* request, and an operator who never sets the agent variable never sees this
|
|
54
|
+
* half of the tool exist — the blank-is-no-ask rule every argument here follows
|
|
55
|
+
* covers `repository` too, so a blank value falls back to the singular path
|
|
56
|
+
* rather than sending a guaranteed-404 id.
|
|
57
|
+
*
|
|
23
58
|
* == The response is passed through, not re-modelled
|
|
24
59
|
*
|
|
25
60
|
* Every figure in that body is annotated in the controller with the reason for
|
|
@@ -361,7 +396,12 @@ import { optionalBoolean, optionalString } from "./args.js";
|
|
|
361
396
|
* timestamp beside its stalest run, and the controller answers that with
|
|
362
397
|
* `acceptance_reported_by` / `rotation_reported_by` naming the keys that answer
|
|
363
398
|
* what it cannot. Naming the correction and not the claim would have been half a
|
|
364
|
-
* sentence.
|
|
399
|
+
* sentence. (The claim itself is served by the SINGULAR body only — the plural
|
|
400
|
+
* one under `repository` omits the whole `api_key` block, the deliberate
|
|
401
|
+
* omission documented at the branch above — so the correction paragraph in the
|
|
402
|
+
* description says which surface the instruction applies to rather than sending
|
|
403
|
+
* a plural-path reader hunting for a key that is not there.) And the truncation
|
|
404
|
+
* contract, which is NOT the uniform family it looks like from the
|
|
365
405
|
* key names: only eight lists have a `*_window` sibling at all, MOST lists under `latest_run`
|
|
366
406
|
* carry an inline `limit` beside `rows` instead, four of those windows serve no bound of their
|
|
367
407
|
* own, `rejections_window` serves a bound and no order, and the lists this census found carrying
|
|
@@ -436,6 +476,11 @@ const getRepositoryOverview = {
|
|
|
436
476
|
"runtime grain — an area where an existing spec was made slow gains no examples and appears " +
|
|
437
477
|
"only in the runtime one), " +
|
|
438
478
|
"the recent run history for growth over time, and the branches that have runs. " +
|
|
479
|
+
"Everything above is answered about ONE repository, and WHICH one has two spellings: by " +
|
|
480
|
+
"default it is the repository the configured sgk_… repository key resolves to, and passing " +
|
|
481
|
+
"`repository` (a numeric id from `list_repositories`) instead asks about that named " +
|
|
482
|
+
"repository under the agent key — one ask that changes the subject and nothing else, so " +
|
|
483
|
+
"every parameter below means the same thing either way. " +
|
|
439
484
|
"Pass `branch` for two more: which tests fail intermittently rather than consistently (the " +
|
|
440
485
|
"cross-run flakiness ranking) and how the areas moved across the whole branch window rather " +
|
|
441
486
|
"than between the last two runs. " +
|
|
@@ -479,7 +524,11 @@ const getRepositoryOverview = {
|
|
|
479
524
|
"Do NOT read `api_key.last_used_at` as evidence anything was ACCEPTED — it is stamped on the " +
|
|
480
525
|
"way in, before the payload is looked at, so a repository having every run thrown away still " +
|
|
481
526
|
"reports it seconds ago; `delivery_health` answers acceptance and `credential_health` answers " +
|
|
482
|
-
"rotation. " +
|
|
527
|
+
"rotation. That instruction is about the DEFAULT call's body: with `repository` the plural " +
|
|
528
|
+
"response has NO `api_key` key at all — absent, not null, because the block describes the " +
|
|
529
|
+
"credential that made the request and an agent key is not a repository key — so there is " +
|
|
530
|
+
"nothing to misread there, and an absent `api_key` on that path is the surface's shape, " +
|
|
531
|
+
"never a dropped block. " +
|
|
483
532
|
"Where a bound sits beside a list, the list is a PAGE and not the set: `limit` next to " +
|
|
484
533
|
"`rows`, or on that list's `*_window` block, which is also where the ORDER the cut was made " +
|
|
485
534
|
"in is named when the list has one. What announces the cut varies too — `truncated`, " +
|
|
@@ -509,7 +558,18 @@ const getRepositoryOverview = {
|
|
|
509
558
|
"what got slower or bigger since last time, to find which tests are flaky, to find " +
|
|
510
559
|
"duplicated coverage before refactoring, to see annotation coverage, or to check that what " +
|
|
511
560
|
"SpecGuard holds is still being delivered before trusting any of it. " +
|
|
512
|
-
"Needs SPECGUARD_ENDPOINT and SPECGUARD_API_KEY
|
|
561
|
+
"Needs SPECGUARD_ENDPOINT and SPECGUARD_API_KEY — an sgk_… repository key, which IS the " +
|
|
562
|
+
"repository the default call answers about. Pass `repository` and the credential changes " +
|
|
563
|
+
"with the endpoint: the call goes to GET /api/v1/repositories/:id — the plural surface, " +
|
|
564
|
+
"the same overview body with every parameter above honoured identically, MINUS the " +
|
|
565
|
+
"`api_key` block, which is ABSENT there rather than nulled (it describes the credential " +
|
|
566
|
+
"that made the request, and this request was not made with a repository key) — under " +
|
|
567
|
+
"SPECGUARD_AGENT_API_KEY, an sga_… agent key whose granted repository set is the read " +
|
|
568
|
+
"boundary the id is looked up inside (a repository outside the set answers 404, " +
|
|
569
|
+
"deliberately indistinguishable from a nonexistent one). SpecGuard refuses each credential " +
|
|
570
|
+
"in the other's place before it reads anything, so naming `repository` without the agent " +
|
|
571
|
+
"key — or omitting it with only the agent key set — is refused HERE, by name, before any " +
|
|
572
|
+
"request is made. " +
|
|
513
573
|
"Figures are null where CI did not report them — a null is 'not measured', never zero. That " +
|
|
514
574
|
"rule is about NULLS and does not run backwards: a non-null figure is not thereby a " +
|
|
515
575
|
"measurement. A run that reported zero tests serves a real `total_specs: 0` beside " +
|
|
@@ -518,6 +578,29 @@ const getRepositoryOverview = {
|
|
|
518
578
|
inputSchema: {
|
|
519
579
|
type: "object",
|
|
520
580
|
properties: {
|
|
581
|
+
repository: {
|
|
582
|
+
type: "string",
|
|
583
|
+
description: "Ask about THIS repository instead of the one the configured sgk_… key resolves to — " +
|
|
584
|
+
"the ask that makes the other four repositories visible to an agent holding a " +
|
|
585
|
+
"single-repository key. The value is the repository's NUMERIC ID, exactly as served " +
|
|
586
|
+
"in `list_repositories` entries' `id` — not the `org/repo` handle: the plural endpoint " +
|
|
587
|
+
"looks the id up inside the calling key's own read boundary, and a handle casts to no " +
|
|
588
|
+
"id and answers 404. " +
|
|
589
|
+
"The credential changes with it, because SpecGuard refuses each key kind in the " +
|
|
590
|
+
"other's place: the call authenticates with SPECGUARD_AGENT_API_KEY (an sga_… agent " +
|
|
591
|
+
"key) instead of SPECGUARD_API_KEY, and the set of repositories the agent key was " +
|
|
592
|
+
"granted at mint time is the boundary the id is resolved inside — a repository " +
|
|
593
|
+
"outside the set answers 404, indistinguishable from one that does not exist, and " +
|
|
594
|
+
"`list_repositories` under the same key lists exactly the set that is reachable. " +
|
|
595
|
+
"Every parameter means the same thing on either path: same ladder, same `run_anchor` " +
|
|
596
|
+
"contract, same overview body with ONE difference this path owns — `api_key` is " +
|
|
597
|
+
"ABSENT from the plural response, not null (the block describes the credential that " +
|
|
598
|
+
"made the request, and an agent-key caller is not a repository key), so its absence " +
|
|
599
|
+
"is the plural surface's shape, never a dropped key. " +
|
|
600
|
+
"Omit it — or pass a blank — and the call is byte-for-byte the singular one: " +
|
|
601
|
+
"SPECGUARD_API_KEY on GET /api/v1/repository, exactly as before this argument " +
|
|
602
|
+
"existed, so an operator who never sets the agent key is unaffected.",
|
|
603
|
+
},
|
|
521
604
|
branch: {
|
|
522
605
|
type: "string",
|
|
523
606
|
description: "Narrow the run history to one branch, giving a real growth series instead of the " +
|
|
@@ -770,6 +853,10 @@ const getRepositoryOverview = {
|
|
|
770
853
|
additionalProperties: false,
|
|
771
854
|
},
|
|
772
855
|
async run(args, context) {
|
|
856
|
+
// Argument shape is checked before any config is resolved — the order every
|
|
857
|
+
// tool here keeps, so a wrong-typed argument is the agent's own fixable
|
|
858
|
+
// mistake even on a server with no credentials at all.
|
|
859
|
+
const repository = optionalString(args["repository"], "repository");
|
|
773
860
|
const branch = optionalString(args["branch"], "branch");
|
|
774
861
|
const specDirectory = optionalString(args["spec_directory"], "spec_directory");
|
|
775
862
|
const specFile = optionalString(args["spec_file"], "spec_file");
|
|
@@ -782,8 +869,22 @@ const getRepositoryOverview = {
|
|
|
782
869
|
// `String(false)` would open a hundred-row block for the one caller who
|
|
783
870
|
// asked explicitly for it not to be. See this file's header.
|
|
784
871
|
const unannotatedExamples = optionalBoolean(args["unannotated_examples"], "unannotated_examples");
|
|
785
|
-
|
|
786
|
-
|
|
872
|
+
// WHICH ENDPOINT AND WHICH CREDENTIAL is decided here, once, from the one
|
|
873
|
+
// ask: `repository` present means the plural surface under the agent key,
|
|
874
|
+
// absent means the singular surface under the `sgk_` slot — byte-for-byte
|
|
875
|
+
// the request this tool made before the argument existed. The two are kept
|
|
876
|
+
// as one branch point rather than spread across the call below, so the
|
|
877
|
+
// pair (path, credential) cannot be mixed: a plural path under the
|
|
878
|
+
// repository key, or a singular path under the agent key, is a 401 at the
|
|
879
|
+
// deployment by design, and both mistakes are refused HERE, legibly,
|
|
880
|
+
// instead.
|
|
881
|
+
const api = repository === undefined
|
|
882
|
+
? requireApiConfig(context.config)
|
|
883
|
+
: requireAgentApiConfig(context.config);
|
|
884
|
+
const path = repository === undefined
|
|
885
|
+
? "/api/v1/repository"
|
|
886
|
+
: `/api/v1/repositories/${encodeURIComponent(repository)}`;
|
|
887
|
+
const overview = await getJsonObject(api, path, {
|
|
787
888
|
branch,
|
|
788
889
|
spec_directory: specDirectory,
|
|
789
890
|
spec_file: specFile,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository-overview.js","sourceRoot":"","sources":["../../../src/tools/repository-overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"repository-overview.js","sourceRoot":"","sources":["../../../src/tools/repository-overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAG5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4cG;AACH,MAAM,qBAAqB,GAAmB;IAC5C,IAAI,EAAE,yBAAyB;IAE/B,KAAK,EAAE,mCAAmC;IAE1C,WAAW,EACT,2FAA2F;QAC3F,6FAA6F;QAC7F,yFAAyF;QACzF,+FAA+F;QAC/F,8FAA8F;QAC9F,gEAAgE;QAChE,gGAAgG;QAChG,wFAAwF;QACxF,6FAA6F;QAC7F,4BAA4B;QAC5B,gFAAgF;QAChF,yFAAyF;QACzF,4FAA4F;QAC5F,qFAAqF;QACrF,yFAAyF;QACzF,yDAAyD;QACzD,4FAA4F;QAC5F,6FAA6F;QAC7F,kCAAkC;QAClC,6FAA6F;QAC7F,0FAA0F;QAC1F,wFAAwF;QACxF,yFAAyF;QACzF,4FAA4F;QAC5F,4DAA4D;QAC5D,+FAA+F;QAC/F,2FAA2F;QAC3F,gGAAgG;QAChG,wEAAwE;QACxE,6FAA6F;QAC7F,gGAAgG;QAChG,4EAA4E;QAC5E,+FAA+F;QAC/F,6FAA6F;QAC7F,0FAA0F;QAC1F,oFAAoF;QACpF,iGAAiG;QACjG,8FAA8F;QAC9F,2FAA2F;QAC3F,qEAAqE;QACrE,2FAA2F;QAC3F,kFAAkF;QAClF,iGAAiG;QACjG,gGAAgG;QAChG,yFAAyF;QACzF,gGAAgG;QAChG,8FAA8F;QAC9F,+FAA+F;QAC/F,uDAAuD;QACvD,yFAAyF;QACzF,8FAA8F;QAC9F,uFAAuF;QACvF,iEAAiE;QACjE,iGAAiG;QACjG,8FAA8F;QAC9F,eAAe;QACf,8FAA8F;QAC9F,8FAA8F;QAC9F,+FAA+F;QAC/F,4FAA4F;QAC5F,2FAA2F;QAC3F,0FAA0F;QAC1F,yFAAyF;QACzF,yBAAyB;QACzB,wFAAwF;QACxF,6FAA6F;QAC7F,sFAAsF;QACtF,8FAA8F;QAC9F,2FAA2F;QAC3F,4FAA4F;QAC5F,4FAA4F;QAC5F,0DAA0D;QAC1D,wFAAwF;QACxF,iFAAiF;QACjF,8FAA8F;QAC9F,yFAAyF;QACzF,6FAA6F;QAC7F,6FAA6F;QAC7F,qBAAqB;QACrB,mFAAmF;QACnF,+FAA+F;QAC/F,8FAA8F;QAC9F,4FAA4F;QAC5F,8FAA8F;QAC9F,8FAA8F;QAC9F,8FAA8F;QAC9F,yFAAyF;QACzF,+FAA+F;QAC/F,sDAAsD;QACtD,2FAA2F;QAC3F,oFAAoF;QACpF,4FAA4F;QAC5F,sEAAsE;QACtE,yFAAyF;QACzF,0FAA0F;QAC1F,yFAAyF;QACzF,oFAAoF;QACpF,yFAAyF;QACzF,sFAAsF;QACtF,uFAAuF;QACvF,iFAAiF;QACjF,4FAA4F;QAC5F,0FAA0F;QAC1F,0FAA0F;QAC1F,mBAAmB;QACnB,6FAA6F;QAC7F,qFAAqF;QACrF,oFAAoF;QACpF,wFAAwF;QACxF,4FAA4F;IAE9F,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sFAAsF;oBACtF,+EAA+E;oBAC/E,qFAAqF;oBACrF,wFAAwF;oBACxF,uFAAuF;oBACvF,sBAAsB;oBACtB,iFAAiF;oBACjF,qFAAqF;oBACrF,mFAAmF;oBACnF,gFAAgF;oBAChF,mFAAmF;oBACnF,kFAAkF;oBAClF,sFAAsF;oBACtF,iFAAiF;oBACjF,qFAAqF;oBACrF,qFAAqF;oBACrF,sDAAsD;oBACtD,8EAA8E;oBAC9E,+EAA+E;oBAC/E,qEAAqE;aACxE;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,mFAAmF;oBACnF,uFAAuF;oBACvF,sFAAsF;oBACtF,qFAAqF;oBACrF,iFAAiF;oBACjF,kFAAkF;oBAClF,oFAAoF;oBACpF,yFAAyF;oBACzF,2FAA2F;oBAC3F,0FAA0F;oBAC1F,yEAAyE;aAC5E;YACD,cAAc,EAAE;gBACd,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wFAAwF;oBACxF,yFAAyF;oBACzF,iEAAiE;oBACjE,sFAAsF;oBACtF,oFAAoF;oBACpF,sFAAsF;oBACtF,yFAAyF;oBACzF,0FAA0F;oBAC1F,2FAA2F;oBAC3F,qFAAqF;oBACrF,uFAAuF;oBACvF,qFAAqF;oBACrF,oBAAoB;oBACpB,0FAA0F;oBAC1F,0FAA0F;oBAC1F,wFAAwF;oBACxF,0FAA0F;oBAC1F,uFAAuF;oBACvF,qDAAqD;oBACrD,uFAAuF;oBACvF,0FAA0F;oBAC1F,sFAAsF;oBACtF,mDAAmD;aACtD;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wFAAwF;oBACxF,oFAAoF;oBACpF,wDAAwD;oBACxD,uFAAuF;oBACvF,4EAA4E;oBAC5E,6EAA6E;oBAC7E,uFAAuF;oBACvF,sEAAsE;oBACtE,0FAA0F;oBAC1F,0FAA0F;oBAC1F,wCAAwC;oBACxC,uFAAuF;oBACvF,kFAAkF;oBAClF,uCAAuC;aAC1C;YACD,oBAAoB,EAAE;gBACpB,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sFAAsF;oBACtF,wFAAwF;oBACxF,yDAAyD;oBACzD,mEAAmE;oBACnE,sFAAsF;oBACtF,oFAAoF;oBACpF,qFAAqF;oBACrF,uFAAuF;oBACvF,iFAAiF;oBACjF,oFAAoF;oBACpF,gFAAgF;oBAChF,yCAAyC;oBACzC,sFAAsF;oBACtF,kFAAkF;oBAClF,0CAA0C;aAC7C;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wFAAwF;oBACxF,mFAAmF;oBACnF,sEAAsE;oBACtE,qFAAqF;oBACrF,uFAAuF;oBACvF,oFAAoF;oBACpF,yEAAyE;oBACzE,wFAAwF;oBACxF,iFAAiF;oBACjF,+BAA+B;oBAC/B,qFAAqF;oBACrF,qFAAqF;oBACrF,sFAAsF;oBACtF,mFAAmF;oBACnF,4EAA4E;oBAC5E,sFAAsF;oBACtF,YAAY;oBACZ,wFAAwF;oBACxF,oFAAoF;oBACpF,qFAAqF;oBACrF,uFAAuF;oBACvF,qFAAqF;oBACrF,qFAAqF;oBACrF,sFAAsF;oBACtF,2DAA2D;oBAC3D,sFAAsF;oBACtF,oFAAoF;oBACpF,kFAAkF;oBAClF,+BAA+B;oBAC/B,oFAAoF;oBACpF,uFAAuF;oBACvF,oFAAoF;oBACpF,SAAS;aACZ;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,wFAAwF;oBACxF,0FAA0F;oBAC1F,wFAAwF;oBACxF,8DAA8D;oBAC9D,qDAAqD;oBACrD,yDAAyD;oBACzD,sFAAsF;oBACtF,0EAA0E;oBAC1E,uFAAuF;oBACvF,0CAA0C;oBAC1C,mEAAmE;oBACnE,qFAAqF;oBACrF,+EAA+E;oBAC/E,mFAAmF;oBACnF,0FAA0F;oBAC1F,wFAAwF;oBACxF,yFAAyF;oBACzF,+BAA+B;oBAC/B,wFAAwF;oBACxF,yFAAyF;oBACzF,0FAA0F;oBAC1F,yFAAyF;oBACzF,yEAAyE;oBACzE,yFAAyF;oBACzF,yFAAyF;oBACzF,uFAAuF;oBACvF,sFAAsF;oBACtF,yFAAyF;oBACzF,wFAAwF;oBACxF,qFAAqF;oBACrF,uFAAuF;oBACvF,yFAAyF;oBACzF,sFAAsF;oBACtF,sFAAsF;oBACtF,yEAAyE;oBACzE,8EAA8E;oBAC9E,sFAAsF;oBACtF,uFAAuF;oBACvF,uFAAuF;oBACvF,SAAS;aACZ;YACD,oBAAoB,EAAE;gBACpB,IAAI,EAAE,SAAS;gBACf,WAAW,EACT,iFAAiF;oBACjF,sFAAsF;oBACtF,0FAA0F;oBAC1F,iFAAiF;oBACjF,yFAAyF;oBACzF,yFAAyF;oBACzF,6FAA6F;oBAC7F,uFAAuF;oBACvF,+EAA+E;oBAC/E,yFAAyF;oBACzF,0FAA0F;oBAC1F,oDAAoD;oBACpD,kFAAkF;oBAClF,2FAA2F;oBAC3F,0FAA0F;oBAC1F,sFAAsF;oBACtF,iCAAiC;oBACjC,0FAA0F;oBAC1F,2FAA2F;oBAC3F,sFAAsF;oBACtF,0FAA0F;oBAC1F,0FAA0F;oBAC1F,wFAAwF;oBACxF,wFAAwF;oBACxF,kCAAkC;oBAClC,oFAAoF;oBACpF,uFAAuF;oBACvF,0FAA0F;oBAC1F,yFAAyF;oBACzF,gEAAgE;oBAChE,uFAAuF;oBACvF,2DAA2D;oBAC3D,uFAAuF;oBACvF,uFAAuF;oBACvF,uFAAuF;oBACvF,+EAA+E;oBAC/E,wFAAwF;oBACxF,+DAA+D;oBAC/D,kFAAkF;oBAClF,wFAAwF;oBACxF,qFAAqF;oBACrF,uCAAuC;oBACvC,yFAAyF;oBACzF,yFAAyF;oBACzF,yFAAyF;oBACzF,sFAAsF;oBACtF,6CAA6C;oBAC7C,uFAAuF;oBACvF,oFAAoF;oBACpF,2FAA2F;oBAC3F,mGAAmG;oBACnG,wFAAwF;oBACxF,wFAAwF;oBACxF,yFAAyF;oBACzF,qFAAqF;oBACrF,2FAA2F;oBAC3F,2FAA2F;oBAC3F,yGAAyG;oBACzG,qFAAqF;oBACrF,sFAAsF;oBACtF,uFAAuF;oBACvF,wEAAwE;oBACxE,+EAA+E;oBAC/E,cAAc;oBACd,wFAAwF;oBACxF,+DAA+D;oBAC/D,0DAA0D;oBAC1D,uFAAuF;oBACvF,qFAAqF;oBACrF,uFAAuF;oBACvF,uFAAuF;oBACvF,2DAA2D;oBAC3D,0FAA0F;oBAC1F,0FAA0F;oBAC1F,sFAAsF;oBACtF,oFAAoF;oBACpF,0FAA0F;oBAC1F,0FAA0F;oBAC1F,yBAAyB;oBACzB,qFAAqF;oBACrF,6DAA6D;oBAC7D,wFAAwF;oBACxF,qFAAqF;oBACrF,uFAAuF;oBACvF,wFAAwF;oBACxF,0FAA0F;oBAC1F,yFAAyF;oBACzF,mCAAmC;oBACnC,qFAAqF;oBACrF,uFAAuF;oBACvF,gFAAgF;aACnF;SACF;QACD,oBAAoB,EAAE,KAAK;KAC5B;IAED,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO;QACrB,4EAA4E;QAC5E,wEAAwE;QACxE,uDAAuD;QACvD,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;QACpE,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;QAChE,MAAM,mBAAmB,GAAG,cAAc,CACxC,IAAI,CAAC,sBAAsB,CAAC,EAC5B,sBAAsB,CACvB,CAAC;QACF,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAe,CAAC,CAAC;QAC5E,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC,CAAC;QACnE,2EAA2E;QAC3E,6EAA6E;QAC7E,6EAA6E;QAC7E,wEAAwE;QACxE,6DAA6D;QAC7D,MAAM,mBAAmB,GAAG,eAAe,CACzC,IAAI,CAAC,sBAAsB,CAAC,EAC5B,sBAAsB,CACvB,CAAC;QACF,0EAA0E;QAC1E,0EAA0E;QAC1E,0EAA0E;QAC1E,2EAA2E;QAC3E,uEAAuE;QACvE,mEAAmE;QACnE,0EAA0E;QAC1E,qEAAqE;QACrE,WAAW;QACX,MAAM,GAAG,GACP,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC;YAClC,CAAC,CAAC,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GACR,UAAU,KAAK,SAAS;YACtB,CAAC,CAAC,oBAAoB;YACtB,CAAC,CAAC,wBAAwB,kBAAkB,CAAC,UAAU,CAAC,EAAE,CAAC;QAE/D,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,GAAG,EACH,IAAI,EACJ;YACE,MAAM;YACN,cAAc,EAAE,aAAa;YAC7B,SAAS,EAAE,QAAQ;YACnB,oBAAoB,EAAE,mBAAmB;YACzC,aAAa,EAAE,YAAY;YAC3B,UAAU,EAAE,SAAS;YACrB,oBAAoB,EAAE,mBAAmB,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SACxE,EACD,OAAO,CAAC,KAAK,CACd,CAAC;QAEF,OAAO;YACL,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;YAC1B,UAAU,EAAE,QAAQ;SACrB,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,eAAe,qBAAqB,CAAC;AAErC;;;;;;;;;;;GAWG;AACH,SAAS,UAAU,CAAC,QAAiC;IACnD,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
|