@grove-dev/astro 0.2.6 → 0.2.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/dist/lib/display.d.ts +11 -17
- package/dist/lib/display.d.ts.map +1 -1
- package/dist/lib/display.js +43 -43
- package/dist/lib/display.js.map +1 -1
- package/dist/lib/format.d.ts +6 -7
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +11 -12
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/lenses.d.ts +35 -73
- package/dist/lib/lenses.d.ts.map +1 -1
- package/dist/lib/lenses.js +144 -126
- package/dist/lib/lenses.js.map +1 -1
- package/dist/lib/repo.d.ts +11 -22
- package/dist/lib/repo.d.ts.map +1 -1
- package/dist/lib/repo.js +12 -25
- package/dist/lib/repo.js.map +1 -1
- package/dist/lib/scores.d.ts +15 -16
- package/dist/lib/scores.d.ts.map +1 -1
- package/dist/lib/scores.js +4 -11
- package/dist/lib/scores.js.map +1 -1
- package/dist/lib/search.d.ts +47 -129
- package/dist/lib/search.d.ts.map +1 -1
- package/dist/lib/search.js +195 -180
- package/dist/lib/search.js.map +1 -1
- package/dist/lib/taxonomy-counts.d.ts +7 -21
- package/dist/lib/taxonomy-counts.d.ts.map +1 -1
- package/dist/lib/taxonomy-counts.js +12 -31
- package/dist/lib/taxonomy-counts.js.map +1 -1
- package/package.json +4 -4
- package/src/components/AppsIndexRow.astro +55 -184
- package/src/components/AppsPagination.astro +45 -108
- package/src/components/CategoryGrid.astro +43 -31
- package/src/components/ContributorsGrid.astro +3 -3
- package/src/components/CurationGrid.astro +41 -0
- package/src/components/ExploreByStack.astro +6 -0
- package/src/components/FilterGroupMenu.astro +49 -0
- package/src/components/FilterOptions.astro +44 -0
- package/src/components/Hero.astro +198 -147
- package/src/components/Icon.astro +10 -3
- package/src/components/ItemCard.astro +266 -248
- package/src/components/RecordSection.astro +68 -33
- package/src/components/RefinePanel.astro +115 -141
- package/src/components/StackGrid.astro +32 -24
- package/src/components/WhyThisExists.astro +32 -32
- package/src/layouts/BaseLayout.astro +104 -49
- package/src/layouts/Container.astro +5 -44
- package/src/layouts/Footer.astro +31 -20
- package/src/layouts/Header.astro +40 -19
- package/src/layouts/SectionHeader.astro +27 -43
- package/src/layouts/Seo.astro +38 -56
- package/src/layouts/ThemeToggle.astro +35 -48
- package/src/lib/display.ts +46 -53
- package/src/lib/format.ts +11 -12
- package/src/lib/lenses.ts +151 -172
- package/src/lib/repo.ts +16 -28
- package/src/lib/scores.ts +15 -19
- package/src/lib/search.ts +222 -290
- package/src/lib/taxonomy-counts.ts +12 -46
- package/src/styles.css +207 -1
- package/templates/default/.github/ISSUE_TEMPLATE/bug_report.md +33 -0
- package/templates/default/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/templates/default/.github/ISSUE_TEMPLATE/record_submission.md +48 -0
- package/templates/default/.github/pull_request_template.md +27 -0
- package/templates/default/.github/workflows/build.yml +55 -0
- package/templates/default/.github/workflows/cleanup-stale-records.yml +48 -0
- package/templates/default/.github/workflows/daily-refresh.yml +53 -0
- package/templates/default/.github/workflows/sync-contributors.yml +53 -0
- package/templates/default/.github/workflows/sync-github-metadata.yml +58 -0
- package/templates/default/.github/workflows/validate-data.yml +35 -0
- package/templates/default/data/records/coolify.yml +46 -0
- package/templates/default/data/records/gitea.yml +46 -0
- package/templates/default/data/records/hoppscotch.yml +47 -0
- package/templates/default/data/records/inventree.yml +47 -0
- package/templates/default/data/records/label-studio.yml +46 -0
- package/templates/default/data/records/logseq.yml +48 -0
- package/templates/default/data/records/private-gpt.yml +47 -0
- package/templates/default/data/records/wakapi.yml +44 -0
- package/templates/default/data/taxonomy/categories.yml +47 -0
- package/templates/default/data/taxonomy/distribution-channels.yml +43 -0
- package/templates/default/data/taxonomy/platforms.yml +27 -0
- package/templates/default/data/taxonomy/stacks.yml +41 -0
- package/templates/default/grove.config.ts +1 -1
- package/templates/default/package.json +5 -4
- package/templates/default/public/icons/stacks/bun.svg +1 -0
- package/templates/default/public/icons/stacks/clojure.svg +1 -0
- package/templates/default/public/icons/stacks/clojurescript.svg +1 -0
- package/templates/default/public/icons/stacks/deno.svg +1 -0
- package/templates/default/public/icons/stacks/django.svg +1 -0
- package/templates/default/public/icons/stacks/docker.svg +1 -0
- package/templates/default/public/icons/stacks/go.svg +1 -0
- package/templates/default/public/icons/stacks/llm.svg +1 -0
- package/templates/default/public/icons/stacks/node.js.svg +1 -0
- package/templates/default/public/icons/stacks/sveltekit.svg +1 -0
- package/templates/default/public/icons/stacks/vue.svg +1 -0
- package/templates/default/public/llms-full.txt +197 -5
- package/templates/default/public/llms.txt +107 -6
- package/templates/default/public/sitemap.xml +63 -0
- package/templates/default/scripts/build-llms.mjs +123 -0
- package/templates/default/scripts/build-records-json.mjs +27 -0
- package/templates/default/scripts/build-sitemap.mjs +20 -0
- package/templates/default/scripts/cleanup-stale-records.mjs +20 -0
- package/templates/default/scripts/enrich-github-metadata.mjs +99 -0
- package/templates/default/scripts/fetch-icons.mjs +137 -0
- package/templates/default/scripts/migrate-legacy-to-schema-v1.mjs +86 -0
- package/templates/default/scripts/parse-legacy-readme.mjs +59 -0
- package/templates/default/scripts/refresh-records-activity.mjs +24 -0
- package/templates/default/scripts/repair-license-format.mjs +72 -0
- package/templates/default/scripts/report-cleanup-candidates.mjs +21 -0
- package/templates/default/scripts/seed-from-github.mjs +62 -0
- package/templates/default/scripts/sync-contributors.mjs +145 -0
- package/templates/default/scripts/sync-github-metadata.mjs +28 -0
- package/templates/default/scripts/validate-records.mjs +27 -0
- package/templates/default/src/data/records.ts +134 -51
- package/templates/default/src/pages/404.astro +64 -0
- package/templates/default/src/pages/{projects/[slug].astro → [slug]/[itemSlug].astro} +236 -66
- package/templates/default/src/pages/[slug]/index.astro +476 -0
- package/templates/default/src/pages/about.astro +165 -82
- package/templates/default/src/pages/apps/[itemSlug].astro +301 -0
- package/templates/default/src/pages/apps/index.astro +146 -0
- package/templates/default/src/pages/contributors.astro +184 -0
- package/templates/default/src/pages/index.astro +119 -162
- package/templates/default/src/pages/submit.astro +276 -114
- package/templates/default/wrangler.jsonc +28 -0
- package/LICENSE +0 -21
- package/templates/default/data/generated/apps.json +0 -1
- package/templates/default/data/generated/records.full.json +0 -8
- package/templates/default/data/generated/records.index.json +0 -7
- package/templates/default/data/generated/records.json +0 -8
- package/templates/default/data/generated/repo-stats.json +0 -1
- package/templates/default/data/generated/site-config.json +0 -31
- package/templates/default/src/components/layout/BaseLayout.astro +0 -47
- package/templates/default/src/components/layout/Container.astro +0 -18
- package/templates/default/src/components/layout/Footer.astro +0 -27
- package/templates/default/src/components/layout/Header.astro +0 -43
- package/templates/default/src/lib/markdown.ts +0 -171
- package/templates/default/src/pages/projects/index.astro +0 -193
package/dist/lib/search.d.ts
CHANGED
|
@@ -1,88 +1,22 @@
|
|
|
1
|
+
import type { IndexRecord } from "@grove-dev/core";
|
|
1
2
|
/**
|
|
2
|
-
* URL-driven
|
|
3
|
+
* URL-driven filter state for the /items discovery page.
|
|
3
4
|
*
|
|
4
|
-
* Multi-value fields use repeated keys: `?stack=Flutter&stack=
|
|
5
|
-
*
|
|
6
|
-
* / undefined fields mean "no filter on this dimension".
|
|
7
|
-
*
|
|
8
|
-
* The functions here are generic over a record-like shape that
|
|
9
|
-
* carries the index payload (see `toIndexRecord` in
|
|
10
|
-
* `@grove-dev/core`). The list page only needs `name`, `slug`,
|
|
11
|
-
* `description`, `category`, `tags`, `stack`, `stacks`, `platforms`,
|
|
12
|
-
* `repoUrl`, `logoUrl`, `health`, `curation`, and `github.{stars,
|
|
13
|
-
* pushedAt}` — all of which are present in the index projection.
|
|
14
|
-
*/
|
|
15
|
-
import type { HealthStatus, ProjectRecord } from "@grove-dev/core";
|
|
16
|
-
import { type LensId } from "./lenses.js";
|
|
17
|
-
/**
|
|
18
|
-
* Subset of `ProjectRecord` the search lib actually reads. Defined
|
|
19
|
-
* inline so the lib works on both full records and the lighter
|
|
20
|
-
* index payload. Use `ProjectRecord` from core when you have it;
|
|
21
|
-
* pass any object that satisfies `Searchable` otherwise.
|
|
22
|
-
*
|
|
23
|
-
* `Searchable` is a superset of `AppLike` (the lens-matching shape
|
|
24
|
-
* in `lib/lenses.ts`) — both interfaces share the same optional
|
|
25
|
-
* field shape, so `Searchable` records can be passed to
|
|
26
|
-
* `applyLens()` and `filterApps()` interchangeably.
|
|
5
|
+
* Multi-value fields use repeated keys in the URL: `?stack=Flutter&stack=React+Native`.
|
|
6
|
+
* Empty / undefined fields mean "no filter on this dimension".
|
|
27
7
|
*/
|
|
28
|
-
export
|
|
29
|
-
slug?: string;
|
|
30
|
-
name: string;
|
|
31
|
-
description?: string;
|
|
32
|
-
category?: string;
|
|
33
|
-
tags?: string[];
|
|
34
|
-
stack?: string;
|
|
35
|
-
stacks?: string[];
|
|
36
|
-
platforms?: string[];
|
|
37
|
-
/** Canonical repo URL — used for owner extraction in text search. */
|
|
38
|
-
repoUrl?: string;
|
|
39
|
-
logoUrl?: string;
|
|
40
|
-
/** Curated labels (new, hot, mature, featured). */
|
|
41
|
-
curation?: {
|
|
42
|
-
labels?: string[];
|
|
43
|
-
};
|
|
44
|
-
/** Health block — drives status filter + tier fallback. */
|
|
45
|
-
health?: {
|
|
46
|
-
status?: HealthStatus;
|
|
47
|
-
tier?: "curated" | "listed" | "experimental" | "hidden";
|
|
48
|
-
visibility?: "highlight" | "keep" | "needs_review" | "hide" | "remove" | "historical";
|
|
49
|
-
cleanupCandidate?: boolean;
|
|
50
|
-
};
|
|
51
|
-
/** GitHub metadata used for sort + text search. */
|
|
52
|
-
github?: {
|
|
53
|
-
stars?: number;
|
|
54
|
-
forks?: number;
|
|
55
|
-
pushedAt?: string | null;
|
|
56
|
-
license?: string | null;
|
|
57
|
-
};
|
|
58
|
-
/** Score block — used for "best-overall" sort. */
|
|
59
|
-
scores?: {
|
|
60
|
-
activity?: number;
|
|
61
|
-
maturity?: number;
|
|
62
|
-
learning?: number;
|
|
63
|
-
contribution?: number;
|
|
64
|
-
docs?: number;
|
|
65
|
-
overall?: number;
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
export type AppsFilters = {
|
|
8
|
+
export type ItemsFilters = {
|
|
69
9
|
q?: string;
|
|
70
|
-
/** Stack slugs, repeated URL key `stack=`. Matches against `stack` AND `stacks[]`. */
|
|
71
10
|
stacks?: string[];
|
|
72
|
-
/** Platform slugs, repeated URL key `platform=`. Matches `platforms[]`. */
|
|
73
11
|
platforms?: string[];
|
|
74
|
-
/** Category names, repeated URL key `category=`. */
|
|
75
12
|
categories?: string[];
|
|
76
|
-
/** Curated label ids (new/hot/mature/featured), repeated URL key `label=`. */
|
|
77
13
|
labels?: string[];
|
|
78
|
-
/** SPDX license ids, repeated URL key `license=`. */
|
|
79
14
|
licenses?: string[];
|
|
80
|
-
/** Health status values, comma-separated repeated URL key `status=`. */
|
|
81
15
|
statuses?: string[];
|
|
82
|
-
/** A curated lens (
|
|
83
|
-
lens?:
|
|
16
|
+
/** A curated lens (e.g. "good-to-learn", "production-like"). Single value. */
|
|
17
|
+
lens?: string;
|
|
84
18
|
/** Sort order. Single value, defaults to "recently-updated". */
|
|
85
|
-
sort?:
|
|
19
|
+
sort?: ItemsSort;
|
|
86
20
|
/** 1-based page number. */
|
|
87
21
|
page?: number;
|
|
88
22
|
};
|
|
@@ -103,72 +37,59 @@ export declare const SORT_OPTIONS: readonly [{
|
|
|
103
37
|
readonly value: "alphabetical";
|
|
104
38
|
readonly label: "Alphabetical";
|
|
105
39
|
}];
|
|
106
|
-
export type
|
|
107
|
-
/**
|
|
108
|
-
* How many records per page. Constant for now; future versions may
|
|
109
|
-
* vary per blueprint.
|
|
110
|
-
*/
|
|
111
|
-
export declare const PAGE_SIZE = 24;
|
|
112
|
-
/**
|
|
113
|
-
* Read filters from a URLSearchParams (or anything URLSearchParams-
|
|
114
|
-
* shaped, e.g. the result of `new URL(req.url).searchParams`).
|
|
115
|
-
*/
|
|
116
|
-
export declare function filtersFromSearchParams(sp: URLSearchParams): AppsFilters;
|
|
117
|
-
/**
|
|
118
|
-
* Serialize a filters object back to URLSearchParams. Undefined /
|
|
119
|
-
* empty values are dropped. Defaults (sort, page 1) are also dropped
|
|
120
|
-
* to keep URLs short and canonical.
|
|
121
|
-
*/
|
|
122
|
-
export declare function searchParamsFromFilters(f: AppsFilters): URLSearchParams;
|
|
40
|
+
export type ItemsSort = (typeof SORT_OPTIONS)[number]["value"];
|
|
123
41
|
/**
|
|
124
|
-
*
|
|
125
|
-
*
|
|
42
|
+
* Read filters from a URLSearchParams (or anything URLSearchParams-shaped,
|
|
43
|
+
* e.g. the result of `new URL(req.url).searchParams`).
|
|
126
44
|
*/
|
|
127
|
-
export declare function
|
|
45
|
+
export declare function filtersFromSearchParams(sp: URLSearchParams): ItemsFilters;
|
|
128
46
|
/**
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* `q` is a case-insensitive substring search across name, owner,
|
|
133
|
-
* description, category, stack/stacks/platforms, tags, and license.
|
|
134
|
-
* Other dimensions are exact match.
|
|
135
|
-
*/
|
|
136
|
-
export declare function filterApps<T extends Searchable>(records: T[], f: AppsFilters): T[];
|
|
137
|
-
/**
|
|
138
|
-
* Apply lens → filter → sort pipeline. Lens is applied first because
|
|
139
|
-
* it's a single-select "view" that may be broader or narrower than
|
|
140
|
-
* the regular filter dimensions.
|
|
141
|
-
*/
|
|
142
|
-
export declare function pipeline<T extends Searchable>(records: T[], filters: AppsFilters): T[];
|
|
143
|
-
/**
|
|
144
|
-
* Sort records in-place-free: returns a new array. Stable for ties.
|
|
145
|
-
* Records missing the sort key (e.g. no stars) sink to the bottom
|
|
146
|
-
* rather than vanishing.
|
|
47
|
+
* Serialize a filters object back to URLSearchParams.
|
|
48
|
+
* Undefined / empty values are dropped. Defaults (sort, page 1, comfortable
|
|
49
|
+
* density) are also dropped to keep URLs short and canonical.
|
|
147
50
|
*/
|
|
148
|
-
export declare function
|
|
51
|
+
export declare function searchParamsFromFilters(f: ItemsFilters): URLSearchParams;
|
|
52
|
+
/** True if any filter is active (i.e. the result list isn't "all items"). */
|
|
53
|
+
export declare function hasAnyFilter(f: ItemsFilters): boolean;
|
|
54
|
+
/** How many items per page. Constant for now; future versions may vary. */
|
|
55
|
+
export declare const PAGE_SIZE = 20;
|
|
56
|
+
export declare function applySort(items: IndexRecord[], sort: ItemsSort): IndexRecord[];
|
|
149
57
|
/** Slice an array for a given page (1-based). */
|
|
150
58
|
export declare function paginate<T>(items: T[], page: number, pageSize?: number): T[];
|
|
151
59
|
/** Total number of pages given an item count. Always >= 1. */
|
|
152
60
|
export declare function totalPages(itemCount: number, pageSize?: number): number;
|
|
153
61
|
/** Resolve the effective sort from a filters object, applying default. */
|
|
154
|
-
export declare function effectiveSort(f:
|
|
62
|
+
export declare function effectiveSort(f: ItemsFilters): ItemsSort;
|
|
155
63
|
/** Resolve the effective page from a filters object, applying default. */
|
|
156
|
-
export declare function effectivePage(f:
|
|
64
|
+
export declare function effectivePage(f: ItemsFilters): number;
|
|
157
65
|
/**
|
|
158
|
-
* Return
|
|
159
|
-
*
|
|
66
|
+
* Return the subset of items that match all active filters (AND across
|
|
67
|
+
* dimensions, OR within a dimension).
|
|
68
|
+
*
|
|
69
|
+
* `q` is a case-insensitive substring search across name, owner,
|
|
70
|
+
* description, and category. Other dimensions are exact match.
|
|
160
71
|
*/
|
|
161
|
-
export declare function
|
|
162
|
-
|
|
72
|
+
export declare function filterItems(items: IndexRecord[], f: ItemsFilters): IndexRecord[];
|
|
73
|
+
/** Build a flat list of "active filter" chips for display + removal. */
|
|
74
|
+
export declare function activeFilterChips(f: ItemsFilters): {
|
|
75
|
+
key: keyof ItemsFilters;
|
|
163
76
|
value: string;
|
|
164
77
|
label: string;
|
|
165
78
|
}[];
|
|
166
79
|
/**
|
|
167
|
-
*
|
|
168
|
-
*
|
|
169
|
-
*
|
|
80
|
+
* Return a new filters object with one (key, value) removed.
|
|
81
|
+
* - key="q" → clears the search string
|
|
82
|
+
* - multi-value keys → removes the single matching value
|
|
83
|
+
* Used by the "x" button on each active filter chip.
|
|
84
|
+
* Also resets page to 1 so the user doesn't get stranded on a high page
|
|
85
|
+
* that no longer has results.
|
|
86
|
+
*/
|
|
87
|
+
export declare function removeFilter(f: ItemsFilters, key: keyof ItemsFilters, value: string): ItemsFilters;
|
|
88
|
+
/**
|
|
89
|
+
* Build the full list of facet values from the items array, preserving
|
|
90
|
+
* a sensible order (frequency desc, then alphabetical for ties).
|
|
170
91
|
*/
|
|
171
|
-
export declare function buildFacets
|
|
92
|
+
export declare function buildFacets(items: IndexRecord[]): {
|
|
172
93
|
stacks: {
|
|
173
94
|
value: string;
|
|
174
95
|
count: number;
|
|
@@ -190,10 +111,7 @@ export declare function buildFacets<T extends Searchable>(records: T[]): {
|
|
|
190
111
|
count: number;
|
|
191
112
|
}[];
|
|
192
113
|
};
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
* without a second import.
|
|
197
|
-
*/
|
|
198
|
-
export type { ProjectRecord };
|
|
114
|
+
export declare const filterApps: typeof filterItems;
|
|
115
|
+
export type AppsFilters = ItemsFilters;
|
|
116
|
+
export type AppsSort = ItemsSort;
|
|
199
117
|
//# sourceMappingURL=search.d.ts.map
|
package/dist/lib/search.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/lib/search.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/lib/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD;;;;;GAKG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gEAAgE;IAChE,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,2BAA2B;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;EAMf,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AAmB/D;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,eAAe,GAAG,YAAY,CAsBzE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,YAAY,GAAG,eAAe,CAaxE;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAWrD;AAED,2EAA2E;AAC3E,eAAO,MAAM,SAAS,KAAoB,CAAC;AAyB3C,wBAAgB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG,WAAW,EAAE,CA8B9E;AAED,iDAAiD;AACjD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,CAAC,EAAE,CAG/E;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,SAAY,GAAG,MAAM,CAE1E;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,GAAG,SAAS,CAExD;AAED,0EAA0E;AAC1E,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAErD;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,YAAY,GAAG,WAAW,EAAE,CA8FhF;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,YAAY,GACd;IAAE,GAAG,EAAE,MAAM,YAAY,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAqC7D;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,CAAC,EAAE,YAAY,EACf,GAAG,EAAE,MAAM,YAAY,EACvB,KAAK,EAAE,MAAM,GACZ,YAAY,CAYd;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;EAgC/C;AASD,eAAO,MAAM,UAAU,oBAAc,CAAC;AACtC,MAAM,MAAM,WAAW,GAAG,YAAY,CAAC;AACvC,MAAM,MAAM,QAAQ,GAAG,SAAS,CAAC"}
|