diff --git a/doc/openapi.yaml b/doc/openapi.yaml index 4990567..57d3047 100644 --- a/doc/openapi.yaml +++ b/doc/openapi.yaml @@ -1250,6 +1250,45 @@ paths: "503": $ref: "#/components/responses/WorkspacesDisabled" + /api/v1/git-repos: + post: + operationId: addStandaloneGitRepo + tags: [workspaces] + summary: Clone + index a GitHub repository outside any specific workspace + description: | + Convenience endpoint for the dashboard's `/projects` → Add repo + button. Internally resolves the singleton "default" workspace + (see `workspaces.is_default`) and proxies to the same code path + as POST `/api/v1/workspaces/{id}/repos`. The resulting project + appears in `/api/v1/projects` and can later be linked into any + regular workspace via `/api/v1/workspaces/{id}/repos/link`. + + Request and response shapes are identical to the per-workspace + Add repo endpoint, with one exception: the response's `repo` + field carries the default workspace's id in `workspace_id` so + the dashboard can show the resulting project in context. + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/AddWorkspaceRepoRequest" + responses: + "201": + description: Repo attached to default workspace + clone enqueued + content: + application/json: + schema: + $ref: "#/components/schemas/WorkspaceRepoCreated" + "401": + $ref: "#/components/responses/Unauthorized" + "409": + $ref: "#/components/responses/Conflict" + "422": + $ref: "#/components/responses/Unprocessable" + "503": + $ref: "#/components/responses/WorkspacesDisabled" + /api/v1/workspaces/{id}/repos: parameters: - name: id @@ -3097,7 +3136,7 @@ components: Workspace: type: object - required: [id, name, description, created_at, updated_at] + required: [id, name, description, is_default, created_at, updated_at] properties: id: type: string @@ -3108,6 +3147,13 @@ components: description: type: string description: Free-form description. Empty string when absent. + is_default: + type: boolean + description: | + True for the singleton workspace that receives repositories + added via the standalone `/api/v1/git-repos` endpoint (the + dashboard's `/projects` → Add repo flow). Exactly one + workspace is flagged; deleting it returns 409. created_at: type: string format: date-time diff --git a/server/cmd/cix-server/main.go b/server/cmd/cix-server/main.go index 7fe85fd..e935291 100644 --- a/server/cmd/cix-server/main.go +++ b/server/cmd/cix-server/main.go @@ -249,6 +249,15 @@ func run() error { logger.Info("workspaces: encryption key loaded", "source", secSvc.Source()) } wsSvc = workspaces.New(database) + // Make sure the singleton default workspace exists so the + // /git-repos endpoint and the dashboard's /projects "Add repo" + // button always have a target. Idempotent — boots after the + // first one are no-ops. + if def, err := wsSvc.EnsureDefault(context.Background()); err != nil { + return fmt.Errorf("ensure default workspace: %w", err) + } else { + logger.Info("workspaces: default workspace ready", "id", def.ID, "name", def.Name) + } wrSvc = workspacerepos.New(database) // Persistent job queue + worker pool. Worker concurrency comes diff --git a/server/dashboard/src/modules/projects/ProjectsListPage.tsx b/server/dashboard/src/modules/projects/ProjectsListPage.tsx index 97bfc5d..d2b93ef 100644 --- a/server/dashboard/src/modules/projects/ProjectsListPage.tsx +++ b/server/dashboard/src/modules/projects/ProjectsListPage.tsx @@ -2,19 +2,27 @@ import { AlertCircle, FolderPlus } from 'lucide-react'; import { Alert, AlertDescription, AlertTitle } from '@/ui/alert'; import { Skeleton } from '@/ui/skeleton'; import { ApiError } from '@/api/client'; +import { AddRepoDialog } from '@/modules/workspaces/components/AddRepoDialog'; import { ProjectCard } from './components/ProjectCard'; import { useProjects } from './hooks'; export function ProjectsListPage() { - const { data, error, isLoading } = useProjects(); + const { data, error, isLoading, refetch } = useProjects(); return (
-
-

Projects

-

- {data ? `${data.total} indexed ${data.total === 1 ? 'project' : 'projects'}` : ' '} -

+
+
+

Projects

+

+ {data ? `${data.total} indexed ${data.total === 1 ? 'project' : 'projects'}` : ' '} +

+
+ {/* Add repo here clones + indexes a GitHub repository into the + default workspace so the resulting project shows up in this + list. Standalone projects can later be linked into specific + workspaces from the Workspaces page. */} + void refetch()} />
{isLoading ? ( @@ -51,9 +59,9 @@ function EmptyState() {

No projects yet

- Register a project from the CLI with{' '} + Use Add repo above to clone + index a GitHub + repository, or register a local project from the CLI with{' '} cix init <path>. - A GitHub source will land here in a future PR.

diff --git a/server/dashboard/src/modules/workspaces/components/AddRepoDialog.tsx b/server/dashboard/src/modules/workspaces/components/AddRepoDialog.tsx index 88a3ce1..ecf82ec 100644 --- a/server/dashboard/src/modules/workspaces/components/AddRepoDialog.tsx +++ b/server/dashboard/src/modules/workspaces/components/AddRepoDialog.tsx @@ -42,11 +42,17 @@ const NO_TOKEN = '__none__'; // can't pick a repository before choosing a token, and can't submit // before pinning down a branch + webhook mode. The shape mirrors how // people actually fill it in: PAT → repo → branch → webhook policy. +// +// Two scopes: +// - workspaceID provided → POST /workspaces/{id}/repos (standard flow). +// - workspaceID omitted → POST /git-repos (server resolves +// the singleton default workspace; surfaced from /projects so users +// can add a repo without picking a workspace first). export function AddRepoDialog({ workspaceID, onAdded, }: { - workspaceID: string; + workspaceID?: string; onAdded: () => void; }) { const [open, setOpen] = useState(false); @@ -193,10 +199,10 @@ export function AddRepoDialog({ if (tokenID && tokenID !== NO_TOKEN) { payload.token_id = tokenID; } - const resp = await api.post( - `/workspaces/${workspaceID}/repos`, - payload, - ); + const endpoint = workspaceID + ? `/workspaces/${workspaceID}/repos` + : `/git-repos`; + const resp = await api.post(endpoint, payload); setCreated(resp); onAdded(); } catch (e) { diff --git a/server/internal/db/db.go b/server/internal/db/db.go index c696718..01fe9a4 100644 --- a/server/internal/db/db.go +++ b/server/internal/db/db.go @@ -87,6 +87,14 @@ func Open(path string) (*sql.DB, error) { return nil, fmt.Errorf("migrate webhook_mode: %w", err) } + // Standalone /git-repos feature — add workspaces.is_default + the + // partial UNIQUE index. The default workspace row itself is created + // at server startup via workspaces.Service.EnsureDefault, not here. + if err := migrateWorkspacesDefault(db); err != nil { + _ = db.Close() + return nil, fmt.Errorf("migrate workspaces is_default: %w", err) + } + // PR13 — workspace_repos.is_linked + drop the legacy global UNIQUE // on project_path. The rebuild path is taken only when the old // constraint is still present; freshly-created DBs hit the new @@ -389,6 +397,58 @@ func migrateIndexedWithModel(db *sql.DB) error { return nil } +// migrateWorkspacesDefault adds workspaces.is_default to pre-feature +// databases plus the partial UNIQUE index that enforces "at most one +// default workspace". Idempotent: re-runs are no-ops. The actual +// bootstrap (inserting the singleton row) happens at server startup +// via workspaces.Service.EnsureDefault — keeping it out of the DB +// migration so tests can opt in/out by skipping the call. +func migrateWorkspacesDefault(db *sql.DB) error { + rows, err := db.Query(`PRAGMA table_info(workspaces)`) + if err != nil { + return fmt.Errorf("table_info workspaces: %w", err) + } + have := false + tableExists := false + for rows.Next() { + var ( + cid int + name, typ string + notnull, pk int + dflt sql.NullString + ) + if err := rows.Scan(&cid, &name, &typ, ¬null, &dflt, &pk); err != nil { + rows.Close() + return err + } + tableExists = true + if name == "is_default" { + have = true + } + } + rows.Close() + if !tableExists { + return nil + } + if !have { + if _, err := db.Exec( + `ALTER TABLE workspaces ADD COLUMN is_default INTEGER NOT NULL DEFAULT 0`, + ); err != nil { + return fmt.Errorf("add is_default column: %w", err) + } + } + // The partial UNIQUE index is in Schema's CREATE INDEX IF NOT + // EXISTS so fresh DBs already have it; create it here for older + // installs that just got the column added. + if _, err := db.Exec( + `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspaces_default + ON workspaces(is_default) WHERE is_default = 1`, + ); err != nil { + return fmt.Errorf("create idx_workspaces_default: %w", err) + } + return nil +} + // migrateWebhookMode adds workspace_repos.webhook_mode to pre-PR10 // databases and backfills it from the older auto_webhook bool so rows // inserted before this migration keep their effective behaviour. Same diff --git a/server/internal/db/schema.go b/server/internal/db/schema.go index d55f788..45cad93 100644 --- a/server/internal/db/schema.go +++ b/server/internal/db/schema.go @@ -159,6 +159,16 @@ CREATE TABLE IF NOT EXISTS workspaces ( id TEXT PRIMARY KEY, name TEXT NOT NULL UNIQUE, description TEXT, + -- is_default flags the singleton "Personal" workspace that holds + -- repos added from /projects (the standalone Add repo flow). At + -- most one row carries is_default=1 — enforced by the partial + -- UNIQUE index created in migrateWorkspacesDefault + the + -- EnsureDefault bootstrap. The index is intentionally NOT here: + -- a pre-feature DB whose workspaces table lacks is_default would + -- fail the multi-statement Schema.Exec before the migration has + -- a chance to ALTER TABLE ADD COLUMN (same pattern as + -- idx_projects_path_hash). + is_default INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); diff --git a/server/internal/httpapi/openapi/openapi.gen.go b/server/internal/httpapi/openapi/openapi.gen.go index 94436b0..ab8f337 100644 --- a/server/internal/httpapi/openapi/openapi.gen.go +++ b/server/internal/httpapi/openapi/openapi.gen.go @@ -1308,8 +1308,10 @@ type SemanticSearchRequest struct { // Limit Maximum number of FILE groups (not chunks) to return. Limit *int `json:"limit,omitempty"` - // MinScore Minimum cosine similarity. Omit for server default (0.4 for - // CodeRankEmbed-Q8). Send `0` explicitly to disable the floor. + // MinScore Minimum cosine similarity. Omit for server default (0.2 — + // light floor that keeps abstract NL queries non-empty). Send + // `0` to disable; pass `0.4+` for strict code-symbol searches + // calibrated for CodeRankEmbed-Q8. MinScore *float32 `json:"min_score,omitempty"` // Paths Whitelist — keep only results whose path matches any prefix or substring. @@ -1561,6 +1563,12 @@ type Workspace struct { // Id ULID-like opaque identifier. Id string `json:"id"` + // IsDefault True for the singleton workspace that receives repositories + // added via the standalone `/api/v1/git-repos` endpoint (the + // dashboard's `/projects` → Add repo flow). Exactly one + // workspace is flagged; deleting it returns 409. + IsDefault bool `json:"is_default"` + // Name Unique workspace name. Name string `json:"name"` UpdatedAt time.Time `json:"updated_at"` @@ -1863,11 +1871,13 @@ type WorkspaceSearchParams struct { TopChunks *int `form:"top_chunks,omitempty" json:"top_chunks,omitempty"` // MinScore Floor on raw cosine similarity. Chunks below this are - // dropped before aggregation. Default 0 — relies on - // chromem's natural ordering. Set higher (e.g. 0.3) to cut - // noise when querying long natural-language sentences; - // keep at 0 for short tokens / acronyms where embedding - // magnitudes are inherently smaller. + // dropped before aggregation. Default 0.4 — symmetric with + // per-project search default so an unfiltered workspace + // query doesn't return cross-repo noise that a single-repo + // query would have rejected. Pass 0 explicitly for + // intentional cross-project sweeps that need long-tail + // recall (e.g. "authentication and authorization" across a + // mixed-domain workspace). MinScore *float32 `form:"min_score,omitempty" json:"min_score,omitempty"` } @@ -1889,6 +1899,9 @@ type ChangePasswordJSONRequestBody = ChangePasswordRequest // LoginJSONRequestBody defines body for Login for application/json ContentType. type LoginJSONRequestBody = LoginRequest +// AddStandaloneGitRepoJSONRequestBody defines body for AddStandaloneGitRepo for application/json ContentType. +type AddStandaloneGitRepoJSONRequestBody = AddWorkspaceRepoRequest + // CreateGithubTokenJSONRequestBody defines body for CreateGithubToken for application/json ContentType. type CreateGithubTokenJSONRequestBody = CreateGithubTokenRequest @@ -1996,6 +2009,9 @@ type ServerInterface interface { // End one of my sessions (sign out a single device) // (DELETE /api/v1/auth/sessions/{id}) DeleteMySession(w http.ResponseWriter, r *http.Request, id string) + // Clone + index a GitHub repository outside any specific workspace + // (POST /api/v1/git-repos) + AddStandaloneGitRepo(w http.ResponseWriter, r *http.Request) // List stored GitHub PATs (metadata only) // (GET /api/v1/github-tokens) ListGithubTokens(w http.ResponseWriter, r *http.Request) @@ -2230,6 +2246,12 @@ func (_ Unimplemented) DeleteMySession(w http.ResponseWriter, r *http.Request, i w.WriteHeader(http.StatusNotImplemented) } +// Clone + index a GitHub repository outside any specific workspace +// (POST /api/v1/git-repos) +func (_ Unimplemented) AddStandaloneGitRepo(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotImplemented) +} + // List stored GitHub PATs (metadata only) // (GET /api/v1/github-tokens) func (_ Unimplemented) ListGithubTokens(w http.ResponseWriter, r *http.Request) { @@ -2902,6 +2924,26 @@ func (siw *ServerInterfaceWrapper) DeleteMySession(w http.ResponseWriter, r *htt handler.ServeHTTP(w, r) } +// AddStandaloneGitRepo operation middleware +func (siw *ServerInterfaceWrapper) AddStandaloneGitRepo(w http.ResponseWriter, r *http.Request) { + + ctx := r.Context() + + ctx = context.WithValue(ctx, BearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.AddStandaloneGitRepo(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // ListGithubTokens operation middleware func (siw *ServerInterfaceWrapper) ListGithubTokens(w http.ResponseWriter, r *http.Request) { @@ -4404,6 +4446,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Delete(options.BaseURL+"/api/v1/auth/sessions/{id}", wrapper.DeleteMySession) }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/api/v1/git-repos", wrapper.AddStandaloneGitRepo) + }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/v1/github-tokens", wrapper.ListGithubTokens) }) @@ -4527,352 +4572,361 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "7L3tbhtJljZ4KwecF7DkIinZVa7pkWHglWW7rC5/aCR7qnc7a5nBzCAZrWREVkSkKHbBwP4aYP8OFniv", - "YC+gr+H93xfRV7KIcyLyg8wkKUuyqxrzp7ssZmZ8nTjf5zm/9hI1z5Xk0pre0a+9nGk255Zr/NeZVn/h", - "iX3NzMz9M+Um0SK3QsneUe+V0MbCo+9hxq8hmTFtQE0gvnh9/Ghvpowd5czO9uMhXHAeyVhIy7Vk2UFO", - "HzVD99kzZmfxMJK9fk+4j7p3ev2eZHNe/UvzXwqhedo7srrg/Z5JZnzO3Iz4NZvnmXv0yfhf08fJv/FH", - "7NvJHw6/e9zru7fdkL2j3v/1ZzaYHA7+7edfH33/6X/0+j27zN1Lxmohp71Pnz65QUyupOG48BMlJ5lI", - "rPvvREnLJf4ny/NMJMxtwMFfjNuFX2uT+R+aT3pHvX85qLb0gH41By+1VpoGau7iOTeq0AkHlmnO0iXw", - "a2GsgT0+nA6Bz5nIwLJLLvd7n/q9V0qPRZpyef8TOy7sjEvrvsrTPowLCxlLLg3YGYdwIqBVxt3ETmXK", - "r7n+KNkVExkbuzO57xnimEJOwXB9JRIOUllIlJyIaeGoBadFREffuPcZfZQzJtOMpzglroHTk/3eO2Vf", - "qUKmX5Cg3G5McMxP/d5HyQo7U1r8lX+BObwVxriDURqEvGKZSOH47BQu+ZLmkmuVcGO+DJm8ZdlE6bkj", - "Vv5LwY2FsUqXbm5zP82SmieCZ6lxc/xJ6UuTs4SbFwLn+QV2rRoTJpzZQnMQBlI/PigJdiaMJy3HVm0k", - "45PTP41+en/+48XZ8cnLi9HLd8fP37x88cwxyhiYdIs2lmkLVgGX7kuO27rB/XzcdI/TtBz8nOfqnDYK", - "BYJWOddWEF9khVWjBR/PlLokiTBhRWZ7RxOWGe4WlGuOHCPw6uYS3/ApS5a0z0N4xxeQZMLtDpiZKjJ3", - "b2QKsR9hNFcpj0FIYzlLh5H8acYljJWdAdMccq2uROqY08oLCyHNU1i4h5XMlo5jRXKsVAa4fbYPMe2P", - "MDBnec5TtzuNj8AziHC1Uc+LJy8y3Gc4k45GxprJBAXjXMg3XE7trHf0aE249HtTYWfFeFTobF2KzqzN", - "zdHBAT0zTNT8QC0k1wea5wo+nr8Z9lq+aNUllyORrn/vPf4Hy0CkThwzMFY50v5B2NfFGM6OPwzhvKR3", - "pSHX4opZx9JzZRpLrYar70zj2HtzJguW9VbP+bVaoJzwbNAf7iXnOdEwLm6iuZkdRXIAsdvpGP7xf/+/", - "4Q3Np8I4NQQ/48cHIcM6lISlKnQkAcZ8xrIJ7PlbbIClcyGP3BAjfAsvDndL3x/iaDTpxni4SwZYGGpk", - "eKK59TfIFloaENYNp2TCn7rBIWfGcvz0x/M38A34V4S0KkzTzdHwbELjhqtMI0sFbtkDs5QJMAssy56C", - "5sJJNbgSjMgWIGVmNlZMp04GW0U0TQfFZTHvHf25OgX3QXcYgWf9vK7q1NWpP9dJsyTo6iU1dpqao4Dj", - "XPzIl+sMIdHc3fYRQ2bh+Kz7r17KLB9YMedt1ERku/bnjBk7Kszmj8ki89oFsZcNXxG5+8oNXijYTi+Q", - "btqyALy37lN61LHEXPOJuF6/tC+EyTO2HCC3oofc5XWkNSmyzAlOrxDGibgesUfjx8m36Xexo+c3Sk6B", - "S1VMZ46LaZ6oqRSGu8uSOVWy766ftuUzM2aRlBMmnYrgXpDG6iKxOKDSYiokyzpYgeZX6pLXl1fjiP7H", - "WxzgCnmKtLe6r/4Ays3s12mwml83EZ/Q4y3CLRejSyLyTfLbX4VP/Z47m/BG80A/zDjkGXM2z7XF47ti", - "WcGH8PDhOXITngK/ZonNlshQhg8fwoVjQXgyhieF5tkS2YSdcVIEpIIFW9IZWy34lXsYMma5bj2rla0M", - "q6tNu3uP3ghjz71B1LlR+N/C8rnZfcv8eExrRv9WlmU1YnI7NuW6a/amF15pm/tzpayxmuUXltnCdC9A", - "cp6a0Tg83nJ+uuCkQLgr4UjPgHVk6w6Cz3O7HLaoBCtzXh2lbconMyan/IwZs1A67dS7kkJrLp1JTQ/u", - "oHRIvmg8vqqhSzEv5vAHtNxZ4kTtEN4pKPKcaxg7u8EtsTbIH7ZR2NokVybRun68jEQfnasPHHdFxyjm", - "TA4mWnCZZkvI2JhnjtUtpGN97txKyTmEDzVWGkm8jO4op1xy7biB1wMGRqS8JvRXrynes40bv0oDburd", - "C/8Bxe8Hp83d4+q3zdnZAiqn0bZp8KdT6fRJ2lGvPEm1gJRrccWdZscyoM/BRKu514QemEj+afD+uLCz", - "wQX9GhwuMOMsdTS3hIRlmTPIfnj5AQ7crYOFsDNShEzhLC5U1S+57INReC8H5d9xUJgJZ00480AqyJSc", - "ch1JJ+GKzLpp/8hzi3rvmCWXC6ZTA45hMSvGIhN2SSOqLMX3vHGCMtNYkWVkoAjrXVaB+a0r6Gt87pKc", - "NpvkBCrntX3lMtHL3DrNk6Z1/PJi8MPJWxjzidI8kjnXRhgr5PQp6dWC9GXUIxrWLq6Au48mTGvBTSRt", - "Y2yST59H32F53XTuHYmdNF76C1s2c2XE6tHu4T4arjvHQp9aQz+hv7RpqlJYwbINfPS9JM0GwiO4/5Iv", - "kDhhXhjrOKycukOBCbpMMzUVchhJd9Joq4CZMWd94BGqwg7UZDBmMl07jj+0KWSKnCjBFsAv9vq9K8EX", - "XG+3AMLi19bqP929yzWXQcdWN/aq01KdaM4H7jCg9kCr2RtY4Z1w4Bd8gmtW8tTyeQudyHSUCcnbtJN+", - "byIy3kWx/d6lkF1GjpwWbNpuQHSP1mlz5AxFbufvRkwlupK2Xyx/lXHq9fX5efWrDaktY/PGdhLG5+6e", - "mAvbcEA8OsQL4nSZ3tFhv2XrzHI+VtlNqca/tW15XQqm5k7e7K4gr9DiJkV502pXFhFmsUlnfiH0S2n1", - "suOMElWQv3PzJu/Guj051T7cNqPSV7/KS6zn25sH8c+1ffmVyPgPWhX5OW7M+hhjbuzIJIquSykfJplC", - "29J/UBbz8S5MYONdnzObzPjuFOLm/ta9s04cKxtQv7m1BVVDdm0NfX7d9pgV8nJEb7QspOYTX/ttMwuV", - "3DizfSZucFHe4TuvhW27Izc4OfSJb5gb3f8uvrrKLKqPNbhk2Jows359L7tO4YwtM8Va3BO1jV6JOn14", - "NfgDOC1uCM+FZHoJjgZKn7pUFsYcTDGeC+uU4DbR6r8+mrXGei9eHw8eP6FQbyqmTq1UE4j9S3HrFzeS", - "f+elMeKv/IZsztN6tduNtfhPdm03sYJ2DWD3673izuOWJ86oDI/0QWmQzvwUEyhk6n8f3tgf1pDKm2Sw", - "W9oFZzqZdcrgdWH6eKsw/aXgusXddVGMacJAPCYFNmVCGgtxOeN4eEPTgsbatri7ksArtPAFJTD5AI6T", - "UtSuxOFDLIHREyGWAQmTYDgnixGtDbWQ7gzCA8JEsnRjoOnRh4nKMrXgqbO2nTm4BKWn7tPcGDHOOAYe", - "0PQ+UHpqvJVSuhIeGGBpOqDwTaYW6HFAm5MczgwueMYTW1qolCyQKyOs0kvIRXLJtbPd0UzNuWZWaVxK", - "qp15jcETBibniZiIJJJuej4A6FiO5tkSI8vk42CTicgERmHNgE2nmk/Rm+OMH7KeVjyXV8wyHSJx61fa", - "WWbrR+APAH+FPdxqJxjcpXbTM1kx3W8P03mh2fxc1HOfiHrohgiHhU7upxD1lJ76n5SeMikMra4Z8HEf", - "6PXds9sNPFqUf6qbAM95rtqor3Z6V4JohI6I4opnxx+Ga9vsOcqoipCuuz3cdx8Y8I8CPfq06bmCXPPB", - "RGQZuTXomUgKmRc2uIaEaTpqkcYMsBBjVHP8KRPGdoQ0VqzUtd/RX97uhaNQbXCCrL44s/Osk9Z83LUt", - "kLLK9Mvx+6s7W32mNlr3GX8IXqjfeBCv25yt+Snr5/CcGzvgk4nS1vsB8bzh7PxRCO0uZsyiA8xRAzn2", - "wPsOzdNIYhzFsRfODDeQq7xwfyICq7smvTvT+ye5THMlpI1k8FTWfGroFbuZp7At/uWP3q+9Ee/actSb", - "wzg4vd0lZJ2EbhHJ8aNukoivOcvsRtnOTJtH6YJbcn0iQ4gNRoEwyyMu5Aw/umzXVenRuhtNXfb6vfKt", - "7VzWf6FtOZin9pxPxQZ/SJFl7fk0jQQh5HPuysBC5NxQrqCjSp9TCW4W3AtfJ15LfcA4+d7wqtW5zcYp", - "d55CIbvi3CQbUP/2cjdNBXn7zpokuJEX996ynDi40yLBaZHwj//8LwjWiJqAjzlly4GXR173H8LLeW6X", - "kSxlQ9iiGTMgkRGMOZeA6RY8hT2lIXbHcESpQQtm0KfL0/2G2Ah7tKro0WasLr2THE6YTHjWvbkJ/p61", - "B9pX427ls53DOe3WbPTG3UxTDkYqOjKuT+m1J4frXKEikpuo/uVu0sy2LatzE521bUZJFfDfbN3gaCOn", - "DOc3eN4nM/J09DkWwsqY/dVJd42yYU+kMLMNLvmMO+HhLlPzzLfGsHY8S8/ZRzTvVJhEXXG9fT/baWDr", - "Ou/28Mtt3v7CusxwlwV3d2dxsT7sGgF0bsCZVlPNjXl51eoVei+5s/CkDfHgdy/+ePH+HRirOZsDJ1+Q", - "U23is/cXH+AAOeEBzidGCUrWW1CVuEwNxMdIqEdQT3+9Hsj0L0bJmEzRGEeNKckzko4AtJgLySwnNf6K", - "acGkfQrKzrj2SbeU0em1rhSYQV3siknbZseNmU1mo+ArWj8b2sNNv9UJY/0ZPh/zdET3olRhhbTff9dr", - "IwUejiBQAno90C1YXuERjlv9E4dIq3+nCn2G9Bu6wPu9GWfajjm6MGnJ/il64OeWuzdhTTWslp2Fn8ZT", - "7g5pNdnfDVje+qNzbsyN3X8blAprdrVOViOceDpb79GpnLQYwOFXyEnkEY2zxIorPvBaVaDoEFv3nhUk", - "7Kd0i2bCKQYiYdlgwrJszJLL8i1UWcOr8coOx/1I+r/hXsd9TE+Jm1Qct12Sm3JAnrHcnanhiZLpym6r", + "7L3dbhtJtib6KgvcA1hykZTssnt3yzAwKtkuu0u2tSV7V5/TWYcZzAyS0UpGZEVEimIXDMzVBs7txgDz", + "BOcB+hnmvh+in+Qg1orIHzKTpCzJrurZV1UWMzP+Vqz/9a1feoma50pyaU3v6JdezjSbc8s1/utMq7/w", + "xL5mZub+mXKTaJFboWTvqPdKaGPh0e9gxq8hmTFtQE0gvnh9/Ghvpowd5czO9uMhXHAeyVhIy7Vk2UFO", + "HzVD99kzZmfxMJK9fk+4j7p3ev2eZHNe/Uvznwuhedo7srrg/Z5JZnzO3Iz4NZvnmXv06fhf08fJH/gj", + "9u3k94dPHvf67m03ZO+o9//8mQ0mh4M//PTLo999+m+9fs8uc/eSsVrIae/Tp09uEJMraTgu/ETJSSYS", + "6/4/UdJyif/L8jwTCXMbcPAX43bhl9pk/pvmk95R718Oqi09oF/NwUutlaaBmrt4zo0qdMKBZZqzdAn8", + "WhhrYI8Pp0PgcyYysOySy/3ep37vldJjkaZc3v/Ejgs749K6r/K0D+PCQsaSSwN2xiGcCGiVcTexNzLl", + "11x/lOyKiYyN3Znc9wxxTCGnYLi+EgkHqSwkSk7EtHDUgtMioqNv3PuMPsoZk2nGU5wS18DpyX7vnbKv", + "VCHTL0hQbjcmOOanfu+jZIWdKS3+yr/AHN4KY9zBKA1CXrFMpHB89gYu+ZLmkmuVcGO+DJm8ZdlE6bkj", + "Vv5zwY2FsUqXbm5zP82SmieCZ6lxc/xR6UuTs4SbFwLn+QV2rRoTJpzZQnMQBlI/PigJdiaMJy3HVm0k", + "45M3fxr9+P78h4uz45OXF6OX746/O3354rljlDEw6RZtLNMWrAIu3Zcct3WD+/m46R6naTn4Oc/VOW0U", + "CgStcq6tIL7ICqtGCz6eKXVJEmHCisz2jiYsM9wtKNccOUbg1c0lnvIpS5a0z0N4xxeQZMLtDpiZKjJ3", + "b2QKsR9hNFcpj0FIYzlLh5H8ccYljJWdAdMccq2uROqY08oLCyHNM1i4h5XMlo5jRXKsVAa4fbYPMe2P", + "MDBnec5TtzuNj8BziHC1Uc+LJy8y3Gc4k45GxprJBAXjXMhTLqd21jt6tCZc+r2psLNiPCp0ti5FZ9bm", + "5ujggJ4ZJmp+oBaS6wPNcwUfz0+HvZYvWnXJ5Uik6997j//DMhCpE8cMjFWOtL8X9nUxhrPjD0M4L+ld", + "aci1uGLWsfRcmcZSq+HqO9M49t6cyYJlvdVzfq0WKCc8G/SHe8l5TjSMi5tobmZHkRxA7HY6hn/8j/8Z", + "3tB8KoxTQ/AzfnwQMqxDSViqQkcSYMxnLJvAnr/FBlg6F/LIDTHCt/DicLf0/SGORpNujIe7ZICFoUaG", + "J5pbf4NsoaUBYd1wSib8mRsccmYsx09/PD+Fb8C/IqRVYZpujoZnExo3XGUaWSpwyx6YpUyAWWBZ9gw0", + "F06qwZVgRLYAKTOzsWI6dTLYKqJpOigui3nv6M/VKbgPusMIPOundVWnrk79uU6aJUFXL6mx09QcBRzn", + "4ge+XGcIiebuto8YMgvHZ93/9VJm+cCKOW+jJiLbtT9nzNhRYTZ/TBaZ1y6IvWz4isjdV27wQsF2eoF0", + "05YF4L11n9KjjiXmmk/E9fqlfSFMnrHlALkVPeQuryOtSZFlTnB6hTBOxPWIPRo/Tr5Nn8SOnk+VnAKX", + "qpjOHBfTPFFTKQx3lyVzqmTfXT9ty2dmzCIpJ0w6FcG9II3VRWJxQKXFVEiWdbACza/UJa8vr8YR/Y+3", + "OMAV8hRpb3Vf/QGUm9mv02A1v24iPqHHW4RbLkaXROSb5Le/Cp/6PXc24Y3mgX6Yccgz5myea4vHd8Wy", + "gg/h4cNz5CY8BX7NEpstkaEMHz6EC8eC8GQMTwrNsyWyCTvjpAhIBQu2pDO2WvAr9zBkzHLdelYrWxlW", + "V5t29x6dCmPPvUHUuVH4/8Lyudl9y/x4TGtG/1aWZTVicjs25bpr9qYXXmmb+3dKWWM1yy8ss4XpXoDk", + "PDWjcXi85fx0wUmBcFfCkZ4B68jWHQSf53Y5bFEJVua8OkrblE9mTE75GTNmoXTaqXclhdZcOpOaHtxB", + "6ZB80Xh8VUOXYl7M4fdoubPEidohvFNQ5DnXMHZ2g1tibZDfb6OwtUmuTKJ1/XgZiT46Vx847oqOUcyZ", + "HEy04DLNlpCxMc8cq1tIx/rcuZWScwgfaqw0kngZ3VFOueTacQOvBwyMSHlN6K9eU7xnGzd+lQbc1LsX", + "/j2K3w9Om7vH1W+bs7MFVE6jbdPg30yl0ydpR73yJNUCUq7FFXeaHcuAPgcTreZeE3pgIvmnwfvjws4G", + "F/RrcLjAjLPU0dwSEpZlziD7/uUHOHC3DhbCzkgRMoWzuFBVv+SyD0bhvRyUf8dBYSacNeHMA6kgU3LK", + "dSSdhCsy66b9A88t6r1jllwumE4NOIbFrBiLTNgljaiyFN/zxgnKTGNFlpGBIqx3WQXmt66gr/G5S3La", + "bJITqJzX9pXLRC9z6zRPmtbxy4vB9ydvYcwnSvNI5lwbYayQ02ekVwvSl1GPaFi7uALuPpowrQU3kbSN", + "sUk+fR59h+V107l3JHbSeOkvbNnMlRGrR7uH+2i47hwLfWoN/YT+0qapSmEFyzbw0feSNBsIj+D+S75A", + "4oR5YazjsHLqDgUm6DLN1FTIYSTdSaOtAmbGnPWBR6gKO1CTwZjJdO04ft+mkClyogRbAL/Y6/euBF9w", + "vd0CCItfW6v/dPcu11wGHVvd2KtOS3WiOR+4w4DaA61mb2CFd8KBX/AJrlnJN5bPW+hEpqNMSN6mnfR7", + "E5HxLort9y6F7DJy5LRg03YDonu0TpsjZyhyO383YirRlbT9YvmrjFOvr8/Pq19tSG0Zmze2kzA+d/fE", + "XNiGA+LRIV4Qp8v0jg77LVtnlvOxym5KNf6tbcvrUjA1d/JmdwV5hRY3KcqbVruyiDCLTTrzC6FfSquX", + "HWeUqIL8nZs3eTfW7cmp9uG2GZW++lVeYj3f3jyIf67ty69Exr/XqsjPcWPWxxhzY0cmUXRdSvkwyRTa", + "lv6DspiPd2ECG+/6nNlkxnenEDf3t+6ddeJY2YD6za0tqBqya2vo8+u2x6yQlyN6o2UhNZ/42m+bWajk", + "xpntM3GDi/IO33ktbNsducHJoU98w9zo/nfx1VVmUX2swSXD1oSZ9et72XUKZ2yZKdbinqht9ErU6cOr", + "we/BaXFD+E5IppfgaKD0qUtlYczBFOO5sE4JbhOt/uujWWus9+L18eDxUwr1pmLq1Eo1gdi/FLd+cSP5", + "d14aI/7Kb8jmPK1Xu91Yi/9k13YTK2jXAHa/3ivuPG554ozK8EgflAbpzE8xgUKm/vfhjf1hDam8SQa7", + "pV1wppNZpwxeF6aPtwrTnwuuW9xdF8WYJgzEY1JgUyaksRCXM46HNzQtaKxti7srCbxCC19QApMP4Dgp", + "Re1KHD7EEhg9EWIZkDAJhnOyGNHaUAvpziA8IEwkSzcGmh59mKgsUwueOmvbmYNLUHrqPs2NEeOMY+AB", + "Te8DpafGWymlK+GBAZamAwrfZGqBHge0OcnhzOCCZzyxpYVKyQK5MsIqvYRcJJdcO9sdzdSca2aVxqWk", + "2pnXGDxhYHKeiIlIIumm5wOAjuVoni0xskw+DjaZiExgFNYM2HSq+RS9Oc74IetpxXN5xSzTIRK3fqWd", + "ZbZ+BP4A8FfYw612gsFdajc9kxXT/fYwnReazc9FPfeJqIduiHBY6OR+BlFP6an/Sekpk8LQ6poBH/eB", + "Xt89u93Ao0X5p7oJ8Jznqo36aqd3JYhG6Igornh2/GG4ts2eo4yqCOm628N994EB/yjQo8+anivINR9M", + "RJaRW4OeiaSQeWGDa0iYpqMWacwACzFGNcefMmFsR0hjxUpd+x395e1eOArVBifI6oszO886ac3HXdsC", + "KatMvxy/v7qz1Wdqo3Wf8YfghfqVB/G6zdman7J+Dt9xYwd8MlHaej8gnjecnT8Kod3FjFl0gDlqIMce", + "eN+heRZJjKM49sKZ4QZylRfuT0Rgddekd2d6/ySXaa6EtJEMnsqaTw29YjfzFLbFv/zR+7U34l1bjnpz", + "GAent7uErJPQLSI5ftRNEvE1Z5ndKNuZafMoXXBLrk9kCLHBKBBmecSFnOFHl+26Kj1ad6Opy16/V761", + "ncv6L7QtB/PUvuNTscEfUmRZez5NI0EI+Zy7MrAQOTeUK+io0udUgpsF98LXiddSHzBOvje8anVus3HK", + "nadQyK44N8kG1L+93E1TQd6+syYJbuTFvbcsJw7utEhwWiT84z/+E4I1oibgY07ZcuDlkdf9h/Bynttl", + "JEvZELZoxgxIZARjziVgugVPYU9piN0xHFFq0IIZ9OnydL8hNsIerSp6tBmrS+8khxMmE551b26Cv2ft", + "gfbVuFv5bOdwTrs1G71xN9OUg5GKjozrN/Ta08N1rlARyU1U/3I3aWbbltW5ic7aNqOkCvhvtm5wtJFT", + "hvMbPO+TGXk6+hwLYWXM/uqku0bZsCdSmNkGl3zGnfBwl6l55ltjWDuepefsI5p3Kkyirrjevp/tNLB1", + "nXd7+OU2b39hXWa4y4K7u7O4WB92jQA6N+BMq6nmxry8avUKvZfcWXjShnjwuxd/vHj/DozVnM2Bky/I", + "qTbx2fuLD3CAnPAA5xOjBCXrLahKXKYG4mMk1COop79eD2T6F6NkTKZojKPGlOQZSUcAWsyFZJaTGn/F", + "tGDSPgNlZ1z7pFvK6PRaVwrMoC52xaRts+PGzCazUfAVrZ8N7eGm3+qEsf4Mn495OqJ7UaqwQtrfPem1", + "kQIPRxAoAb0e6BYsr/AIx63+iUOk1b9ThT5D+g1d4P3ejDNtxxxdmLRk/xQ98FPL3ZuwphpWy87CT+Mp", + "d4e0muzvBixv/dE5N+bG7r8NSoU1u1onqxFOPJ2t9+iNnLQYwOFXyEnkEY2zxIorPvBaVaDoEFv3nhUk", + "7Gd0i2bCKQYiYdlgwrJszJLL8i1UWcOr8coOx/1I+r/hXsd9TE+Jm1Qct12Sm3JAnrHcnanhiZLpym6r", "whlsHTGQm7D5z+C0teXvEIqaMdMIiGuecHHlCKO/kUNvIL5P22inWwzl/oltWtU6KTZETJMoY5FmvMwi", - "DlSISu0BlPRVVMU4QyzAonKZkPdMLxElu9/LvYkP4lKljA/iCRP0H7qQsnzfGfoDXUigOZKaTmOMdCFN", - "3HRYuQljkgHNoXEU/ZoG6xiYoP/ww93K9PqjGrekL1rL5zmxk820VM7xVt6Mz3GvpDwtch6SS7cOsckb", - "w0M8detX5ux6tPvm5FWgqt28a0sfO2cLQDXEv020OGM5h5TnqGMoCbEbLR7COZcp18DMQBgQXiEpvYNP", - "IVXygQVmTDHnQDnMheat9hrVu6RFdsOD8EL8VgSwrim6ldI1CFTevBD+Evy8wae8Q+I0PtKvdM3ybFeO", - "emVvtnqY/qjGmz1Lf1Hj3e1Jd0dv4U/CsTZ5k94IefnSO0q25aF5J0FHFNRJ/kffD2b8GmKnweBjMZbZ", - "VI6E4Gfwudtg2JxTdl0kC8NTp44fsFwcXD0qS2EPfnWf+9RI/tPcqOyKY/KfVV4XZ1JJp0RAXKbBUZWX", - "kIZra4BBJpyWCYuQnDXSPFeR1GpBnw/zw9S0UHQ6xugNEcqzB34pD/DLM3bFI8mgHLCsTFB6DlGvtXDp", - "f3pXfc+nsLHr0l78vhkF/H4bd28cSev5qk2etRtk++2cXN2RQbcx0dnPsuvGYEBny0X5aFrIH19sG/At", - "35DAX9jZaM7tTLWkNH7gId5SxWEWM462mlVgCj1hCYeol6mpKmzUgz2vTOyD0pGciRQrE/Z8zr6PLlbF", - "DA8MSGVn6JpUkKkpqMKCmuw3VQb/Uce3fOlCGzu83cb1G1vRuo0q5VlHhlRb/d3rVxR4On3hU6LTKgaV", - "sMTtqtA8wXgaBhGproeuztwN1h5KDBbTSnhubFRWWO8btRRWHU6nxYRcpkpCKsxlu89b/JWPxkvL263c", - "G7hqUNj4rITaVzu30wmPNpdnMuOjVOh2xnty+qfRDz98fDU6OT55/XL04vSckpoXzIBJmJQ89U5fjP1Q", - "eFAqOcByDSi/Ds+czlztkaEi6dYtwvPYXZLVaGVbYMd/uV9bddt2VelON03L2px69ZvLlKoWEybXth1e", - "fLdthlZzNmq/JOckSVPAp/h8MFWQqCzjiXugdh8pHi9MkJFDePfxzRuKJhG2wDwvdsvb6Ycp3eCWdXyy", - "YY9Iy4TkumOlZ44LCIlFLMhwwvOwpyaWS+C/FCxzfKIC6GjPBvsMk6WRw9/BpvDCLY3lc+JYPo0jJII8", - "MDBnyUxIPmxPx0e9ZOSuNtYit9RTv0S3GqYiuQdApFxaMRHOjEBTN2QLVMeMLMSZSpHc03zfj+IPX0nQ", - "lOLCLKYjuD2AVIuJBatZcumG8qItkpXEtG4HDX2DGYh6H+WlVAsZ9UAzkqUzJt1P+C0SfTsUq1LO1w09", - "92gHht27jSVTar27wsGsoMGQuUeVdB/P39ROZ3gjwJZ+z3DrFPqtPNmzjIvwuHv1l0xYvo1ZXPz7G+FO", - "mlk2ZsZL2JCx40kJSawilPL0PbmQecqvc2U4piGwqdOzJ2onBuKneacMxGn4O28ZPtse6CiDUzWHjqev", - "jd7pIk9vyFdacj1DXmfFcNY4Y/2m1GglbEDNJm4UD9emt35pNgikzdZwsPJ21iOCmLujJMRy/E1W8uo9", - "WTekrpOsSPHauEt6Qw40Z9cjCorcPL93beTVz21aTyD4Fc3dH2sZ+d7s6qKAZhVU2uXpG32alChzw42p", - "D9RfWdPKpFcH2rRlxXzO2sydTUV6ny2afjsSRfOES1s/ip0u6wU+36H115lnS5g8HwXlU9wgAaMs2eni", - "D789Su1i2yUbrrPrJllvJOP1TVw7xw2UXhYwdtj3VfrquipqRuRo6wLCyFUrPE/TLWeGwnvASychlD5C", - "fKBMMDQ75q1VnuUkU7ImmVeF9AYXczXJjrhC9cBuZl/jg2uvV9tVQtDUKKPa6V1Ost21UA54Yxm8QiLb", - "zPraQG2zPecTrrlMeHu9SdOkr+KX/qXWs+qsCjrOFmzpwSp8xI+X1LS10rbuPmj/brAk48qmj2FP80lA", - "yvB5t5Tv2UcDWjM55aZucu5cUbuxmuhOfRT1GpvtlV1Nz0VtnC0FOiUpfGaN7Hr1zpMvXwpbW8Rd1eE0", - "r8gXLMM5J+Stl/KXghc83bQiKpTYtIoGml47o+Z+oF6/56Mwo7uIeJ8T3N9xLYtn7UCQqNvB49gvBYfT", - "F09hUiAA4RXXRihpYM6WwZLNuR4EVMGQ3oBVbd57JtqcqesnEmbRuopCOnPwBME824I63snT5QWqeeGV", - "BtblfsJClsoV3F7GmLE5GzUTzkrSe9R2zeiNxF7f6Hk5mubFKGNLj73bXNDgETwDlmVAD8DeW25ZdnDy", - "8cXxfh8O4RmcnH0kZLjepjHszJFaywDuExm3gA8OfAwS8emoWnHY28ZdnE1WHUyiJOVmJ8vtO6B5ouZz", - "LlMi2I38oU4Z57X33CVD4NNN+ebh8qVj5OdXvebYP2+rDuqdcT3AvC6PkxaAd9RKwCxhErTPXoCo9+J5", - "1IODSEa9l/LK/SdEvdrkox7kIstAUtUIcJbMAmLYj3xpqKySXIy1pEkMIJkjiFfuQ9yHuEmEcR+Gw468", - "iKZPpq3iYMZB07aPgisFtFqUflNYaGEtl1WZa4W9yeXVQW2LMc1TSOCTiSeqz3NEhkmPl22TViCMKTiB", - "seAMzz5+6EPCcsfUahE578erVUfcrB53lRGtXf7W271+HTfdnhYWVJL6Vt553rxZW9noTuxvF5a3K5vb", - "iVXdkNls8yd9nUPbelYfkabbNO4sJEkrj5kzhAsuU2DeZrQKDLfOYsxYQqEfdcW1FimmaUQS3dH4jb6H", - "2I16US+GPV+2TZ/fd/c3PoxhTxZzrkVS/t2qSJ68eXl83vz2HjIstxuYdWgQVIuQhq/gAGr3fn8Yyfc+", - "5dyvxaPBcqFDFU8dhGorpW6PlbRQ7nYP+Tol7/rOKmXv/l6N0re/tJHyt73elsh6wedMWpFsgQvwXti2", - "4suMJZcYc3dmZqpVDl7hhsVMhdCJRx8BJiuIUw0mIAcMbwSn9rlxsFb8oNWas2tERqQIOKgJvDp98xKm", - "WhW5gT2MA6Mzat9DcRZa7qAcCVkBy7RDMSbKCMnBiLnImBZ2OQR3YzDm5PWxUCy9dzj8ji72iUr5OZOX", - "GPYc/Psf9j1ncLeYX+eZSITNEDTUYwJT6lamlAcN3Z4AUFYKrUpZYXl56niZPezc/R59CUFxN1gSq9Tf", - "ZfXhF0aoA83bdoNl2SDJVHIJ+CTisspk2QetClR8rIJHkPJEzFkGyKeb2k9ngv3nIFnUUY7uyYbur2xJ", - "++ZSCtedVJzz61xobu6iSl2YkRc5HdCvIc4bsuQTpvWSamkRvRx55LAVFR7DhoZzeaOJVm/dBLYaX9gJ", - "trotY6sR+qzt7soaGtu14ZQ3B0H9Tt4gruJp5xapweWYm/w+FyLlCdMXpYNmNVI4mmRiOrObUk3QkwMp", - "z+0MGCG0zNXcaTRqAobN88yzuc1Copmu356N1l5O1ebMOQyJS5DMRIaJyZiHKQywzFk9exQCgIOyx8T+", - "9jmip6or6OF9Ot1bhpdrzO2CcwlUaea2iAoQDZ3EQfAt+e4VOVtI8MnxHSXs5F9res3LvHr8mE+257V/", - "lIUmG9DynaHp7d6yJuoGPJNmFTatXyOmVkrcglpNxuooRHNGIcu+ucUnZUW834JGVQ4mM20/ZZaLkXf9", - "NdssXT1q415O7eeyhQaf0w/1LCyPYz9VcXvq2XbfXjGdumW9cqZOSPIKn2ULp5Y4SjpYVY1Gh4Mffvj4", - "qmNYJ6+NrS96pXMJ/h4AQsoGP/552FsIO1MF3f2Yfjy4ir26048kTe9w+GT4KN4fwrsiy8AZfxkpZBjq", - "NgVmSk+KDHKVZYHoudkxOww3Y5Qp5q39NV+OzzvjTS+fv3foMdUWIZxTwkEWEp4cHsLcTeAVy0wNEz28", - "JAyEO+WUuhkzkGhmZjztaptST4dZ4Q6OSZetP6paCrMLW8Jzae+x4vGb/DOQsynlCjgpHzcPPvZHg+ss", - "KGVvt2wt3Ms6/ewGMtKdJTVqtNLahE/vBx0kM55clt2w3FFgajOwiiIfxpEM+6DKbipuaAQ5l3wRMhO9", - "10+GBlvYZeAVuh2FAeVteXetsVUBTqY5EexZYGHhuGEk9wy3gO2K/uPl+cXp+3ejk9cvT34sOxYh4klc", - "t1TcHRByut9FSH60EY62TZ34D3r4xD3rZX1nTX5gZ2un2mSMKxeu3+JYqqVetXLvVjFQSyi5M+DcTdHT", - "3cKiG+CBN8U5aTWbUBb/G2f5M3GWaWu3uG3cMLf2ktwAGPKOrPLG0u4qtrxGi18wvEzO3W31h5+d1fyp", - "c8iNWPhprbldJ9ZUiayXMFl1VQBWaxA5hHM+wcwl7272YRfqOJd6mHuUEU4MWIWf7mLsAdK+OaN3fIHt", - "Jkvj3M2pMTC0j+tBoPzAMQHjr9Sn74Ka37HBbTD4K1qwsrM6zEnw4qPnDCWpE7LMB/Uyzq48UkrA9wod", - "SwpJvQTSIZwx6l3IpE/xCZ58p9PUho8hyTjTJpLCDiF2zCem2s8xr5VH4Q6FhnptHvhtIIm7QvOvb6Iv", - "4Lu9g6ibmCt1qezBNmI29u0AhxB6PPpOP9QZK5J1Ckdg1LLJw/vz0NCyi4Zr43x+ucVNWlW0y0F30iMi", - "mkYXi+5Lt/ONuINsfkFaEy0JJ9Ax4015+i3me5O6tqEgdiLYIDXsLF3cUD8JOyvrJjZmCtK3N0qMxvec", - "/Z9l7ye9oz/vUuza73AeBJfYqANt+AQhhtWEWAP6BNPgBTVVgRyy3p28CJd8udtgvnFbuFcGS2IRn+oG", - "I6IHDQFvW9MZ3io04RMCtPKuXUdY7j8cxRrL5jnsnb86+fbbb//NWR7vPGp3KQQr/MBMTaeYq7sSSfn8", - "dnfth7S2kevU8vOnfq/FwmnJMOXJZUeuxxsnONHvUNuJjx9O+nD+6gRoP8g49viSlePCvfX5uRxeWG/2", - "WORcC5WKJJisOFFhgona7hUsfaktK8XfwINU9cMRz2sUgkOQl9AvXMngo/mMVBHZzaV+oqajm5L2ynzy", - "HdwKG1IL+z1BDbycgL9trqGf9qmcqI1YA2pU+XS2+TKCT6p0hWVLSkOruYVqLWEjGZDm3R89bTgWsldv", - "VYztkCFcdg7fIOT2jKWRXGkWuz8E1HwJf7WJUo5aU5gGUM/VrFMBaDaSbXFjvj0+8S1jh/DBzQuYU0ek", - "EZiT5HRDrSyi5ilJ6Yya0wKGm5r0trrAXjny/Xj+xmnA1Le21qb2gSk77FL79FBI7+xSbEoaFFA8ppPT", - "P43OPj5/c3oywoobA4V0yrWbca4RxQcb34ItpOSZz5TbpUdlfQlrO9hfI6VWmgza+B3plJs6WL1qbVzl", - "987r47hjbGy4tMNuvW2loceb0xeDTFw62sOE3GZRU6fuvdqMXrh3y5IEzBZsff9u9LgSobyaRLfatvHo", - "Plth+4w6j4peblDbsUlta6Z+79BBvaU/OssEI21rpSl5vSs5+EqMXHODCo2KpMrSsqM6pmS4SWN7QLne", - "a913RYxkZ7/1LW3P7wQ2YFNz9JMS7+jz2qR3h/+r4q1uYSQoy1UQqtJ0Zhfc/S9gBQ2B4bAQoohkgFIq", - "1VbmU3WbJV/IJVmaYpMK3+M76h2nKQSMKvDOnaiHLTaG8IYQnRCGYMausLNlkinpJBriq172sTkwHSLh", - "Q0pFhTdVR3FchlQDlcOek2SRHHOwWkynXDdBasKe+3YiWi06XfA3BJi7MxwCSlCYsRax+vL4BVy8PgZm", - "yRVUC6rhpu0UzQmgU+0YAadNqK8HpgaO5Y53B1Csj8a3FijbBpRY7h3gYAcPq1rASO7hYM+8/t1WI7vf", - "0e3ifkoGkdhaa0q8ToYPQOmpw6P4ptQ6WJaZeuQNrwVeF2EgL8aZSHaMgd5cllWKhmN/bUUxJTiJwKov", - "XMBMLUIyUK5gypHh5hYmmpvZEGLHpeNIMnNp6notpgx6DbKmsfoZPIWY1Mo4knPOpGkqoKi40d8+nr/5", - "hvSiuiKHnte54dkVN08rX1cM5lLkhvRos5RJFbZDLZM4RCQ9Q6qVMYwLaxVl8jf9pTRNr5Nty6HYUk/a", - "pkysVIzWhEStRrRxS+s4h3UZu3K8de7/meqJE+ydTeQ/qzrsRrZCrYW8kknTrME/XAkWSf/JAcKNPHwI", - "juEwop2od4GfcgKG4rlyzRCI5MfTp5DyTFxxxCVmGguUBW6RE29uToOL18fYiCH0VRmr1BHKy1WPdFYT", - "YXuVrOriURtNmTNkB9lyoDlLZhgpxvyhsra1fsfKpXlE81SFjhiB9xhui7yy5uBUUp4zPbSCoihSMHw6", - "rxpMfPYi10JIuer1NxtAW4lys96M9eQ314sDjX5uEh4Nu5PGTPG+k1khLze2P7wh2NktCotX9YC2hkRt", - "Od3nbLGez10mvjnKoixhp6qhFMGUcseNKXhG1jblmePVM0rTvcMm/TnXgwBeNVbKWOz1xnwj9D2nlfIr", - "oQonna4EujnnRWaFb6BOLY0iGVaHi+jDYiaSGRYBOt0S5VqqCLjfI5pToDOSmJI+U9riMhx7QGs11yot", - "EjtAXEOWaCWXc7O/a575nRZxr4iGXWq6yx6dntB2INVXqBC1G3pbSaezixFubMIsn1agdBwdkYUmv1B8", - "hXgXWGFP6jfCxDv9RhU27gO3ieNkbh0YacyWmIqDOT1s0fR9ouGIFo1kGVD7XOOxqzLOLp8CpfPUtJhM", - "TYmC4rqcjqu5OkUOB9mF962cld+XHbb/jBTXz9z/LnB1n0CJth/1UxIS4lXgDt9cagjHcolYpqEyE5On", - "Yq80x1CpcXihZsy4fXU0psW4sFgY4O48apLEupua1hbtvFMn37zJm7y6K5vchbk4nj9+0lnTwpkMOMFW", - "5YN3SHbP3z5+AviGoaYkNQy+PSOmMpKTTOR5MEcJgu2BATfU3j4YBdiLUFxxeOa4qeXasZcLgqRN28tw", - "jVPVo16lrHsE2zSSSkImLNeIZOHsE6fIZCyPenBlhhD1cnfjjC8RqbHyAGy8naulXBp+s21aFRyi2q6S", - "Zw/hg5pSdAQtyLg6jZjc1nah8GuYmZSZUAPIMWJlFcQN7h/vuh6sd+5iWrNizqTTy1JUy6g2eg0Gt06K", - "D0wkyUwntcrn8Ua9mtk8Z0JGPez8FfVqf+nSHmUxL5tKr1xtEqh+JjXqw70xhb7Cmfp406D07ZB0TliO", - "AnvOCOAYt9E9O83UmGVBXK91mqxj5m9jSo1DaTEElmMtkKxTkbJk6ejiz4f9Rz+XcON//9tgnHGJzVLd", - "GlDPiORcyMGcXYN0B5yJv/KUbqNbD5JooBPY+/vfnh0On+yTDe7nM/DNeBIOU8cRNXMrddrIBzQoPqi8", - "TNaNepHMmcSqeG1NGcGtFXduI7PNvItIcHWvaufer/Om5hXcgeFtayl1cxW6rte2aNLEwkelfr4KSJmr", - "spqupveRCgAGvw1ln18mSfBGMi30asWSv12J0rrIbR0E1wNF7+OBRlL7Dt8NG4hyvUWWQdVp92mJB47j", - "GA9UX7osLqXvD+x1R8zCwmYOIbl9pT/mDTa0pn21AcuR3Ny8rXjvxzxThEXeXO64sLDgmjuBjdfIMbVI", - "Ln2oy7tgNSH/V5Ldd3HAjoJlQprvtRBJOmzaZ6HL0sgFbmuec6bJiLcz7vRtlswi6TtZPgtKRbA9xaTU", - "y8lThh7oz9/Quj7VtqMbEver64+8wTcWWxEx4AW18aYGHo3TPVc2vrKPhAkReeoFBlb1cb/d6XJpI6km", - "/mNCpuJKpEXFiN1EYCamM0fMxKOz2+xONyqnsSzjo4k1O1Cbo6iyWUQtkwLZ8VzQ3d0L/Z0m1sT7CLSB", - "MYMjpIsHmlcEiWEEZHGR9Mxg7OtQTM604TBj2SRc5hkJEOGBwbzRF0nHClhuvNuDZVOlhZ3NMVxcaD4g", - "GTFhcqAKG/R8NyR3iiw3Q/hAoQRsvEw3QkkCMrEKcQEmjsTd1199uIgQozrQMRI8UXJFBEFdpjad/ptO", - "aQtIQxxjWnRYn3+qF+7oXn246CL6zhZM6jL23lOqd6bO6kOIcWPpt2o1ZCenMHGa3biwkQwtEDA90ysd", - "cVkmHvsabYhzpq1g2cjbfzE5CbCqj6g8cH536gxNNlOz4FEY8BRbLJBEIA4djnLPcA5xXQTFK30Y0IeK", - "i0JAzcZsbtDosFYK4eXoDrK4cTo3NfE2aRE/tzV0NTwpnHZ/4UjFGznucPRx0YpqTplqvk0sMAOxe1Bp", - "8VfMKDuC5/g2RMXh4bfJyemfRsdnp6MfX/4f+Ace+8Y7cwyq4aOVKjSzNu99+oSo52196V5/+HCGiS7B", - "5o4Tce0ruuLKZElUygd0HVPG50oOI0k9/RdCUw8XhgJ5vLR84HFUWaKVMSslboZ6s8e1Cpg4kqUDOQ5h", - "q9B12WIb9hqvzpa+SVizqCb0mmTIJBZMp2ZA2gGz2G2eckEhYzI1OPt/+Rc4rjJzhZK4pIWCnGmWZTzD", - "1HRMXgmIJKEPDyVS2CXVDR65Fwfw8OFzrRaY+XtQ2Y4PHx6Fzph+Ze6rB5hcGJPRhZmr8E0kocoMRuAh", - "49Sw19bm77G1n1KXgg4opPb5Vpn+F0xDdsIMMEQzZ25hWbakfLOxccqbtLiCgYed8gqdGcJFSM7UKsvc", - "JyZKu12ER99Bypam1gKfoSSl2nVa+MmbUziAixc/4mo3Ua9PQfSU687Myy13AxbMuJE96FLVUjRsXC4G", - "l3xpYo9mhTnwzr4bYE/zFK0QZ6qPuftMyAStJHpG5YiOXzEEjsJqQ7R+fU4DEgZFBqowKXrhkRYCH9g/", - "gviHlx/ggPp6x33/z1QlBl1o+C+Vc8lyMVyyeVY+UieCsVLWWM3ygad292oXrbgjogx/rH47/vjh9ejF", - "6QVVvVGzaQrPocFFvjbfzW9ZBTX2Un7FM5VTVbn0oTsGC6YxSi+Mz0fdx634aTWfzjJniyHZliUDlO1O", - "d17YsEkmkjjR5+/ff7j4cH58Njp+8fb03ejl2+PTNzF8A62/nh1fXPz0/vxFTGBETlBX+aFU/rE3UToh", - "JAx/p8tbo6R/ErdsfwjHkGEqjJ+L55sxmg9KAqM4a4XO70yKeU5OcqcsgRFy6rT1mMurQXlecUgvrmcX", - "Mz/BwFy8ouc0Ls2xygKJy/+13nkLTVoT2myAybDrN32SighgzCF0esUOdh/P3wRfh0HZL7NlHz1b3tL2", - "V6IiYssuOTCIKQ0gho/nb5yBrdmcUxSZGLjb7YcP2/MB4hXQ7Pjhw2EkT6idiTt68iEFJ3CZejB8zczs", - "zC017M0Fdg9GgvM+SPdDk/ZXExcajYVnSqpC03R9N+EYZpylXB85BRYtkC19hsEsBJlN3rBEex3zcSIp", - "+SIT0mmsWMfG09Dx2O3DeuPkGEgBMH1/OSIZl213Y99Bme7io0PwMABDeF9LtCLnEaesG5p4JGlJ1Fa+", - "vghcwD5MOanoROWeWgfYGbHmBsYtf+k0OOP+cRy86uUzmBdfibexSpfUTfEI4l+jHjnzo94RRD1i497n", - "T2w86n1yB9vgiIGUCLzv2i1GKFm6lwpJzy3L7rUV1GK2jGTZxvbXyDvyafThcOhHcyqOsAgmUGks7lr2", - "yopewhn41O95Rtw76n07PBx+26uBEZWM1t3cg6pR07Qtfv4Tyy4N8a1mC6nYg0w4Fdqg0uzsmSXkXNdx", - "QeGjcQwNuUXNvfzAQFnyOyAkglwkl47dKmIpIY6CaVvo6F/mHCp0UvSOzZhcaV0VmDc1DBM1FOd6i5km", - "5BqyRD6w/NoS6pKQeeGbfyM7CoEF8s0IJU/T3lHvjTD2bWhGVZKV28LHh4crcddVOsaKRTSrduqMhdjc", - "qNKuZvklM556KIcMH+r3vjt81PXRcpYHH7FEy6ksBAD63eG32196pfRYpCmXpPOHbge4E+DIw8+EmoMl", - "NDnvH4M9EmXuduw7SmZTUxVL/ew+2CRMj5s5SEok21YCPfcU6PkZdaDx7/qcbNh78RxjUv/4z/9CfD33", - "/3WEPdIfargMSUAC8V9A6EufLt+HPCsMIgMgkmQMc5aTwz5Dpo6WO2r3D0zAOt2EckqJJYRzCiXMaSQ3", - "45wiX605hpu0+QO3TSDge6TQ5kAtVPqSFM8rvnIuX4dYzzlLPYjq+pS2UWm/lxetRIiwZKYT8HUIrzwM", - "ZUByDKaFtyoiid4Mj+pYwUQ+Q17VjQ7prhfSxA/cOv31heIG3r3/AAEKqI44EkRRRYbB5gLDnV5keSS9", - "QoJ3cA1XaGLRT1XLDD37+KGNAM+KFgLElT5XhIJ097TnUUA/Nd0Xzk749DXJn6aVfmmi7/e+e/x4l2E8", - "uhXmhjavygVbvyCBNM2NGfoKMaEbSrUVfb/QjtFSau8KUNjet4cGfLLGfh8s15RlQ097tu1MwRpsV78O", - "h1VLG848LlFjfcNIBony+PAxiPmcp4JZni2fUlUbWbSNBfk+7laBGqNSRgZcgIAhaVNC/eA//U9WMyxa", - "UnIIp3JACFc1+2Ac4B9XkdHChcTgx4SJjJb1UuuLIuf6Shil3bIjGQrWNR+kWlxxCV4XKwNNe3EirkvX", - "Mym7IX5LPov9thvu4fI9CNy6gHl8dzdsBZi/5Y6dBwZVPvPFbtkTeuNOVooGS6sIDffAlIhzjiicdR5c", - "6bj+qlRhTepV4qAVwupzb3Pl5ffq2Zoi0oQJvEdO3ByoZRfpFzCS5WamvpKy7GdZggp67nHT/S8r7Fu3", - "3WnkH32d/L3t9xpCQJvwM1x/bcvEKVDksNuu3bUKpA8z7h1xhlv0UMdCCozmBD8cmcNmxjT1nVeFHajJ", - "YOwMVIoaSL6gMnhhYJIxLICP2yAbvGfTfQ/Z+5hj2mjT/yfsiuevjUVTqv1Hatd9H+pXNUBAcNlJ+Xp0", - "pyTYahj7IoMvqGwd/tv2N5ySmAmK191aOzuVV8Jyx+8DZX0WDzn4VaSfiOYz3gaif8JMwjCtX5VYDg9M", - "BW3hCDVATwRQIXyYPtiFadRGsC/wjZJgG0TzXYuiiI9/2VP+bvsb75R9pQqZrpwXzRbYTmeF8WLyUxsE", - "LhFuwT6NixK5qdynedf6tXuzGtP9GX2ASWvn3tqZzZXF3Jw66nkLIpVPPaGeQG1nWWFo3RPzWQfp+sKW", - "Xxfz8Qbfb5cs74D5nJAYQlSxilhSlGw34UM+vrlRkTnOxY/umbU7sZJXwrIs9kXCcyERfaFfeqjJYXbJ", - "l2uUG9LQgWeGY9gBQRn2y1fJn5xlyPaQy1HOjBuUgPjKK4mx2V79FpagUFnWlvLx8z3SJ+3bNg3tR778", - "2grafFlhF7n9dwob/kNM6CwbVBRIpltfq/uEHz7MMyak5df24UOIJ0WWjS75MgZ+zRC4FVOoPE3UAkgf", - "Gn4yM1MLU4b7GCQqX4YST4Y4sT5NvhYDisivsFQF6XGG81o6b9QLAeghXFSZCtjOxL9O9EfxPkJDjru1", - "PDrse9XzaIivpOnR4KVe107HyW3VvlvrZMYUQSXzJN1Oui08cKsi5kgSGYyPHlypSx4cxgvp9a9j6QV0", - "7Rkml5G85EunnV2pS5/0kHM9Z25xpV/Y1+0sTbgPlOAwZ/qSp5GkULfPMUEUQB/WYEUqLFjNBAJLIayG", - "vuJpn/L1aok4PjEGM0t8Ym/NI0e1e5U767vDR+2eJzeDkuDvQ1HarnvSJH4vuud5IITdqbItW2drFC7+", - "NepJzlMzKl+NekcIWfoprqKzjfQZH6Nd47kUHkNzm1/nGZPMKr0Ek2jOZSM6C3tRj5lL3+Uv+DVRm80z", - "RRlQ0JZ68xADKlcMR0kpeZ9pG/X2sViUNXLlylSojoDb87Di+/d0rQy1SbyXj3pHUyNds3f055/rZFKH", - "jasOAg+UfA0DXUgojxb2CGCiIZ4LO2uhJHJbDOpAmu2y+z+4FhPMg/De/MrF0gfCGUBDJZZ8Uf8pYLW2", - "ulTiEANwtyDogpQFF8AMMctbmEiSdWarHMNaB5uQUlmuoywPEQRiEUlsELI/hDIQZ1WRzCr9hnitMhxz", - "+doS9lplPA57VoF63ouUbwxyIznfwiDDd/yhfUWh7G2VWoQo+DBqKKlb6Bd9bN1U+76EN+yTjzC+4HZw", - "ggR0BLX01WcUXxEphVaelrmuTyN5web8Qlj+7AKbCjyFM2Znzw5iJ7YrhRbpM2fLTLHUpyJ0UT1ZY5hO", - "38SkrmXCKJ1w/MQqZXs+6+ssmAwXhmHZU2tCDO7R/dAmfvsr2fl+7G4e+ybAmfb6PcpewzlUJNBS9Rkw", - "VInH7AUy6MMKFez3Nqkqn770peoQHC+vvV/aJ3ZX+akThQkDK8vdWW5kaqqKTbFi1JXrQEEDI9Kq/ZhT", - "aR3rF9JYXSSWnhxT1jrmlVHeRSPFHAuDOm/wU3jLrgfHU/7sMO64Bm7Ku/DIQAVlH+bPOMsGq3sp0waf", - "83Pevs+EDLE1wwqZD7OWUru8Q7jZCriJ8F1iwnRwqLXEKCp7XARFREUSy2YnhcY/SHYlpqSOjflMoOnd", - "zrk6tLS3/F6z9fgmPnFSkz53cdrhe3W0dUJi337g9a5yG4+dlKUWUOtQGEeusT52wDF2gHoipQRHMq73", - "w8Pm2rVufV4ri+sN+UqKCG0TImlyZaGQEzYXmWCawl2GykDiqsGel3bOWDX1DoSUWbvegrAro3N5UfW+", - "u79QdUvjv7aAtd/pW/jnGgRz3LippjzBOl3uTDkt/oq2aE65oV/NVL8LLns789uxZSx5nsB8WW0/Indg", - "fWGouoCUX4mEbxaMBOk2QNyN7fd3zi1LmWUoiekyI/pN6oE7nHroNr8PWD9h+hWIuRlG8ix4T0PJhjNb", - "3r38j5fntfpJj1MQKi+eVnnw7luRLF2wWLAVMEfEehVCoxqisc6u+/oDPvSB9uIeb2xtnG23Fh+6nU/9", - "yS7eobLi04QuHG3OdX/YHsvt7PiDgb2SJlZDNE3S6vawUy6WAQbV0RI5lZ50sosR1g5Ztc834jLRy9xi", - "VxVyzBy/vBj8cPIWla6yjoaA2yi4nHNthLHGUxTWeol8xrUblj5e0lCoomissHRw1umwwp0VshnimWG9", - "JFy46xCQ+xz/WMdLj6TTdISBlE+4pjsFDDMLdWia9xTOzh/RKXi5VHi0MbpvkbziesysmGO4Qy67ffw1", - "GrxXR39tnK/k7a+vtPOGEWXfgqF/gYyNu7rKFxatcAwsVFcZ9vx14umA2YHmxm66zV0yZGvk4SyECrBL", - "+VyVXZbC6DDO1LgRyKowv4NLFkUe+my1uy1cBugTzzjSKpt1iHcmVRz7IEZyjO3BcXbuIpZ+ZP+mqb6Y", - "NtEDRh4oI2NUHScknJ0/poGEtIi6x2lSr37szkhZvXj3n5hyw3j+3RBZmaGyJjM2i4g71+o2EuoBS7CZ", - "i9nJYnW3BINmDzDiZbB7mP8Cuc+8N1hPmRTGV8WHNxEFjXMSMuuhCSRfjw3rG9FanoOa0BdYmg6wXG2S", - "qUUwbMr4hPt2qj0lOrFhcp6IiUgiGebnnW+5SC6pzxmSs8A4iKPzwvBJ4YGfMZvrwNO7uzrygS0hhso1", - "UvkcgRldHL99M8i1sjxxV1jpaYg8ezgdwgs5cD8c/Ipm1ycaYL/EQnCbVElV392nasNGQv/pio3vB6Ei", - "Yf8kXeXxEkTaperh/TsOh39LXW+1x1NFUjthoRBH8JO5Dcgrq9bThfO6Lv+OqdpRTQIlG9h7RCbzN3A4", - "HL7Dw9z/cvzHi8b7TYIvmxH/hQi2JBvigF9gBifY/UEqS/hSnkHescJeAzcvT/dKGET0ID5B3Pm3xpZL", - "AKcd6jQJ06nBY/ugdIoNFcbLejMpxyryAttiYzExtNQSNxmtVZCrvHBaeA0On+qLK4iH2G9uXG/K3LBH", - "vX3KJhORCdJfBpGsENzgSvAF7GFFUMV895Ez19DFauuMpOEIJo4SqY8wcmysUB649XspRDAiMOfzMdfU", - "VimSjfkaXwTvjaqZsAbikM9b59QxtRX1SadBrigNcQtbJxhaJt00+kDwM4TPWm3XyFFFjEfhnb/45wC+", - "4IyoFnk0F8jo6dNeBtlljs0y3JgtouieZQx8zB2hPDk89ORI4Vjv0dh7gr3ODaKkPTo83B/CG6YRpKtG", - "DaEdDPYDUNLDGlAAws01khORWa59h3dHgcBg7kR6kPVh/zbKvHMPBL4x/fF9aI2aMMMHQlb9sEwxDljr", - "OB2sHCgyAoQedmQy/rIx7tTvHD2QGNIVIpqgGY1ZxL5Nh1W+VZjhtl8RNlEW9QpjmVEw5thjtDPZ0r93", - "s4mee3bnm5quXKqn4Ju8UbBzIULp/4bxcd6tOZ/en6r09D5SP2+DUU/qy30D1G9SXEpN1s3/v/WU36Ge", - "Ui6zOsjfnp7yFzXenFz+R/dA+yRWrnuJx7d+0Suk8apbZAlnuhlqvH2sNZay43vUgL7+YtmJ/tHhYb83", - "Z9fUA/bJYb0x/aOWRu33mZn+RzXe5kT/oxr/ZlzoY5ZcTrXjIeDoCfZ8zeYBICgNSdW6463W8K7hdavj", - "wHZS5FkF93hvB+DH2HYIAbnrlgdxuP2lU+/4DyyttYiz1si0hokZNr38Uz1s0eZGD3C09+lC92N8Jfd5", - "CbjbfaS3TpUn7/n9yrHjEmbe54gL00CRCxEc7ABnbuOjvyWJnoeuSeShz0sKayHOFn7g8d42ueCPy5qm", - "IbzQikAPy+1BR6YzAqnVi+mD5hPTRyQmmCG2Xj+STKYVooYZwgtOSVHOSOBSFdMZucKpcX0w6eqFnhTw", - "wkRW1NMrFUPYbvd5/cLt6DpHAMqxSpf7v+UyulvTTelxDweJxURZhmcZoK4xjtlRU9dgel0IDJ37f/gF", - "Oc6XDIbc8lR+8I2cykZRS7xDnbKmqTu2jVs9Enbqtfvghprc+n2/CEhSlOlmfHMWLSQB9AbAmODuj+Qe", - "v8a8O8cn3TpNH+bseoTNnIz4K99/6i957R6POVDBr4qkERlF+0oM5JJEu2t971euNsb4SpnAG6g8oDzl", - "t6b232Tx7x3cqjNH6OWdKtHRtjO2boHpAVLHPCTn3+4mbiwmZRDrQmKzLuazbOcsBzWp0AIH3uL1tOYF", - "byT3YvphRH+I90MskByGeJ0TDynLIOWZZUM4Y8ZQvSqSdRxJq2Ah8ootUYstHyMMPGAI7tahT9u75Nou", - "LKK5Puf3l69fDVC7qvd5NesDbk+oVDmXXzI+/2W0ZVmTBH6hwpRKsk/TJtT7qoPTl+UIO9rl1Cdaf5Ts", - "iomspabnfc4lsPUF1zhI2eptBw6SMJlQc677YCE4WauwiGY9V7sq74l/jXo0k4yntbpJMQEWyXCkC2bg", - "UrhH+hBPWGY4PiGdxoLtTvCcKWXh5M0ptYj2xW1CUqraAPGzi5w6jWgELBYW0bSnDJ30BDBEvHmB7kQM", - "uURSFxIylVxintw0dHAN2kQhraBeJY8GM1Vo+PDhTScDOqFdv2+uQMNsTMynTQ9lnqbIfk/qKs2eqIvu", - "+Bob2BMpn+fKbej+Z14RBPW9rxtywWXqRCwCHjqZioarr3Izvs+UqFpNOf5dyuNhJN+SXxOeHHrw4Ryr", - "B7IMg4gPH1bg65JPlaX43cOHRwQ+vgUz3SnEmifc7Sza95+Fkh7JPUTJRlj0HFHRJK/AhJvI6R4zfX8I", - "P/nuDc4wb2CjUzV+28w9UHpLLDuSLajpNOlXbtvCHYlrXdEmoeE6nk1Udh8zndcaP7UdrWULPj1FENzO", - "8rRch9/E1n0Oe7o/hBfk9D5qAZCvhfNoMyvnOe1lO3rLKgfq99rm3xnmuycFyx/aV7GF1qkG2VLrtrid", - "vGaObnAadKz4XyUTe/cCidHfpZar4vgWliD0jnq/Rj38MeodRdShGOv2ndDsRz1iC/ibHjzCPzlGhn+Y", - "MyGHU4V/xBepgX/v6FE/6iGFo30c9Y4eH36K5PpA2IHJD9T6VWrR5L74uPUDoafFTl/oRz18fjR3/37y", - "XfucUiX5Z02oZDr4oDX4x8eHj78fHH43ePyvHx7969HjJ0eHh/9n1Ft9lfaqHBm57ijAr+L2lUOPvK85", - "6h19+92/lg97bZKnI4wfu18P3fpIuu1Ogw020AqeKqhwOdTYEKER5cGeD5DtAxWqlrycCDKSuGQDe1Vr", - "ATLaFOY9C0nFohslCOLn3lKfuF/TIUQFpLIwwUDX+3Oge1T720Fpes6Fwf6LX8l4uN/N8MZHCWqGmVk/", - "nH0ssXLHhVn6FBb3n32Iz7nVy8Gxk5VxKaV9npaHjDLFdMqNo5kFE9g9DhuieGzlWtl47VvNxayFaD+t", - "1AgU47mwq1qUgb05u4Ynh5+v+ElhZnen+bVqDDjEvUpKN8LXFZU0g+3OiUTNKR3x98szCnkp1UL+djjG", - "Ld0NJ3gkK872W3kctgAqIXNhDTcOmnZHJSrhXKSIxpN78RcqrvMZMzzuQ0xSNhUmUVdc8/SgFLgHKHDd", - "M00Bjc3YOHYzTUeeP4Ui7WBrEduTqmVqkWz21SHI+jKR17f2H+lCmhi0WgRwRkyPxHTNeEUz8BOlGazM", - "dQink3oMNJIzZtzEZsJggQTDpAFq50S7jYqLSDNeNVRqYUb3D9/UUFu25F/Q2Qa8F2f4uQXsf5Uy5jfO", - "Ai7pbaV4XBcSBSVixVa9nHXRcUNuFzfbcL+ole99eSoQid/UGi0jsFSB4XGn/Wl1LebMcpCcaW7sQHIx", - "nY1VERqOR7JeR+on/8BAMtNqzueDqap1Fx/CuW+SyzSPpJvSgNKNfLfIqu1tH2Js8RU7VVVYngnsVYS4", - "kYP354MyCziSyIj3+xD7KKF7Z5yx5JLewYZo+IyQ0/0SpEFOCzZ1z2IzLevYwJxrAr6xCjuso9dmqlWR", - "U+Vu1dB6zI2lbwJOF/0y9aa9oe+qOYokwKDMyP/Hf/5XyHL3mjrEh8PvYthLWCbGGt2oE6XhRKX8nMlL", - "PKDBv/9hn77Dr90tFe6t2LfiQFRNdLIQ7isbqysOr99d/EStg1dexPRGR/nubcyP8E9FMkYSGGG7n7nB", - "JGJME6NC4EeQ8kTMWQbYHaiN4Vz4VVPP3ntSgJqDfCUdaHUSG5heg5AwAcW35PUNo794uvA/j2nT0kek", - "D1c8sUpTuq7T05yZjKy8bu9Ecq9mmPi+k86+2WrArCq5qFa4+4F2UGlWe78Imk1uwLb0127TJ5DIHi1m", - "3zPbmujxf9iomtEzBymfYH8HD49zH2YPXYMXtYHu5+5XI3yle1+fQPedf+ulDdS3/p/wmjfTjNTAqkG1", - "YicnKX8PAVk+j3bvOEzTRrXBv38f9Oq+/VXlVH0CO9Crj1PZ2T8/ubqdGWB/1Kqg7DZctsRsMPeduoPF", - "ZyrxRXvUgD2mmxYD1bpjGT+Tvs39RCD23CWiyMWerlC9E/ifvmmvby6L+jGX6SgTksOzZ9QyHP/llWVf", - "joo7JkWec2sAZ7Hw9YNI3cCwLI9oSvOB5gzBbxCXuMjs07Jvsq87nKgsUwsocvIxlnoSbTBgt2OWUuAP", - "P5oKzRPbDjEbiL48lHvq2BgG+Er3uzZ+9/Wu7cI//61GYOSwXh93xbvxedfaZ6Dfrwi68IPck8GEX/+6", - "5lJjCjsIorDt/+z0ShsTWNx4iaoS7JGf46CUTPs3Jd4wwK/bsugv/JP3n2YcRmoLFYSffjdJSiFaoK64", - "JtwEq3InkLBWBf3DZe0Ken3N/n3k228ggVrR3m6YqOUL5BWaMdNIrCxxcvsI95CC0pHMhLzkKSXnlcU7", - "bIp4pybAYWG7GYh6VXVi1INkJnJDuEIBG9XpA+Rq/0sxz4PLvZpWyi0TGX4f/W1tjfLDJATiBeVME6yM", - "rC9vyS3pMZwi6c5sZ7X6FK9VYCS83FbQzPcSYBQjZ5Fs4nKhjyEUuxDYhXGLpJ7/Y84lrsBtYRc8gj/c", - "aqO+wLUsB+vqyv+2Wsrv6IJilWV1B3x3DSUtQ3zEWsLw/V7LHTuNeJ9wwHk8giuujVCyX2/ZX7WPnquU", - "Z/2AK+17Erb1wUUwOZbMsBRmL8b3RpliKU/j/T7Iwp0tIny1VKOSr7x8plYZEDo+l9HDv6ix6YCo/gKd", - "cre2DfGtcn3c6S6why9onw/KnS4b39YzoleY/pg3xfaCj2dKXRqPP3Twq+MjI49euB1IwD9947aJrdbl", - "GWLYl6C3CPsT++8eF3aG9uJ4mTNjHMc/bjaTESaSOdcDrRbIHbHL158Gr4vx4EJMJbOF5oPHT76Pg6t1", - "MRPJDHw770i+fnt8Mrh4ffz4yfchElfHXIVLvqywkpp894GJZOx3ckRAq/EQ3voAPU/BhAmYEC357vDR", - "0xDUj2Ts9zEug9HfHX43hPcSGOGlQpwXZhb7WgMOVrMEA0GayWRGt6/Eg8XO7pgDO+E2meEUY3c/YC/l", - "aZFzgknKnYAcF9rYSKY8E1dcC+5RgjwURZwLOY2h+jVM//HhIZnIUiH5AZ9MUEZRHU4kDbdFTpxDz+mA", - "EEoKN669BxXmAxOOyk+0l9tSXhtHdhWyalW67MOMXw+4TFTKU2/Lz9jjJ98/8/G7YVfKagvB7AQbsf4d", - "2sIBJdFthdz+PJuLpakg38lZDbuGLmALdMyXs7b8AW7qMH/mQZywuXogMVTA77LV/Q4TeeGHLnvdw56/", - "QynpUyWo8SQT05mtpwrcb3DJ0XfFO5oZP18iIemjTzpqcjsQt4cD6eh6cl4WBXgG5JlqSR6h0Ukf8O53", - "SrouvJBbmCSNLqehOQOBlA6BZPFgIVLH+2ZMI5idEWORCVvBZRMiNhjOTV0z9Bk4Trg4OwFrmDr08y+j", - "mDc08k1aTfngbwZaBuHy6pvUShKb8UzKke4V0aQc5SthmlSr3Hiwd4Rr8vtABaeT8aAjixoZ7M5YtmJ/", - "n9fwviv2otWCQLop6a7WQNkqSKhjfCT3VoC4IWMyNR6Fe/8pTAqUFGfnhiC5/YuEKdbHWqN5IYXTE/pl", - "1XXCpdVKpHAy02rO6tlSnQgkzSvyzw7fvZUSuqFCNmzU4Re+yr+37f+B1/q47HAEG22FiqGdvoC9j29O", - "XwwyccnBx13rrVeSJnveL42F23bWKZFJ2sA+7lvorIzylcIwGyk1QH4svjzF/q6kFO1TTXgEp93NBdUa", - "yPQGlTOg5t4/cbiRtqme7pnb9tn/KmwN1dQGyGe9/x+7U053d6yr1WN3Kg3X2LVoVS/RauG0Eu+SjD2e", - "JxUeVB6qSMZJpiT3LqomLCTFdPB3dF4J4/MzgqUUyVAAUTq4VNk2dhW+OldZZiIZb7wHMcaKfIsHP3er", - "GeI+K2yZFckzra5EyiHGdBZ02jkNDafJINfiyt3Nqq8ELiOSMSusGnl71rfWw0oP73PwjVTGBdX/LJ3s", - "Q7DbIleSgkVn59/CQoSuR+57g+Ayx4ypln5KcHx2WsJ+V7XroYckAyX5wMyUhdJ/Wegshm9g1Z8ZSaMQ", - "brzebWPOJHZYLoEkSan1RruQYRZisrYB7jRZZnjoZeUGIXAVo1YaofFI+tcGQk5U5SBmaRp27ts2VfU4", - "TRss5Z4k6+owX9uec3M4CVZbB+MsWc43nnSDy+u/RW4r0z7G/aocU7W+Mbsx7W0i+CAT8nK3oMuX4d5z", - "pi95ig1BKcb+DFGzAK8eVnnYSDJJUKFlJK6K3WHDf6KtGctzLk0fpKKnPD+PZKA6/GnF54eBwzIiGFxo", - "KFhQdKAzdsHd/9aC3TQ/rsGoalmDjF/xDCacgjCR3KMUlj40DOLQSgPViv3AJutR/ZKXVmVGdfhUH0wK", - "8aOJ0vNIRh6ie5io+QH2qcAT/58+dtODPTHkw9IJONFqXtKZ47qFTvh+aayX5Z9+KCEhJkn17IE/gQfx", - "EM64HtTSA6CQ4peCS24MYF9JbFOeloEyrFDCm2GE5fDx3em/f3wZSRbai0yLjGk4TlM4L7uCuBOp4WzW", - "e/+5o63G3gvZGkCEtF+Lcv0b7ij1vhCmyqLAjIwFkxbTN8Zoo9WJjZqTaDWvD3RMhVPVH55j7EcVFnLm", - "G9Z6jeIbgqmQiXLyciHaq4neCHn50g95v2CMLSP9xsXIGzzL/xYXG8WFDPdisMId70pqNOL1N/I4Vqy+", - "pmiH3CMn15SEVJhLQikuC7VrS9Bq4Vj0nAnpmQHp54MihwCH5hg9+igRKm2lk+cQSKXNMlL7Uj5oKJJN", - "gRBJ5A51NRJF0g5OylL52+6oJLXo9+ep9OpJTS/xguTm5uTtVY7+3SWL7H4DDjRHCr0XJap//+kvL6vE", - "jYnmZgYN29hdpJD94f4yhBcruRzYlot0CKvFdMq1IXmIxYCVljagMDZ+0V1bbOirJI8kaWuCYp8B+i7H", - "+4omAzBsP92evoF7v+XGPb7DqgMcz+9ZutlRRDpnGdTfq0X1QxqZ2whKjtn/vd39t5URPvAHX+k58I3X", - "uHOR80zIO5A0B3VjfKf2dBSzz5aDKhEwKPkfz9+Uqi2lO6AnYBjJMyY8rirm73hZUCJ3/+M//wt8cocJ", - "radWHAwIn7HiYdDKMssNiEmLNKTG0wSzgFJP80EwlDtSCxsE7+dz6vbl/pNr3DAbY/N+ixOldCqkW/bv", - "MQJU9yg5avkmHKXjhuSACsSBSWf/dGKugt9ovWir+BloxkqYMGkAcS4XCtzKs4xnYIrxwD0lCNEzkl6X", - "O4KUS8Nhz4NmQKKMkN7sNDnT7reLf3/jjMNXHy6ewPO3j59EEpPuPIzMxJp9sjtLFXfGcXQPWpFhy3mm", - "OUwKw9NIOuPznCfCaeAsg3MmL+FVQfCql8++P6RUxONEK1PmSmNN4d//NhhnHFEhEiZTkSICZ6I0h734", - "73+D//2/YDx//GQk0f7+BvYeDf7+t333Z1wl/j0mtvL3vz07HD7pw1jZGaVaZQbmQg7m7DqS7kGWuUuA", - "YhD3dz8gjGqeMZSQdubEtcrSSO7F1YT+8f/8f4TS8b//FxwOv4v3IcU2I+VKMCEck4VAqkiW1YaY8qwg", - "49fYztFtcsby0LHFH/MQzgrNB7ggx+jkwB126Th1z70LkCkekAD9KUynGYHNRJKNjcoKy52eb5lMeL/h", - "NUHsDSskz5bBKZ5GUminvV8xaUOfRwtSCROcLEQ5YMRcZEwLuyRPPBHMlFkOE3Ed0uHHS1+rSQ4lcGYB", - "tYrwLhS7wOYJdC4WWxgymHPmhPakyGCiGWYqhOfdhpdOGqJMqs8gvFYJ40JkNK5jVQOtxkJiEarOOLsS", - "cnoUSUewg0ekQFMamCn0lXC/Vi0sCCWeySXS9+BxH7hNhv1IJizPiWDKm2AUrilVcyHDxjnSfWDBskvf", - "TTqSJlN2CMfZgi3drK84qiVS1QMjmrsVYIAEnWYpH6tCtrsvSv5aoqHs0JXtl42May7kGy6ndlbvcba1", - "+ZrKR7X+Uq291Bqt1LZ0UtswDB15+yCP64M8PtxhlCanfZUphb0+NVusk/kQTojcxhx75mInc80j6W69", - "I4hAMb7dLYIReVxdOMST1jxzjFnJSHo+/MAAJn86NqBTbHyK3UtgJqYzrn3f8cPht/sYhCqs41nCcNKI", - "cH8c0WZKTsOHBgF4CAx3ykjCzdNIXnKeuwt4iGLVzJS2VK9t4ABYopVczkOld1kEEsk5m0phKZaEPRPc", - "A9jnxMwx17G72WcJVdR+WIf93sRxX9s76k0yxWyvdniPakd3WB4dlYncc6e9lTu1GX4QSyq/OMjO3ehe", - "r5djLVLk29+QcuBLRBkJZOof5wQAOna+hpsBtaYZZ5mdbbVDVkDr1GXU+xRX/mZfPJEw6dtveWXHCV0h", - "4ZETz4mSadVb4Mnhtx4yvPnlQtKMlgSdzJlREn8YDoflmORQe/EccsS8YCIzTqBj/Yvn+fGxpwKk0rJq", - "JexOhz3ymnbjHi8AjbCZ7nEvhQG/E3eNxnSTKZTH4Xnli+dQyNIO3d+Yjv5GXFHIBAunQu55a0VV8yu/", - "9sZO89LuCN1HHUciCmtL2Lhgcz5QWkyFxOItNUi579uNKogjFWf5uC9QEEMY7HftZlLorHfUO8ACfz+r", - "tTIZ3ABS5X0Vmpu2qe4dLWNd4lXtKic8WSYZh72T848v9htvklhff5kKy/s1BKJ+hYtAnfQoB3UFZqPW", - "IJb+vf7pDzPN+QCBOasCwFwrqxJEWQjsJIAjrn/h+OwUUpUUcy4tkmD1VqqS1uX4rn196sR9kKmpKmwf", - "cmbMQunU9xLrl/iNvll16G3tSKFlHmVXMgp5zZlkUz6nmqHwqnum5d1TYwpOsID8Sl1yaoIfugyWfQUR", - "y+/N6cHFix/dGLXv5mLgnmj5dCUdCDSutTex+zDKgkrPbZ7kMJK1wgjwdRFVN//11i3IgAk0keKhfXLE", - "zFUqJstmFTWlS1OBs6NKdGQ+rXvAyXfjNrNfppDU8p7tQg2MJU0IJVuZWJK5R4REXB7+S8GljaSPWZQw", - "nTUzyceVfTUecWa/xzURuL7LflPPuDbY6v0YM5fgA+ldzkheqzesBpsoTR5bov1a2hEucC90q8qW+2Uc", - "3T0a9mEIF9hDK5JcJnqZW54OmB2QvSgYHL+8GPxw8pastzxjTjG+Rjsq2ILAr1lis2UklUy4U4zP3l98", - "IPMVPch1a1RzbHzR2Jxm6+pPP3/6/wMAAP//", + "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", + "XV03fTXH5iCNzWm29/7006f/PwAA//8=", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/server/internal/httpapi/workspacerepos.go b/server/internal/httpapi/workspacerepos.go index d135149..7aeb385 100644 --- a/server/internal/httpapi/workspacerepos.go +++ b/server/internal/httpapi/workspacerepos.go @@ -207,6 +207,34 @@ func (s *Server) AddWorkspaceRepo(w http.ResponseWriter, r *http.Request, id str writeJSON(w, http.StatusCreated, resp) } +// AddStandaloneGitRepo — POST /api/v1/git-repos. +// +// Convenience wrapper around AddWorkspaceRepo: resolves the singleton +// default workspace (created at startup via workspaces.EnsureDefault) +// and proxies to the same clone+index pipeline. Used by the dashboard's +// /projects → Add repo button so users can add a GitHub repo without +// having to think about workspaces first; the resulting project still +// shows up in /projects and can later be linked into any other +// workspace via the existing link flow. +func (s *Server) AddStandaloneGitRepo(w http.ResponseWriter, r *http.Request) { + if s.workspaceReposUnavailable(w) { + return + } + def, err := s.Deps.Workspaces.GetDefault(r.Context()) + if err != nil { + // EnsureDefault should have run at startup. If it somehow + // didn't, retry once here so the endpoint stays usable. + fresh, ensureErr := s.Deps.Workspaces.EnsureDefault(r.Context()) + if ensureErr != nil { + writeError(w, http.StatusInternalServerError, + "could not resolve default workspace: "+ensureErr.Error()) + return + } + def = fresh + } + s.AddWorkspaceRepo(w, r, def.ID) +} + // tryAutoRegisterWebhook calls the GitHub API to register a push hook for // the given repo. Best-effort — failure does NOT roll back the // workspace_repos row; the operator can rerun manually via the diff --git a/server/internal/httpapi/workspacerepos_test.go b/server/internal/httpapi/workspacerepos_test.go index cf137ee..87c2a93 100644 --- a/server/internal/httpapi/workspacerepos_test.go +++ b/server/internal/httpapi/workspacerepos_test.go @@ -218,6 +218,109 @@ func TestRepos_WebhookModeRejectsUnknown(t *testing.T) { } } +// TestStandaloneGitRepo_LandsInDefaultWorkspace covers the +// /api/v1/git-repos shortcut used by the dashboard's /projects → Add +// repo button. The endpoint must resolve (or lazily create) the +// default workspace and run the same clone+enqueue logic as the +// per-workspace endpoint. Critical assertions: the new row points at +// the default workspace, a clone_repo job is enqueued, and the +// resulting project_path matches the canonical shape. +func TestStandaloneGitRepo_LandsInDefaultWorkspace(t *testing.T) { + router, jobsSvc := reposRouter(t) + + rr := doJSON(t, router, http.MethodPost, "/api/v1/git-repos", map[string]any{ + "github_url": "https://github.com/spf13/cobra", + "branch": "main", + }) + if rr.Code != http.StatusCreated { + t.Fatalf("standalone add: %d (%s)", rr.Code, rr.Body.String()) + } + var resp struct { + Repo workspaceRepoPayload `json:"repo"` + } + if err := json.Unmarshal(rr.Body.Bytes(), &resp); err != nil { + t.Fatalf("decode: %v", err) + } + if resp.Repo.WorkspaceID == "" { + t.Fatalf("workspace_id must be populated, got empty payload: %+v", resp.Repo) + } + if resp.Repo.ProjectPath != "github.com/spf13/cobra@main" { + t.Fatalf("unexpected project_path %q", resp.Repo.ProjectPath) + } + if resp.Repo.Status != workspacerepos.StatusPending { + t.Fatalf("expected status=pending, got %q", resp.Repo.Status) + } + + // Pull the default workspace through the service-level GetDefault + // to verify the row actually lives there, not just "some workspace". + rr2 := doJSON(t, router, http.MethodGet, "/api/v1/workspaces", nil) + if rr2.Code != http.StatusOK { + t.Fatalf("list workspaces: %d", rr2.Code) + } + var list struct { + Workspaces []workspacePayload `json:"workspaces"` + } + _ = json.Unmarshal(rr2.Body.Bytes(), &list) + var defaultID string + for _, w := range list.Workspaces { + if w.IsDefault { + defaultID = w.ID + } + } + if defaultID == "" { + t.Fatalf("no default workspace surfaced in list response: %+v", list.Workspaces) + } + if resp.Repo.WorkspaceID != defaultID { + t.Fatalf("standalone repo landed in workspace=%q, want default=%q", + resp.Repo.WorkspaceID, defaultID) + } + + jobList, err := jobsSvc.List(context.Background(), jobs.StatusPending, "clone_repo", 10) + if err != nil { + t.Fatalf("jobs list: %v", err) + } + if len(jobList) != 1 { + t.Fatalf("expected 1 clone_repo job for the standalone add, got %d", len(jobList)) + } +} + +// TestStandaloneGitRepo_DeleteDefaultWorkspaceConflict pins the +// invariant the dashboard relies on: the default workspace cannot be +// removed via the regular delete endpoint, so /projects → Add repo +// always has a home to drop the row into. +func TestStandaloneGitRepo_DeleteDefaultWorkspaceConflict(t *testing.T) { + router, _ := reposRouter(t) + + // Force the default workspace to exist by hitting /git-repos once. + if rr := doJSON(t, router, http.MethodPost, "/api/v1/git-repos", map[string]any{ + "github_url": "https://github.com/a/b", + "branch": "main", + }); rr.Code != http.StatusCreated { + t.Fatalf("seed: %d (%s)", rr.Code, rr.Body.String()) + } + + rr := doJSON(t, router, http.MethodGet, "/api/v1/workspaces", nil) + var list struct { + Workspaces []workspacePayload `json:"workspaces"` + } + _ = json.Unmarshal(rr.Body.Bytes(), &list) + var defaultID string + for _, w := range list.Workspaces { + if w.IsDefault { + defaultID = w.ID + } + } + if defaultID == "" { + t.Fatalf("no default workspace found") + } + + rr = doJSON(t, router, http.MethodDelete, "/api/v1/workspaces/"+defaultID, nil) + if rr.Code != http.StatusConflict { + t.Fatalf("expected 409 on default-workspace delete, got %d (%s)", + rr.Code, rr.Body.String()) + } +} + func TestRepos_BadURLRejected(t *testing.T) { router, _ := reposRouter(t) wsID := createWS(t, router, "platform") diff --git a/server/internal/httpapi/workspaces.go b/server/internal/httpapi/workspaces.go index 3d9d0e3..07b8e9b 100644 --- a/server/internal/httpapi/workspaces.go +++ b/server/internal/httpapi/workspaces.go @@ -17,6 +17,7 @@ type workspacePayload struct { ID string `json:"id"` Name string `json:"name"` Description string `json:"description"` + IsDefault bool `json:"is_default"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } @@ -26,6 +27,7 @@ func workspaceToPayload(w workspaces.Workspace) workspacePayload { ID: w.ID, Name: w.Name, Description: w.Description, + IsDefault: w.IsDefault, CreatedAt: w.CreatedAt, UpdatedAt: w.UpdatedAt, } @@ -141,11 +143,14 @@ func (s *Server) DeleteWorkspace(w http.ResponseWriter, r *http.Request, id stri return } if err := s.Deps.Workspaces.Delete(r.Context(), id); err != nil { - if errors.Is(err, workspaces.ErrNotFound) { + switch { + case errors.Is(err, workspaces.ErrNotFound): writeError(w, http.StatusNotFound, "workspace not found") - return + case errors.Is(err, workspaces.ErrDefaultProtected): + writeError(w, http.StatusConflict, err.Error()) + default: + writeError(w, http.StatusInternalServerError, "could not delete workspace") } - writeError(w, http.StatusInternalServerError, "could not delete workspace") return } w.WriteHeader(http.StatusNoContent) diff --git a/server/internal/workspaces/workspaces.go b/server/internal/workspaces/workspaces.go index efb7cf7..80c0c9e 100644 --- a/server/internal/workspaces/workspaces.go +++ b/server/internal/workspaces/workspaces.go @@ -23,9 +23,10 @@ import ( // Errors. ErrNotFound is the not-found sentinel used by handlers; ErrNameTaken // surfaces UNIQUE-name collisions so handlers can return 409 instead of 500. var ( - ErrNotFound = errors.New("workspace not found") - ErrNameTaken = errors.New("workspace name already in use") - ErrNameEmpty = errors.New("workspace name is required") + ErrNotFound = errors.New("workspace not found") + ErrNameTaken = errors.New("workspace name already in use") + ErrNameEmpty = errors.New("workspace name is required") + ErrDefaultProtected = errors.New("the default workspace cannot be deleted — rename it instead if you want a different label") ) // Workspace is the metadata view. Pointers are NOT used for description @@ -35,6 +36,12 @@ type Workspace struct { ID string Name string Description string + // IsDefault marks the singleton workspace that owns repos added via + // the standalone /git-repos endpoint. Exactly one row should carry + // it (enforced by a partial UNIQUE index on the DB side). The + // operator can rename this workspace freely; the flag is the source + // of truth for "which workspace receives standalone Add repo". + IsDefault bool CreatedAt time.Time UpdatedAt time.Time } @@ -75,15 +82,70 @@ func (s *Service) Create(ctx context.Context, name, description string) (Workspa // GetByID returns one workspace. ErrNotFound when absent. func (s *Service) GetByID(ctx context.Context, id string) (Workspace, error) { row := s.DB.QueryRowContext(ctx, - `SELECT id, name, description, created_at, updated_at + `SELECT id, name, description, is_default, created_at, updated_at FROM workspaces WHERE id = ?`, id) return scanRow(row) } +// GetDefault returns the singleton default workspace (the one with +// is_default=1). ErrNotFound when EnsureDefault has not yet run on +// this database — handlers should call EnsureDefault on startup or +// fall back to it on first /git-repos hit. +func (s *Service) GetDefault(ctx context.Context) (Workspace, error) { + row := s.DB.QueryRowContext(ctx, + `SELECT id, name, description, is_default, created_at, updated_at + FROM workspaces WHERE is_default = 1 LIMIT 1`) + return scanRow(row) +} + +// EnsureDefault creates the singleton default workspace if it does +// not already exist, otherwise returns the existing one. Idempotent +// — safe to call from server startup on every boot. Name collisions +// with operator-created workspaces named "Personal" are resolved by +// appending a numeric suffix; the operator can rename the workspace +// later through the regular Update flow. +func (s *Service) EnsureDefault(ctx context.Context) (Workspace, error) { + if existing, err := s.GetDefault(ctx); err == nil { + return existing, nil + } else if !errors.Is(err, ErrNotFound) { + return Workspace{}, err + } + + // Pick a non-colliding name. The vast majority of installs end at + // "Personal" on the first try; the loop handles the (rare) case + // where an operator already has a manually-created workspace named + // "Personal" — we don't want to steal it. + base := "Personal" + name := base + for attempt := 1; attempt < 50; attempt++ { + id := uuid.NewString() + now := time.Now().UTC().Format(time.RFC3339Nano) + _, err := s.DB.ExecContext(ctx, + `INSERT INTO workspaces (id, name, description, is_default, created_at, updated_at) + VALUES (?, ?, ?, 1, ?, ?)`, + id, name, nullableString("Standalone projects added from the Projects page."), now, now, + ) + if err == nil { + return s.GetByID(ctx, id) + } + if !isUniqueConstraintViolation(err) { + return Workspace{}, fmt.Errorf("insert default workspace: %w", err) + } + // UNIQUE could be on the name (collision) or on is_default + // (another goroutine raced us). If a default exists now, + // return it; otherwise bump the name suffix and retry. + if existing, ferr := s.GetDefault(ctx); ferr == nil { + return existing, nil + } + name = fmt.Sprintf("%s (%d)", base, attempt+1) + } + return Workspace{}, fmt.Errorf("could not allocate a unique name for the default workspace after 50 attempts") +} + // List returns every workspace, newest first. func (s *Service) List(ctx context.Context) ([]Workspace, error) { rows, err := s.DB.QueryContext(ctx, - `SELECT id, name, description, created_at, updated_at + `SELECT id, name, description, is_default, created_at, updated_at FROM workspaces ORDER BY created_at DESC`) if err != nil { return nil, fmt.Errorf("list workspaces: %w", err) @@ -127,7 +189,15 @@ func (s *Service) Update(ctx context.Context, id string, name *string, descripti // Delete removes a workspace. Idempotent — deleting an absent workspace // returns ErrNotFound so the handler can choose between 404 and 204. +// The default workspace is protected: removing it would orphan the +// /git-repos endpoint until the next boot's EnsureDefault. Callers get +// ErrDefaultProtected and decide how to surface it (typically 409). func (s *Service) Delete(ctx context.Context, id string) error { + if w, err := s.GetByID(ctx, id); err == nil && w.IsDefault { + return ErrDefaultProtected + } else if err != nil && !errors.Is(err, ErrNotFound) { + return err + } res, err := s.DB.ExecContext(ctx, `DELETE FROM workspaces WHERE id = ?`, id) if err != nil { return fmt.Errorf("delete workspace: %w", err) @@ -146,12 +216,13 @@ func (s *Service) Delete(ctx context.Context, id string) error { func scanRow(r interface{ Scan(dest ...any) error }) (Workspace, error) { var ( - w Workspace - description sql.NullString - createdAt string - updatedAt string + w Workspace + description sql.NullString + isDefault int + createdAt string + updatedAt string ) - err := r.Scan(&w.ID, &w.Name, &description, &createdAt, &updatedAt) + err := r.Scan(&w.ID, &w.Name, &description, &isDefault, &createdAt, &updatedAt) if err != nil { if errors.Is(err, sql.ErrNoRows) { return Workspace{}, ErrNotFound @@ -159,6 +230,7 @@ func scanRow(r interface{ Scan(dest ...any) error }) (Workspace, error) { return Workspace{}, fmt.Errorf("scan workspace: %w", err) } w.Description = description.String + w.IsDefault = isDefault == 1 w.CreatedAt, _ = time.Parse(time.RFC3339Nano, createdAt) w.UpdatedAt, _ = time.Parse(time.RFC3339Nano, updatedAt) return w, nil diff --git a/server/internal/workspaces/workspaces_test.go b/server/internal/workspaces/workspaces_test.go index f6b17a0..f1fb71c 100644 --- a/server/internal/workspaces/workspaces_test.go +++ b/server/internal/workspaces/workspaces_test.go @@ -119,3 +119,121 @@ func TestDelete(t *testing.T) { t.Fatalf("second delete should be ErrNotFound, got %v", err) } } + +// TestEnsureDefault_CreatesOnFirstCall verifies the bootstrap path: +// a fresh DB has no default workspace; EnsureDefault must create the +// singleton row and stamp it with IsDefault=true. +func TestEnsureDefault_CreatesOnFirstCall(t *testing.T) { + svc := mustOpen(t) + ctx := context.Background() + + // Sanity: GetDefault returns ErrNotFound before EnsureDefault runs. + if _, err := svc.GetDefault(ctx); !errors.Is(err, ErrNotFound) { + t.Fatalf("expected ErrNotFound before EnsureDefault, got %v", err) + } + + def, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("EnsureDefault: %v", err) + } + if !def.IsDefault { + t.Fatalf("expected IsDefault=true, got %+v", def) + } + if def.Name != "Personal" { + t.Fatalf("expected name=Personal, got %q", def.Name) + } +} + +// TestEnsureDefault_Idempotent verifies a second call returns the +// existing row without inserting a duplicate. The partial UNIQUE index +// on is_default would catch a regression here. +func TestEnsureDefault_Idempotent(t *testing.T) { + svc := mustOpen(t) + ctx := context.Background() + + first, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("first EnsureDefault: %v", err) + } + second, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("second EnsureDefault: %v", err) + } + if first.ID != second.ID { + t.Fatalf("EnsureDefault should be idempotent — got %q then %q", first.ID, second.ID) + } + + // And only one row total should be flagged as default. + list, err := svc.List(ctx) + if err != nil { + t.Fatalf("List: %v", err) + } + var defaults int + for _, w := range list { + if w.IsDefault { + defaults++ + } + } + if defaults != 1 { + t.Fatalf("expected exactly one default workspace, got %d", defaults) + } +} + +// TestEnsureDefault_AvoidsNameCollision verifies the loop that bumps +// the name suffix when an operator-created workspace already occupies +// the natural "Personal" name. The default workspace lands at +// "Personal (2)" without stealing the existing row's identity. +func TestEnsureDefault_AvoidsNameCollision(t *testing.T) { + svc := mustOpen(t) + ctx := context.Background() + + existing, err := svc.Create(ctx, "Personal", "operator's own workspace") + if err != nil { + t.Fatalf("seed: %v", err) + } + def, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("EnsureDefault: %v", err) + } + if def.ID == existing.ID { + t.Fatalf("EnsureDefault stole the operator's workspace — got %+v", def) + } + if def.Name == existing.Name { + t.Fatalf("default workspace should have a distinct name, got %q", def.Name) + } + if !def.IsDefault { + t.Fatalf("default flag missing on the freshly-allocated row") + } + // The pre-existing row is unchanged. + again, err := svc.GetByID(ctx, existing.ID) + if err != nil { + t.Fatalf("re-get: %v", err) + } + if again.IsDefault { + t.Fatalf("pre-existing row must not be flagged as default, got %+v", again) + } +} + +// TestDelete_DefaultProtected guards the bootstrap invariant: even if +// /git-repos is unused, the default workspace must survive operator +// deletes. The error type lets the HTTP layer map this to 409. +func TestDelete_DefaultProtected(t *testing.T) { + svc := mustOpen(t) + ctx := context.Background() + + def, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("EnsureDefault: %v", err) + } + if err := svc.Delete(ctx, def.ID); !errors.Is(err, ErrDefaultProtected) { + t.Fatalf("expected ErrDefaultProtected, got %v", err) + } + // Sanity: regular workspaces remain deletable. + other, err := svc.Create(ctx, "platform", "") + if err != nil { + t.Fatalf("seed: %v", err) + } + if err := svc.Delete(ctx, other.ID); err != nil { + t.Fatalf("Delete on non-default workspace failed: %v", err) + } +}