diff --git a/apps/backend/prisma/complex.prisma b/apps/backend/prisma/complex.prisma index 70ead3d..cb9a087 100644 --- a/apps/backend/prisma/complex.prisma +++ b/apps/backend/prisma/complex.prisma @@ -12,6 +12,7 @@ model Complex { updatedAt DateTime @updatedAt @map("updated_at") plan Plan? @relation(fields: [planCode], references: [code]) users ComplexUser[] + invitations ComplexInvitation[] courts Court[] @@index([planCode]) @@ -36,3 +37,20 @@ model ComplexUser { @@index([userId]) @@map("complex_users") } + +model ComplexInvitation { + id String @id @db.Uuid + complexId String @map("complex_id") @db.Uuid + email String @db.VarChar(255) + tokenHash String @unique @map("token_hash") + expiresAt DateTime @map("expires_at") + acceptedAt DateTime? @map("accepted_at") + revokedAt DateTime? @map("revoked_at") + createdAt DateTime @default(now()) @map("created_at") + updatedAt DateTime @updatedAt @map("updated_at") + complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade) + + @@index([complexId, email]) + @@index([email]) + @@map("complex_invitations") +} diff --git a/apps/backend/prisma/migrations/20260422120000_add_complex_invitations/migration.sql b/apps/backend/prisma/migrations/20260422120000_add_complex_invitations/migration.sql new file mode 100644 index 0000000..2f48b3c --- /dev/null +++ b/apps/backend/prisma/migrations/20260422120000_add_complex_invitations/migration.sql @@ -0,0 +1,26 @@ +-- CreateTable +CREATE TABLE "complex_invitations" ( + "id" UUID NOT NULL, + "complex_id" UUID NOT NULL, + "email" VARCHAR(255) NOT NULL, + "token_hash" TEXT NOT NULL, + "expires_at" TIMESTAMP(3) NOT NULL, + "accepted_at" TIMESTAMP(3), + "revoked_at" TIMESTAMP(3), + "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updated_at" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "complex_invitations_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "complex_invitations_token_hash_key" ON "complex_invitations"("token_hash"); + +-- CreateIndex +CREATE INDEX "complex_invitations_complex_id_email_idx" ON "complex_invitations"("complex_id", "email"); + +-- CreateIndex +CREATE INDEX "complex_invitations_email_idx" ON "complex_invitations"("email"); + +-- AddForeignKey +ALTER TABLE "complex_invitations" ADD CONSTRAINT "complex_invitations_complex_id_fkey" FOREIGN KEY ("complex_id") REFERENCES "complexes"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/backend/src/generated/prisma/browser.ts b/apps/backend/src/generated/prisma/browser.ts index b662900..f271e6a 100644 --- a/apps/backend/src/generated/prisma/browser.ts +++ b/apps/backend/src/generated/prisma/browser.ts @@ -47,6 +47,11 @@ export type Complex = Prisma.ComplexModel * */ export type ComplexUser = Prisma.ComplexUserModel +/** + * Model ComplexInvitation + * + */ +export type ComplexInvitation = Prisma.ComplexInvitationModel /** * Model Sport * diff --git a/apps/backend/src/generated/prisma/client.ts b/apps/backend/src/generated/prisma/client.ts index d74e463..7794009 100644 --- a/apps/backend/src/generated/prisma/client.ts +++ b/apps/backend/src/generated/prisma/client.ts @@ -71,6 +71,11 @@ export type Complex = Prisma.ComplexModel * */ export type ComplexUser = Prisma.ComplexUserModel +/** + * Model ComplexInvitation + * + */ +export type ComplexInvitation = Prisma.ComplexInvitationModel /** * Model Sport * diff --git a/apps/backend/src/generated/prisma/internal/class.ts b/apps/backend/src/generated/prisma/internal/class.ts index cedd782..fb4c6a8 100644 --- a/apps/backend/src/generated/prisma/internal/class.ts +++ b/apps/backend/src/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.6.0", "engineVersion": "75cbdc1eb7150937890ad5465d861175c6624711", "activeProvider": "postgresql", - "inlineSchema": "model User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n role String @default(\"member\")\n complexes ComplexUser[]\n\n @@unique([email])\n @@map(\"users\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"sessions\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"accounts\")\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Complex {\n id String @id @db.Uuid\n complexName String @map(\"complex_name\")\n physicalAddress String? @map(\"physical_address\") @db.VarChar(200)\n city String? @map(\"city\") @db.VarChar(100)\n state String? @map(\"state\") @db.VarChar(100)\n country String? @map(\"country\") @db.VarChar(100)\n complexSlug String @unique @map(\"complex_slug\")\n adminEmail String @map(\"admin_email\")\n planCode String? @map(\"plan_code\") @db.VarChar(10)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n plan Plan? @relation(fields: [planCode], references: [code])\n users ComplexUser[]\n courts Court[]\n\n @@index([planCode])\n @@index([complexSlug])\n @@map(\"complexes\")\n}\n\nenum ComplexUserRole {\n ADMIN\n EMPLOYEE\n}\n\nmodel ComplexUser {\n complexId String @map(\"complex_id\") @db.Uuid\n userId String @map(\"user_id\")\n role ComplexUserRole @default(ADMIN)\n createdAt DateTime @default(now()) @map(\"created_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([complexId, userId])\n @@index([userId])\n @@map(\"complex_users\")\n}\n\nenum DayOfWeek {\n MONDAY\n TUESDAY\n WEDNESDAY\n THURSDAY\n FRIDAY\n SATURDAY\n SUNDAY\n}\n\nenum CourtBookingStatus {\n CONFIRMED\n CANCELLED\n COMPLETED\n}\n\nmodel Sport {\n id String @id @db.Uuid\n name String @unique\n slug String @unique\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n courts Court[]\n\n @@map(\"sports\")\n}\n\nmodel Court {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n sportId String @map(\"sport_id\") @db.Uuid\n name String\n slotDurationMinutes Int @map(\"slot_duration_minutes\")\n basePrice Decimal @map(\"base_price\") @db.Decimal(19, 2)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n sport Sport @relation(fields: [sportId], references: [id])\n availabilities CourtAvailability[]\n priceRules CourtPriceRule[]\n bookings CourtBooking[]\n\n @@index([complexId])\n @@index([sportId])\n @@map(\"courts\")\n}\n\nmodel CourtAvailability {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek @map(\"day_of_week\")\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n createdAt DateTime @default(now()) @map(\"created_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, dayOfWeek])\n @@map(\"court_availabilities\")\n}\n\nmodel CourtPriceRule {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek? @map(\"day_of_week\")\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n price Decimal @db.Decimal(19, 2)\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, isActive])\n @@map(\"court_price_rules\")\n}\n\nmodel CourtBooking {\n id String @id @db.Uuid\n bookingCode String @unique @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n status CourtBookingStatus @default(CONFIRMED)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@unique([courtId, bookingDate, startTime])\n @@index([courtId, bookingDate])\n @@index([bookingDate])\n @@map(\"court_bookings\")\n}\n\nmodel OnboardingRequest {\n id String @id @db.Uuid\n fullName String @map(\"full_name\")\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n emailVerifiedAt DateTime? @map(\"email_verified_at\")\n completedAt DateTime? @map(\"completed_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"onboarding_requests\")\n}\n\nmodel PasswordResetRequest {\n id String @id @db.Uuid\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n usedAt DateTime? @map(\"used_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"password_reset_requests\")\n}\n\nmodel Plan {\n code String @id @db.VarChar(10)\n name String @db.VarChar(30)\n price Decimal @db.Decimal(19, 2)\n rules Json\n lastUpdatedAt DateTime @default(now()) @map(\"last_updated_at\")\n complexes Complex[]\n\n @@map(\"plans\")\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// User model is defined in auth.prisma (Better Auth schema).\n", + "inlineSchema": "model User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n sessions Session[]\n accounts Account[]\n role String @default(\"member\")\n complexes ComplexUser[]\n\n @@unique([email])\n @@map(\"users\")\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"sessions\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"accounts\")\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Complex {\n id String @id @db.Uuid\n complexName String @map(\"complex_name\")\n physicalAddress String? @map(\"physical_address\") @db.VarChar(200)\n city String? @map(\"city\") @db.VarChar(100)\n state String? @map(\"state\") @db.VarChar(100)\n country String? @map(\"country\") @db.VarChar(100)\n complexSlug String @unique @map(\"complex_slug\")\n adminEmail String @map(\"admin_email\")\n planCode String? @map(\"plan_code\") @db.VarChar(10)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n plan Plan? @relation(fields: [planCode], references: [code])\n users ComplexUser[]\n invitations ComplexInvitation[]\n courts Court[]\n\n @@index([planCode])\n @@index([complexSlug])\n @@map(\"complexes\")\n}\n\nenum ComplexUserRole {\n ADMIN\n EMPLOYEE\n}\n\nmodel ComplexUser {\n complexId String @map(\"complex_id\") @db.Uuid\n userId String @map(\"user_id\")\n role ComplexUserRole @default(ADMIN)\n createdAt DateTime @default(now()) @map(\"created_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@id([complexId, userId])\n @@index([userId])\n @@map(\"complex_users\")\n}\n\nmodel ComplexInvitation {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n email String @db.VarChar(255)\n tokenHash String @unique @map(\"token_hash\")\n expiresAt DateTime @map(\"expires_at\")\n acceptedAt DateTime? @map(\"accepted_at\")\n revokedAt DateTime? @map(\"revoked_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n\n @@index([complexId, email])\n @@index([email])\n @@map(\"complex_invitations\")\n}\n\nenum DayOfWeek {\n MONDAY\n TUESDAY\n WEDNESDAY\n THURSDAY\n FRIDAY\n SATURDAY\n SUNDAY\n}\n\nenum CourtBookingStatus {\n CONFIRMED\n CANCELLED\n COMPLETED\n}\n\nmodel Sport {\n id String @id @db.Uuid\n name String @unique\n slug String @unique\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n courts Court[]\n\n @@map(\"sports\")\n}\n\nmodel Court {\n id String @id @db.Uuid\n complexId String @map(\"complex_id\") @db.Uuid\n sportId String @map(\"sport_id\") @db.Uuid\n name String\n slotDurationMinutes Int @map(\"slot_duration_minutes\")\n basePrice Decimal @map(\"base_price\") @db.Decimal(19, 2)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n complex Complex @relation(fields: [complexId], references: [id], onDelete: Cascade)\n sport Sport @relation(fields: [sportId], references: [id])\n availabilities CourtAvailability[]\n priceRules CourtPriceRule[]\n bookings CourtBooking[]\n\n @@index([complexId])\n @@index([sportId])\n @@map(\"courts\")\n}\n\nmodel CourtAvailability {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek @map(\"day_of_week\")\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n createdAt DateTime @default(now()) @map(\"created_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, dayOfWeek])\n @@map(\"court_availabilities\")\n}\n\nmodel CourtPriceRule {\n id String @id @db.Uuid\n courtId String @map(\"court_id\") @db.Uuid\n dayOfWeek DayOfWeek? @map(\"day_of_week\")\n startTime String? @map(\"start_time\") @db.VarChar(5)\n endTime String? @map(\"end_time\") @db.VarChar(5)\n price Decimal @db.Decimal(19, 2)\n isActive Boolean @default(true) @map(\"is_active\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@index([courtId, isActive])\n @@map(\"court_price_rules\")\n}\n\nmodel CourtBooking {\n id String @id @db.Uuid\n bookingCode String @unique @map(\"booking_code\") @db.VarChar(8)\n courtId String @map(\"court_id\") @db.Uuid\n bookingDate DateTime @map(\"booking_date\") @db.Date\n startTime String @map(\"start_time\") @db.VarChar(5)\n endTime String @map(\"end_time\") @db.VarChar(5)\n customerName String @map(\"customer_name\") @db.VarChar(120)\n customerPhone String @map(\"customer_phone\") @db.VarChar(30)\n status CourtBookingStatus @default(CONFIRMED)\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n court Court @relation(fields: [courtId], references: [id], onDelete: Cascade)\n\n @@unique([courtId, bookingDate, startTime])\n @@index([courtId, bookingDate])\n @@index([bookingDate])\n @@map(\"court_bookings\")\n}\n\nmodel OnboardingRequest {\n id String @id @db.Uuid\n fullName String @map(\"full_name\")\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n emailVerifiedAt DateTime? @map(\"email_verified_at\")\n completedAt DateTime? @map(\"completed_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"onboarding_requests\")\n}\n\nmodel PasswordResetRequest {\n id String @id @db.Uuid\n email String\n otpHash String @map(\"otp_hash\")\n otpExpiresAt DateTime @map(\"otp_expires_at\")\n otpAttempts Int @default(0) @map(\"otp_attempts\")\n otpLastSentAt DateTime @map(\"otp_last_sent_at\")\n otpResendCount Int @default(0) @map(\"otp_resend_count\")\n usedAt DateTime? @map(\"used_at\")\n createdAt DateTime @default(now()) @map(\"created_at\")\n updatedAt DateTime @updatedAt @map(\"updated_at\")\n\n @@index([email])\n @@index([otpExpiresAt])\n @@map(\"password_reset_requests\")\n}\n\nmodel Plan {\n code String @id @db.VarChar(10)\n name String @db.VarChar(30)\n price Decimal @db.Decimal(19, 2)\n rules Json\n lastUpdatedAt DateTime @default(now()) @map(\"last_updated_at\")\n complexes Complex[]\n\n @@map(\"plans\")\n}\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\n// User model is defined in auth.prisma (Better Auth schema).\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"users\"},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"sessions\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"accounts\"},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Complex\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_name\"},{\"name\":\"physicalAddress\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"physical_address\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"city\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"state\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"country\"},{\"name\":\"complexSlug\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_slug\"},{\"name\":\"adminEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"admin_email\"},{\"name\":\"planCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"plan_code\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"plan\",\"kind\":\"object\",\"type\":\"Plan\",\"relationName\":\"ComplexToPlan\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"ComplexToCourt\"}],\"dbName\":\"complexes\"},\"ComplexUser\":{\"fields\":[{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"user_id\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ComplexUserRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"complex_users\"},\"Sport\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToSport\"}],\"dbName\":\"sports\"},\"Court\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"sportId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"sport_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slotDurationMinutes\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"slot_duration_minutes\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\",\"dbName\":\"base_price\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToCourt\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"CourtToSport\"},{\"name\":\"availabilities\",\"kind\":\"object\",\"type\":\"CourtAvailability\",\"relationName\":\"CourtToCourtAvailability\"},{\"name\":\"priceRules\",\"kind\":\"object\",\"type\":\"CourtPriceRule\",\"relationName\":\"CourtToCourtPriceRule\"},{\"name\":\"bookings\",\"kind\":\"object\",\"type\":\"CourtBooking\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"courts\"},\"CourtAvailability\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtAvailability\"}],\"dbName\":\"court_availabilities\"},\"CourtPriceRule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtPriceRule\"}],\"dbName\":\"court_price_rules\"},\"CourtBooking\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"court_bookings\"},\"OnboardingRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fullName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"full_name\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"emailVerifiedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"email_verified_at\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"completed_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"onboarding_requests\"},\"PasswordResetRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"usedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"used_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"password_reset_requests\"},\"Plan\":{\"fields\":[{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"rules\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"lastUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"last_updated_at\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToPlan\"}],\"dbName\":\"plans\"}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"role\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"users\"},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"sessions\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"accounts\"},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Complex\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_name\"},{\"name\":\"physicalAddress\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"physical_address\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"city\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"state\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"country\"},{\"name\":\"complexSlug\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_slug\"},{\"name\":\"adminEmail\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"admin_email\"},{\"name\":\"planCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"plan_code\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"plan\",\"kind\":\"object\",\"type\":\"Plan\",\"relationName\":\"ComplexToPlan\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"ComplexUser\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"invitations\",\"kind\":\"object\",\"type\":\"ComplexInvitation\",\"relationName\":\"ComplexToComplexInvitation\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"ComplexToCourt\"}],\"dbName\":\"complexes\"},\"ComplexUser\":{\"fields\":[{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"user_id\"},{\"name\":\"role\",\"kind\":\"enum\",\"type\":\"ComplexUserRole\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexUser\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ComplexUserToUser\"}],\"dbName\":\"complex_users\"},\"ComplexInvitation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"tokenHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"token_hash\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"expires_at\"},{\"name\":\"acceptedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"accepted_at\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"revoked_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToComplexInvitation\"}],\"dbName\":\"complex_invitations\"},\"Sport\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slug\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"courts\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToSport\"}],\"dbName\":\"sports\"},\"Court\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"complexId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"complex_id\"},{\"name\":\"sportId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"sport_id\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"slotDurationMinutes\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"slot_duration_minutes\"},{\"name\":\"basePrice\",\"kind\":\"scalar\",\"type\":\"Decimal\",\"dbName\":\"base_price\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"complex\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToCourt\"},{\"name\":\"sport\",\"kind\":\"object\",\"type\":\"Sport\",\"relationName\":\"CourtToSport\"},{\"name\":\"availabilities\",\"kind\":\"object\",\"type\":\"CourtAvailability\",\"relationName\":\"CourtToCourtAvailability\"},{\"name\":\"priceRules\",\"kind\":\"object\",\"type\":\"CourtPriceRule\",\"relationName\":\"CourtToCourtPriceRule\"},{\"name\":\"bookings\",\"kind\":\"object\",\"type\":\"CourtBooking\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"courts\"},\"CourtAvailability\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtAvailability\"}],\"dbName\":\"court_availabilities\"},\"CourtPriceRule\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"dayOfWeek\",\"kind\":\"enum\",\"type\":\"DayOfWeek\",\"dbName\":\"day_of_week\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"isActive\",\"kind\":\"scalar\",\"type\":\"Boolean\",\"dbName\":\"is_active\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtPriceRule\"}],\"dbName\":\"court_price_rules\"},\"CourtBooking\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"bookingCode\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"booking_code\"},{\"name\":\"courtId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"court_id\"},{\"name\":\"bookingDate\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"booking_date\"},{\"name\":\"startTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"start_time\"},{\"name\":\"endTime\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"end_time\"},{\"name\":\"customerName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_name\"},{\"name\":\"customerPhone\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"customer_phone\"},{\"name\":\"status\",\"kind\":\"enum\",\"type\":\"CourtBookingStatus\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"},{\"name\":\"court\",\"kind\":\"object\",\"type\":\"Court\",\"relationName\":\"CourtToCourtBooking\"}],\"dbName\":\"court_bookings\"},\"OnboardingRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"fullName\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"full_name\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"emailVerifiedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"email_verified_at\"},{\"name\":\"completedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"completed_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"onboarding_requests\"},\"PasswordResetRequest\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"otpHash\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"otp_hash\"},{\"name\":\"otpExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_expires_at\"},{\"name\":\"otpAttempts\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_attempts\"},{\"name\":\"otpLastSentAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"otp_last_sent_at\"},{\"name\":\"otpResendCount\",\"kind\":\"scalar\",\"type\":\"Int\",\"dbName\":\"otp_resend_count\"},{\"name\":\"usedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"used_at\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"created_at\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"updated_at\"}],\"dbName\":\"password_reset_requests\"},\"Plan\":{\"fields\":[{\"name\":\"code\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"price\",\"kind\":\"scalar\",\"type\":\"Decimal\"},{\"name\":\"rules\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"lastUpdatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\",\"dbName\":\"last_updated_at\"},{\"name\":\"complexes\",\"kind\":\"object\",\"type\":\"Complex\",\"relationName\":\"ComplexToPlan\"}],\"dbName\":\"plans\"}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"sessions\",\"accounts\",\"complexes\",\"_count\",\"plan\",\"users\",\"complex\",\"courts\",\"sport\",\"court\",\"availabilities\",\"priceRules\",\"bookings\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Complex.findUnique\",\"Complex.findUniqueOrThrow\",\"Complex.findFirst\",\"Complex.findFirstOrThrow\",\"Complex.findMany\",\"Complex.createOne\",\"Complex.createMany\",\"Complex.createManyAndReturn\",\"Complex.updateOne\",\"Complex.updateMany\",\"Complex.updateManyAndReturn\",\"Complex.upsertOne\",\"Complex.deleteOne\",\"Complex.deleteMany\",\"Complex.groupBy\",\"Complex.aggregate\",\"ComplexUser.findUnique\",\"ComplexUser.findUniqueOrThrow\",\"ComplexUser.findFirst\",\"ComplexUser.findFirstOrThrow\",\"ComplexUser.findMany\",\"ComplexUser.createOne\",\"ComplexUser.createMany\",\"ComplexUser.createManyAndReturn\",\"ComplexUser.updateOne\",\"ComplexUser.updateMany\",\"ComplexUser.updateManyAndReturn\",\"ComplexUser.upsertOne\",\"ComplexUser.deleteOne\",\"ComplexUser.deleteMany\",\"ComplexUser.groupBy\",\"ComplexUser.aggregate\",\"Sport.findUnique\",\"Sport.findUniqueOrThrow\",\"Sport.findFirst\",\"Sport.findFirstOrThrow\",\"Sport.findMany\",\"Sport.createOne\",\"Sport.createMany\",\"Sport.createManyAndReturn\",\"Sport.updateOne\",\"Sport.updateMany\",\"Sport.updateManyAndReturn\",\"Sport.upsertOne\",\"Sport.deleteOne\",\"Sport.deleteMany\",\"Sport.groupBy\",\"Sport.aggregate\",\"Court.findUnique\",\"Court.findUniqueOrThrow\",\"Court.findFirst\",\"Court.findFirstOrThrow\",\"Court.findMany\",\"Court.createOne\",\"Court.createMany\",\"Court.createManyAndReturn\",\"Court.updateOne\",\"Court.updateMany\",\"Court.updateManyAndReturn\",\"Court.upsertOne\",\"Court.deleteOne\",\"Court.deleteMany\",\"_avg\",\"_sum\",\"Court.groupBy\",\"Court.aggregate\",\"CourtAvailability.findUnique\",\"CourtAvailability.findUniqueOrThrow\",\"CourtAvailability.findFirst\",\"CourtAvailability.findFirstOrThrow\",\"CourtAvailability.findMany\",\"CourtAvailability.createOne\",\"CourtAvailability.createMany\",\"CourtAvailability.createManyAndReturn\",\"CourtAvailability.updateOne\",\"CourtAvailability.updateMany\",\"CourtAvailability.updateManyAndReturn\",\"CourtAvailability.upsertOne\",\"CourtAvailability.deleteOne\",\"CourtAvailability.deleteMany\",\"CourtAvailability.groupBy\",\"CourtAvailability.aggregate\",\"CourtPriceRule.findUnique\",\"CourtPriceRule.findUniqueOrThrow\",\"CourtPriceRule.findFirst\",\"CourtPriceRule.findFirstOrThrow\",\"CourtPriceRule.findMany\",\"CourtPriceRule.createOne\",\"CourtPriceRule.createMany\",\"CourtPriceRule.createManyAndReturn\",\"CourtPriceRule.updateOne\",\"CourtPriceRule.updateMany\",\"CourtPriceRule.updateManyAndReturn\",\"CourtPriceRule.upsertOne\",\"CourtPriceRule.deleteOne\",\"CourtPriceRule.deleteMany\",\"CourtPriceRule.groupBy\",\"CourtPriceRule.aggregate\",\"CourtBooking.findUnique\",\"CourtBooking.findUniqueOrThrow\",\"CourtBooking.findFirst\",\"CourtBooking.findFirstOrThrow\",\"CourtBooking.findMany\",\"CourtBooking.createOne\",\"CourtBooking.createMany\",\"CourtBooking.createManyAndReturn\",\"CourtBooking.updateOne\",\"CourtBooking.updateMany\",\"CourtBooking.updateManyAndReturn\",\"CourtBooking.upsertOne\",\"CourtBooking.deleteOne\",\"CourtBooking.deleteMany\",\"CourtBooking.groupBy\",\"CourtBooking.aggregate\",\"OnboardingRequest.findUnique\",\"OnboardingRequest.findUniqueOrThrow\",\"OnboardingRequest.findFirst\",\"OnboardingRequest.findFirstOrThrow\",\"OnboardingRequest.findMany\",\"OnboardingRequest.createOne\",\"OnboardingRequest.createMany\",\"OnboardingRequest.createManyAndReturn\",\"OnboardingRequest.updateOne\",\"OnboardingRequest.updateMany\",\"OnboardingRequest.updateManyAndReturn\",\"OnboardingRequest.upsertOne\",\"OnboardingRequest.deleteOne\",\"OnboardingRequest.deleteMany\",\"OnboardingRequest.groupBy\",\"OnboardingRequest.aggregate\",\"PasswordResetRequest.findUnique\",\"PasswordResetRequest.findUniqueOrThrow\",\"PasswordResetRequest.findFirst\",\"PasswordResetRequest.findFirstOrThrow\",\"PasswordResetRequest.findMany\",\"PasswordResetRequest.createOne\",\"PasswordResetRequest.createMany\",\"PasswordResetRequest.createManyAndReturn\",\"PasswordResetRequest.updateOne\",\"PasswordResetRequest.updateMany\",\"PasswordResetRequest.updateManyAndReturn\",\"PasswordResetRequest.upsertOne\",\"PasswordResetRequest.deleteOne\",\"PasswordResetRequest.deleteMany\",\"PasswordResetRequest.groupBy\",\"PasswordResetRequest.aggregate\",\"Plan.findUnique\",\"Plan.findUniqueOrThrow\",\"Plan.findFirst\",\"Plan.findFirstOrThrow\",\"Plan.findMany\",\"Plan.createOne\",\"Plan.createMany\",\"Plan.createManyAndReturn\",\"Plan.updateOne\",\"Plan.updateMany\",\"Plan.updateManyAndReturn\",\"Plan.upsertOne\",\"Plan.deleteOne\",\"Plan.deleteMany\",\"Plan.groupBy\",\"Plan.aggregate\",\"AND\",\"OR\",\"NOT\",\"code\",\"name\",\"price\",\"rules\",\"lastUpdatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"every\",\"some\",\"none\",\"id\",\"email\",\"otpHash\",\"otpExpiresAt\",\"otpAttempts\",\"otpLastSentAt\",\"otpResendCount\",\"usedAt\",\"createdAt\",\"updatedAt\",\"fullName\",\"emailVerifiedAt\",\"completedAt\",\"bookingCode\",\"courtId\",\"bookingDate\",\"startTime\",\"endTime\",\"customerName\",\"customerPhone\",\"CourtBookingStatus\",\"status\",\"DayOfWeek\",\"dayOfWeek\",\"isActive\",\"complexId\",\"sportId\",\"slotDurationMinutes\",\"basePrice\",\"slug\",\"userId\",\"ComplexUserRole\",\"role\",\"complexName\",\"physicalAddress\",\"city\",\"state\",\"country\",\"complexSlug\",\"adminEmail\",\"planCode\",\"identifier\",\"value\",\"expiresAt\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"emailVerified\",\"image\",\"courtId_bookingDate_startTime\",\"complexId_userId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "-AWAAeABDgQAAL0DACAFAAC-AwAgBgAAvwMAIPkBAAC7AwAw-gEAADIAEPsBAAC7AwAw_QEBAIQDACGVAgEAAAABlgIBAAAAAZ0CQACHAwAhngJAAIcDACG1AgEAhAMAIc0CIACvAwAhzgIBALwDACEBAAAAAQAgDAMAANMDACD5AQAA1QMAMPoBAAADABD7AQAA1QMAMJUCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwAJAAIcDACHKAgEAhAMAIcsCAQC8AwAhzAIBALwDACEDAwAAvAUAIMsCAAC-BAAgzAIAAL4EACAMAwAA0wMAIPkBAADVAwAw-gEAAAMAEPsBAADVAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACGzAgEAhAMAIcACQACHAwAhygIBAAAAAcsCAQC8AwAhzAIBALwDACEDAAAAAwAgAQAABAAwAgAABQAgEQMAANMDACD5AQAA1AMAMPoBAAAHABD7AQAA1AMAMJUCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwQIBAIQDACHCAgEAhAMAIcMCAQC8AwAhxAIBALwDACHFAgEAvAMAIcYCQACWAwAhxwJAAJYDACHIAgEAvAMAIckCAQC8AwAhCAMAALwFACDDAgAAvgQAIMQCAAC-BAAgxQIAAL4EACDGAgAAvgQAIMcCAAC-BAAgyAIAAL4EACDJAgAAvgQAIBEDAADTAwAg-QEAANQDADD6AQAABwAQ-wEAANQDADCVAgEAAAABnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwQIBAIQDACHCAgEAhAMAIcMCAQC8AwAhxAIBALwDACHFAgEAvAMAIcYCQACWAwAhxwJAAJYDACHIAgEAvAMAIckCAQC8AwAhAwAAAAcAIAEAAAgAMAIAAAkAIAkDAADTAwAgCgAAyQMAIPkBAADRAwAw-gEAAAsAEPsBAADRAwAwnQJAAIcDACGuAgEAlAMAIbMCAQCEAwAhtQIAANIDtQIiAgMAALwFACAKAAC2BQAgCgMAANMDACAKAADJAwAg-QEAANEDADD6AQAACwAQ-wEAANEDADCdAkAAhwMAIa4CAQCUAwAhswIBAIQDACG1AgAA0gO1AiLQAgAA0AMAIAMAAAALACABAAAMADACAAANACAJBgAAiAMAIPkBAACDAwAw-gEAAA8AEPsBAACDAwAw_AEBAIQDACH9AQEAhAMAIf4BEACFAwAh_wEAAIYDACCAAkAAhwMAIQEAAAAPACARCAAAzwMAIAkAAL8DACALAACwAwAg-QEAAM4DADD6AQAAEQAQ-wEAAM4DADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACG2AgEAhAMAIbcCAQC8AwAhuAIBALwDACG5AgEAvAMAIboCAQC8AwAhuwIBAIQDACG8AgEAhAMAIb0CAQC8AwAhCAgAALsFACAJAAC0BQAgCwAA8AQAILcCAAC-BAAguAIAAL4EACC5AgAAvgQAILoCAAC-BAAgvQIAAL4EACARCAAAzwMAIAkAAL8DACALAACwAwAg-QEAAM4DADD6AQAAEQAQ-wEAAM4DADCVAgEAAAABnQJAAIcDACGeAkAAhwMAIbYCAQCEAwAhtwIBALwDACG4AgEAvAMAIbkCAQC8AwAhugIBALwDACG7AgEAAAABvAIBAIQDACG9AgEAvAMAIQMAAAARACABAAASADACAAATACABAAAAEQAgAwAAAAsAIAEAAAwAMAIAAA0AIBAKAADJAwAgDAAAygMAIA4AAMsDACAPAADMAwAgEAAAzQMAIPkBAADIAwAw-gEAABcAEPsBAADIAwAw_QEBAIQDACGVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGuAgEAlAMAIa8CAQCUAwAhsAICAJUDACGxAhAAhQMAIQUKAAC2BQAgDAAAtwUAIA4AALgFACAPAAC5BQAgEAAAugUAIBAKAADJAwAgDAAAygMAIA4AAMsDACAPAADMAwAgEAAAzQMAIPkBAADIAwAw-gEAABcAEPsBAADIAwAw_QEBAIQDACGVAgEAAAABnQJAAIcDACGeAkAAhwMAIa4CAQCUAwAhrwIBAJQDACGwAgIAlQMAIbECEACFAwAhAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACABAAAAFwAgCg0AAMMDACD5AQAAxgMAMPoBAAAdABD7AQAAxgMAMJUCAQCUAwAhnQJAAIcDACGjAgEAlAMAIaUCAQCEAwAhpgIBAIQDACGsAgAAxwOsAiIBDQAAtQUAIAoNAADDAwAg-QEAAMYDADD6AQAAHQAQ-wEAAMYDADCVAgEAAAABnQJAAIcDACGjAgEAlAMAIaUCAQCEAwAhpgIBAIQDACGsAgAAxwOsAiIDAAAAHQAgAQAAHgAwAgAAHwAgDQ0AAMMDACD5AQAAxAMAMPoBAAAhABD7AQAAxAMAMP4BEACFAwAhlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhowIBAJQDACGlAgEAvAMAIaYCAQC8AwAhrAIAAMUDrAIjrQIgAK8DACEEDQAAtQUAIKUCAAC-BAAgpgIAAL4EACCsAgAAvgQAIA0NAADDAwAg-QEAAMQDADD6AQAAIQAQ-wEAAMQDADD-ARAAhQMAIZUCAQAAAAGdAkAAhwMAIZ4CQACHAwAhowIBAJQDACGlAgEAvAMAIaYCAQC8AwAhrAIAAMUDrAIjrQIgAK8DACEDAAAAIQAgAQAAIgAwAgAAIwAgDw0AAMMDACD5AQAAwQMAMPoBAAAlABD7AQAAwQMAMJUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIaICAQCEAwAhowIBAJQDACGkAkAAhwMAIaUCAQCEAwAhpgIBAIQDACGnAgEAhAMAIagCAQCEAwAhqgIAAMIDqgIiAQ0AALUFACAQDQAAwwMAIPkBAADBAwAw-gEAACUAEPsBAADBAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACGiAgEAAAABowIBAJQDACGkAkAAhwMAIaUCAQCEAwAhpgIBAIQDACGnAgEAhAMAIagCAQCEAwAhqgIAAMIDqgIizwIAAMADACADAAAAJQAgAQAAJgAwAgAAJwAgAQAAAB0AIAEAAAAhACABAAAAJQAgAQAAAAsAIAEAAAAXACABAAAAAwAgAQAAAAcAIAEAAAALACABAAAAAQAgDgQAAL0DACAFAAC-AwAgBgAAvwMAIPkBAAC7AwAw-gEAADIAEPsBAAC7AwAw_QEBAIQDACGVAgEAhAMAIZYCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbUCAQCEAwAhzQIgAK8DACHOAgEAvAMAIQQEAACyBQAgBQAAswUAIAYAALQFACDOAgAAvgQAIAMAAAAyACABAAAzADACAAABACADAAAAMgAgAQAAMwAwAgAAAQAgAwAAADIAIAEAADMAMAIAAAEAIAsEAACvBQAgBQAAsAUAIAYAALEFACD9AQEAAAABlQIBAAAAAZYCAQAAAAGdAkAAAAABngJAAAAAAbUCAQAAAAHNAiAAAAABzgIBAAAAAQEWAAA3ACAI_QEBAAAAAZUCAQAAAAGWAgEAAAABnQJAAAAAAZ4CQAAAAAG1AgEAAAABzQIgAAAAAc4CAQAAAAEBFgAAOQAwARYAADkAMAsEAACLBQAgBQAAjAUAIAYAAI0FACD9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhtQIBANsDACHNAiAAlQQAIc4CAQDpAwAhAgAAAAEAIBYAADwAIAj9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhtQIBANsDACHNAiAAlQQAIc4CAQDpAwAhAgAAADIAIBYAAD4AIAIAAAAyACAWAAA-ACADAAAAAQAgHQAANwAgHgAAPAAgAQAAAAEAIAEAAAAyACAEBwAAiAUAICMAAIoFACAkAACJBQAgzgIAAL4EACAL-QEAALoDADD6AQAARQAQ-wEAALoDADD9AQEA9wIAIZUCAQD3AgAhlgIBAPcCACGdAkAA-gIAIZ4CQAD6AgAhtQIBAPcCACHNAiAAoQMAIc4CAQCgAwAhAwAAADIAIAEAAEQAMCIAAEUAIAMAAAAyACABAAAzADACAAABACABAAAABQAgAQAAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAkDAACHBQAglQIBAAAAAZ0CQAAAAAGeAkAAAAABswIBAAAAAcACQAAAAAHKAgEAAAABywIBAAAAAcwCAQAAAAEBFgAATQAgCJUCAQAAAAGdAkAAAAABngJAAAAAAbMCAQAAAAHAAkAAAAABygIBAAAAAcsCAQAAAAHMAgEAAAABARYAAE8AMAEWAABPADAJAwAAhgUAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbMCAQDbAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACECAAAABQAgFgAAUgAgCJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbMCAQDbAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACECAAAAAwAgFgAAVAAgAgAAAAMAIBYAAFQAIAMAAAAFACAdAABNACAeAABSACABAAAABQAgAQAAAAMAIAUHAACDBQAgIwAAhQUAICQAAIQFACDLAgAAvgQAIMwCAAC-BAAgC_kBAAC5AwAw-gEAAFsAEPsBAAC5AwAwlQIBAPcCACGdAkAA-gIAIZ4CQAD6AgAhswIBAPcCACHAAkAA-gIAIcoCAQD3AgAhywIBAKADACHMAgEAoAMAIQMAAAADACABAABaADAiAABbACADAAAAAwAgAQAABAAwAgAABQAgAQAAAAkAIAEAAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIAMAAAAHACABAAAIADACAAAJACAOAwAAggUAIJUCAQAAAAGdAkAAAAABngJAAAAAAbMCAQAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgEAAAABxQIBAAAAAcYCQAAAAAHHAkAAAAAByAIBAAAAAckCAQAAAAEBFgAAYwAgDZUCAQAAAAGdAkAAAAABngJAAAAAAbMCAQAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgEAAAABxQIBAAAAAcYCQAAAAAHHAkAAAAAByAIBAAAAAckCAQAAAAEBFgAAZQAwARYAAGUAMA4DAACBBQAglQIBANsDACGdAkAA3QMAIZ4CQADdAwAhswIBANsDACHBAgEA2wMAIcICAQDbAwAhwwIBAOkDACHEAgEA6QMAIcUCAQDpAwAhxgJAAMQEACHHAkAAxAQAIcgCAQDpAwAhyQIBAOkDACECAAAACQAgFgAAaAAgDZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbMCAQDbAwAhwQIBANsDACHCAgEA2wMAIcMCAQDpAwAhxAIBAOkDACHFAgEA6QMAIcYCQADEBAAhxwJAAMQEACHIAgEA6QMAIckCAQDpAwAhAgAAAAcAIBYAAGoAIAIAAAAHACAWAABqACADAAAACQAgHQAAYwAgHgAAaAAgAQAAAAkAIAEAAAAHACAKBwAA_gQAICMAAIAFACAkAAD_BAAgwwIAAL4EACDEAgAAvgQAIMUCAAC-BAAgxgIAAL4EACDHAgAAvgQAIMgCAAC-BAAgyQIAAL4EACAQ-QEAALgDADD6AQAAcQAQ-wEAALgDADCVAgEA9wIAIZ0CQAD6AgAhngJAAPoCACGzAgEA9wIAIcECAQD3AgAhwgIBAPcCACHDAgEAoAMAIcQCAQCgAwAhxQIBAKADACHGAkAAjAMAIccCQACMAwAhyAIBAKADACHJAgEAoAMAIQMAAAAHACABAABwADAiAABxACADAAAABwAgAQAACAAwAgAACQAgCfkBAAC3AwAw-gEAAHcAEPsBAAC3AwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACG-AgEAhAMAIb8CAQCEAwAhwAJAAIcDACEBAAAAdAAgAQAAAHQAIAn5AQAAtwMAMPoBAAB3ABD7AQAAtwMAMJUCAQCEAwAhnQJAAIcDACGeAkAAhwMAIb4CAQCEAwAhvwIBAIQDACHAAkAAhwMAIQADAAAAdwAgAQAAeAAwAgAAdAAgAwAAAHcAIAEAAHgAMAIAAHQAIAMAAAB3ACABAAB4ADACAAB0ACAGlQIBAAAAAZ0CQAAAAAGeAkAAAAABvgIBAAAAAb8CAQAAAAHAAkAAAAABARYAAHwAIAaVAgEAAAABnQJAAAAAAZ4CQAAAAAG-AgEAAAABvwIBAAAAAcACQAAAAAEBFgAAfgAwARYAAH4AMAaVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG-AgEA2wMAIb8CAQDbAwAhwAJAAN0DACECAAAAdAAgFgAAgQEAIAaVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG-AgEA2wMAIb8CAQDbAwAhwAJAAN0DACECAAAAdwAgFgAAgwEAIAIAAAB3ACAWAACDAQAgAwAAAHQAIB0AAHwAIB4AAIEBACABAAAAdAAgAQAAAHcAIAMHAAD7BAAgIwAA_QQAICQAAPwEACAJ-QEAALYDADD6AQAAigEAEPsBAAC2AwAwlQIBAPcCACGdAkAA-gIAIZ4CQAD6AgAhvgIBAPcCACG_AgEA9wIAIcACQAD6AgAhAwAAAHcAIAEAAIkBADAiAACKAQAgAwAAAHcAIAEAAHgAMAIAAHQAIAEAAAATACABAAAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACADAAAAEQAgAQAAEgAwAgAAEwAgDggAAPoEACAJAAC6BAAgCwAAuwQAIJUCAQAAAAGdAkAAAAABngJAAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAG9AgEAAAABARYAAJIBACALlQIBAAAAAZ0CQAAAAAGeAkAAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQIBAAAAAboCAQAAAAG7AgEAAAABvAIBAAAAAb0CAQAAAAEBFgAAlAEAMAEWAACUAQAwAQAAAA8AIA4IAAD5BAAgCQAA6wMAIAsAAOwDACCVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG2AgEA2wMAIbcCAQDpAwAhuAIBAOkDACG5AgEA6QMAIboCAQDpAwAhuwIBANsDACG8AgEA2wMAIb0CAQDpAwAhAgAAABMAIBYAAJgBACALlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhtgIBANsDACG3AgEA6QMAIbgCAQDpAwAhuQIBAOkDACG6AgEA6QMAIbsCAQDbAwAhvAIBANsDACG9AgEA6QMAIQIAAAARACAWAACaAQAgAgAAABEAIBYAAJoBACABAAAADwAgAwAAABMAIB0AAJIBACAeAACYAQAgAQAAABMAIAEAAAARACAIBwAA9gQAICMAAPgEACAkAAD3BAAgtwIAAL4EACC4AgAAvgQAILkCAAC-BAAgugIAAL4EACC9AgAAvgQAIA75AQAAtQMAMPoBAACiAQAQ-wEAALUDADCVAgEAigMAIZ0CQAD6AgAhngJAAPoCACG2AgEA9wIAIbcCAQCgAwAhuAIBAKADACG5AgEAoAMAIboCAQCgAwAhuwIBAPcCACG8AgEA9wIAIb0CAQCgAwAhAwAAABEAIAEAAKEBADAiAACiAQAgAwAAABEAIAEAABIAMAIAABMAIAEAAAANACABAAAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAMAAAALACABAAAMADACAAANACADAAAACwAgAQAADAAwAgAADQAgBgMAALgEACAKAAD1BAAgnQJAAAAAAa4CAQAAAAGzAgEAAAABtQIAAAC1AgIBFgAAqgEAIASdAkAAAAABrgIBAAAAAbMCAQAAAAG1AgAAALUCAgEWAACsAQAwARYAAKwBADAGAwAAtgQAIAoAAPQEACCdAkAA3QMAIa4CAQDbAwAhswIBANsDACG1AgAAtAS1AiICAAAADQAgFgAArwEAIASdAkAA3QMAIa4CAQDbAwAhswIBANsDACG1AgAAtAS1AiICAAAACwAgFgAAsQEAIAIAAAALACAWAACxAQAgAwAAAA0AIB0AAKoBACAeAACvAQAgAQAAAA0AIAEAAAALACADBwAA8QQAICMAAPMEACAkAADyBAAgB_kBAACxAwAw-gEAALgBABD7AQAAsQMAMJ0CQAD6AgAhrgIBAIoDACGzAgEA9wIAIbUCAACyA7UCIgMAAAALACABAAC3AQAwIgAAuAEAIAMAAAALACABAAAMADACAAANACAKCwAAsAMAIPkBAACuAwAw-gEAAL4BABD7AQAArgMAMP0BAQAAAAGVAgEAAAABnQJAAIcDACGeAkAAhwMAIa0CIACvAwAhsgIBAAAAAQEAAAC7AQAgAQAAALsBACAKCwAAsAMAIPkBAACuAwAw-gEAAL4BABD7AQAArgMAMP0BAQCEAwAhlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhrQIgAK8DACGyAgEAhAMAIQELAADwBAAgAwAAAL4BACABAAC_AQAwAgAAuwEAIAMAAAC-AQAgAQAAvwEAMAIAALsBACADAAAAvgEAIAEAAL8BADACAAC7AQAgBwsAAO8EACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrQIgAAAAAbICAQAAAAEBFgAAwwEAIAb9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrQIgAAAAAbICAQAAAAEBFgAAxQEAMAEWAADFAQAwBwsAAOUEACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa0CIACVBAAhsgIBANsDACECAAAAuwEAIBYAAMgBACAG_QEBANsDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGtAiAAlQQAIbICAQDbAwAhAgAAAL4BACAWAADKAQAgAgAAAL4BACAWAADKAQAgAwAAALsBACAdAADDAQAgHgAAyAEAIAEAAAC7AQAgAQAAAL4BACADBwAA4gQAICMAAOQEACAkAADjBAAgCfkBAACtAwAw-gEAANEBABD7AQAArQMAMP0BAQD3AgAhlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhrQIgAKEDACGyAgEA9wIAIQMAAAC-AQAgAQAA0AEAMCIAANEBACADAAAAvgEAIAEAAL8BADACAAC7AQAgAQAAABkAIAEAAAAZACADAAAAFwAgAQAAGAAwAgAAGQAgAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACANCgAA4QQAIAwAAKYEACAOAACnBAAgDwAAqAQAIBAAAKkEACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrgIBAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQEWAADZAQAgCP0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGuAgEAAAABrwIBAAAAAbACAgAAAAGxAhAAAAABARYAANsBADABFgAA2wEAMA0KAADgBAAgDAAA-QMAIA4AAPoDACAPAAD7AwAgEAAA_AMAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGvAgEA2wMAIbACAgD3AwAhsQIQANwDACECAAAAGQAgFgAA3gEAIAj9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhAgAAABcAIBYAAOABACACAAAAFwAgFgAA4AEAIAMAAAAZACAdAADZAQAgHgAA3gEAIAEAAAAZACABAAAAFwAgBQcAANsEACAjAADeBAAgJAAA3QQAIJUBAADcBAAglgEAAN8EACAL-QEAAKwDADD6AQAA5wEAEPsBAACsAwAw_QEBAPcCACGVAgEAigMAIZ0CQAD6AgAhngJAAPoCACGuAgEAigMAIa8CAQCKAwAhsAICAIsDACGxAhAA-AIAIQMAAAAXACABAADmAQAwIgAA5wEAIAMAAAAXACABAAAYADACAAAZACABAAAAHwAgAQAAAB8AIAMAAAAdACABAAAeADACAAAfACADAAAAHQAgAQAAHgAwAgAAHwAgAwAAAB0AIAEAAB4AMAIAAB8AIAcNAADaBAAglQIBAAAAAZ0CQAAAAAGjAgEAAAABpQIBAAAAAaYCAQAAAAGsAgAAAKwCAgEWAADvAQAgBpUCAQAAAAGdAkAAAAABowIBAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgIBFgAA8QEAMAEWAADxAQAwBw0AANkEACCVAgEA2wMAIZ0CQADdAwAhowIBANsDACGlAgEA2wMAIaYCAQDbAwAhrAIAAKIErAIiAgAAAB8AIBYAAPQBACAGlQIBANsDACGdAkAA3QMAIaMCAQDbAwAhpQIBANsDACGmAgEA2wMAIawCAACiBKwCIgIAAAAdACAWAAD2AQAgAgAAAB0AIBYAAPYBACADAAAAHwAgHQAA7wEAIB4AAPQBACABAAAAHwAgAQAAAB0AIAMHAADWBAAgIwAA2AQAICQAANcEACAJ-QEAAKgDADD6AQAA_QEAEPsBAACoAwAwlQIBAIoDACGdAkAA-gIAIaMCAQCKAwAhpQIBAPcCACGmAgEA9wIAIawCAACpA6wCIgMAAAAdACABAAD8AQAwIgAA_QEAIAMAAAAdACABAAAeADACAAAfACABAAAAIwAgAQAAACMAIAMAAAAhACABAAAiADACAAAjACADAAAAIQAgAQAAIgAwAgAAIwAgAwAAACEAIAEAACIAMAIAACMAIAoNAADVBAAg_gEQAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAaMCAQAAAAGlAgEAAAABpgIBAAAAAawCAAAArAIDrQIgAAAAAQEWAACFAgAgCf4BEAAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGjAgEAAAABpQIBAAAAAaYCAQAAAAGsAgAAAKwCA60CIAAAAAEBFgAAhwIAMAEWAACHAgAwCg0AANQEACD-ARAA3AMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIaMCAQDbAwAhpQIBAOkDACGmAgEA6QMAIawCAACUBKwCI60CIACVBAAhAgAAACMAIBYAAIoCACAJ_gEQANwDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGjAgEA2wMAIaUCAQDpAwAhpgIBAOkDACGsAgAAlASsAiOtAiAAlQQAIQIAAAAhACAWAACMAgAgAgAAACEAIBYAAIwCACADAAAAIwAgHQAAhQIAIB4AAIoCACABAAAAIwAgAQAAACEAIAgHAADPBAAgIwAA0gQAICQAANEEACCVAQAA0AQAIJYBAADTBAAgpQIAAL4EACCmAgAAvgQAIKwCAAC-BAAgDPkBAACeAwAw-gEAAJMCABD7AQAAngMAMP4BEAD4AgAhlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhowIBAIoDACGlAgEAoAMAIaYCAQCgAwAhrAIAAJ8DrAIjrQIgAKEDACEDAAAAIQAgAQAAkgIAMCIAAJMCACADAAAAIQAgAQAAIgAwAgAAIwAgAQAAACcAIAEAAAAnACADAAAAJQAgAQAAJgAwAgAAJwAgAwAAACUAIAEAACYAMAIAACcAIAMAAAAlACABAAAmADACAAAnACAMDQAAzgQAIJUCAQAAAAGdAkAAAAABngJAAAAAAaICAQAAAAGjAgEAAAABpAJAAAAAAaUCAQAAAAGmAgEAAAABpwIBAAAAAagCAQAAAAGqAgAAAKoCAgEWAACbAgAgC5UCAQAAAAGdAkAAAAABngJAAAAAAaICAQAAAAGjAgEAAAABpAJAAAAAAaUCAQAAAAGmAgEAAAABpwIBAAAAAagCAQAAAAGqAgAAAKoCAgEWAACdAgAwARYAAJ0CADAMDQAAzQQAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIaICAQDbAwAhowIBANsDACGkAkAA3QMAIaUCAQDbAwAhpgIBANsDACGnAgEA2wMAIagCAQDbAwAhqgIAAIcEqgIiAgAAACcAIBYAAKACACALlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhogIBANsDACGjAgEA2wMAIaQCQADdAwAhpQIBANsDACGmAgEA2wMAIacCAQDbAwAhqAIBANsDACGqAgAAhwSqAiICAAAAJQAgFgAAogIAIAIAAAAlACAWAACiAgAgAwAAACcAIB0AAJsCACAeAACgAgAgAQAAACcAIAEAAAAlACADBwAAygQAICMAAMwEACAkAADLBAAgDvkBAACaAwAw-gEAAKkCABD7AQAAmgMAMJUCAQCKAwAhnQJAAPoCACGeAkAA-gIAIaICAQD3AgAhowIBAIoDACGkAkAA-gIAIaUCAQD3AgAhpgIBAPcCACGnAgEA9wIAIagCAQD3AgAhqgIAAJsDqgIiAwAAACUAIAEAAKgCADAiAACpAgAgAwAAACUAIAEAACYAMAIAACcAIA_5AQAAmQMAMPoBAACvAgAQ-wEAAJkDADCVAgEAAAABlgIBAIQDACGXAgEAhAMAIZgCQACHAwAhmQICAJUDACGaAkAAhwMAIZsCAgCVAwAhnQJAAIcDACGeAkAAhwMAIZ8CAQCEAwAhoAJAAJYDACGhAkAAlgMAIQEAAACsAgAgAQAAAKwCACAP-QEAAJkDADD6AQAArwIAEPsBAACZAwAwlQIBAJQDACGWAgEAhAMAIZcCAQCEAwAhmAJAAIcDACGZAgIAlQMAIZoCQACHAwAhmwICAJUDACGdAkAAhwMAIZ4CQACHAwAhnwIBAIQDACGgAkAAlgMAIaECQACWAwAhAqACAAC-BAAgoQIAAL4EACADAAAArwIAIAEAALACADACAACsAgAgAwAAAK8CACABAACwAgAwAgAArAIAIAMAAACvAgAgAQAAsAIAMAIAAKwCACAMlQIBAAAAAZYCAQAAAAGXAgEAAAABmAJAAAAAAZkCAgAAAAGaAkAAAAABmwICAAAAAZ0CQAAAAAGeAkAAAAABnwIBAAAAAaACQAAAAAGhAkAAAAABARYAALQCACAMlQIBAAAAAZYCAQAAAAGXAgEAAAABmAJAAAAAAZkCAgAAAAGaAkAAAAABmwICAAAAAZ0CQAAAAAGeAkAAAAABnwIBAAAAAaACQAAAAAGhAkAAAAABARYAALYCADABFgAAtgIAMAyVAgEA2wMAIZYCAQDbAwAhlwIBANsDACGYAkAA3QMAIZkCAgD3AwAhmgJAAN0DACGbAgIA9wMAIZ0CQADdAwAhngJAAN0DACGfAgEA2wMAIaACQADEBAAhoQJAAMQEACECAAAArAIAIBYAALkCACAMlQIBANsDACGWAgEA2wMAIZcCAQDbAwAhmAJAAN0DACGZAgIA9wMAIZoCQADdAwAhmwICAPcDACGdAkAA3QMAIZ4CQADdAwAhnwIBANsDACGgAkAAxAQAIaECQADEBAAhAgAAAK8CACAWAAC7AgAgAgAAAK8CACAWAAC7AgAgAwAAAKwCACAdAAC0AgAgHgAAuQIAIAEAAACsAgAgAQAAAK8CACAHBwAAxQQAICMAAMgEACAkAADHBAAglQEAAMYEACCWAQAAyQQAIKACAAC-BAAgoQIAAL4EACAP-QEAAJgDADD6AQAAwgIAEPsBAACYAwAwlQIBAIoDACGWAgEA9wIAIZcCAQD3AgAhmAJAAPoCACGZAgIAiwMAIZoCQAD6AgAhmwICAIsDACGdAkAA-gIAIZ4CQAD6AgAhnwIBAPcCACGgAkAAjAMAIaECQACMAwAhAwAAAK8CACABAADBAgAwIgAAwgIAIAMAAACvAgAgAQAAsAIAMAIAAKwCACAN-QEAAJMDADD6AQAAyAIAEPsBAACTAwAwlQIBAAAAAZYCAQCEAwAhlwIBAIQDACGYAkAAhwMAIZkCAgCVAwAhmgJAAIcDACGbAgIAlQMAIZwCQACWAwAhnQJAAIcDACGeAkAAhwMAIQEAAADFAgAgAQAAAMUCACAN-QEAAJMDADD6AQAAyAIAEPsBAACTAwAwlQIBAJQDACGWAgEAhAMAIZcCAQCEAwAhmAJAAIcDACGZAgIAlQMAIZoCQACHAwAhmwICAJUDACGcAkAAlgMAIZ0CQACHAwAhngJAAIcDACEBnAIAAL4EACADAAAAyAIAIAEAAMkCADACAADFAgAgAwAAAMgCACABAADJAgAwAgAAxQIAIAMAAADIAgAgAQAAyQIAMAIAAMUCACAKlQIBAAAAAZYCAQAAAAGXAgEAAAABmAJAAAAAAZkCAgAAAAGaAkAAAAABmwICAAAAAZwCQAAAAAGdAkAAAAABngJAAAAAAQEWAADNAgAgCpUCAQAAAAGWAgEAAAABlwIBAAAAAZgCQAAAAAGZAgIAAAABmgJAAAAAAZsCAgAAAAGcAkAAAAABnQJAAAAAAZ4CQAAAAAEBFgAAzwIAMAEWAADPAgAwCpUCAQDbAwAhlgIBANsDACGXAgEA2wMAIZgCQADdAwAhmQICAPcDACGaAkAA3QMAIZsCAgD3AwAhnAJAAMQEACGdAkAA3QMAIZ4CQADdAwAhAgAAAMUCACAWAADSAgAgCpUCAQDbAwAhlgIBANsDACGXAgEA2wMAIZgCQADdAwAhmQICAPcDACGaAkAA3QMAIZsCAgD3AwAhnAJAAMQEACGdAkAA3QMAIZ4CQADdAwAhAgAAAMgCACAWAADUAgAgAgAAAMgCACAWAADUAgAgAwAAAMUCACAdAADNAgAgHgAA0gIAIAEAAADFAgAgAQAAAMgCACAGBwAAvwQAICMAAMIEACAkAADBBAAglQEAAMAEACCWAQAAwwQAIJwCAAC-BAAgDfkBAACJAwAw-gEAANsCABD7AQAAiQMAMJUCAQCKAwAhlgIBAPcCACGXAgEA9wIAIZgCQAD6AgAhmQICAIsDACGaAkAA-gIAIZsCAgCLAwAhnAJAAIwDACGdAkAA-gIAIZ4CQAD6AgAhAwAAAMgCACABAADaAgAwIgAA2wIAIAMAAADIAgAgAQAAyQIAMAIAAMUCACAJBgAAiAMAIPkBAACDAwAw-gEAAA8AEPsBAACDAwAw_AEBAAAAAf0BAQCEAwAh_gEQAIUDACH_AQAAhgMAIIACQACHAwAhAQAAAN4CACABAAAA3gIAIAEGAAC9BAAgAwAAAA8AIAEAAOECADACAADeAgAgAwAAAA8AIAEAAOECADACAADeAgAgAwAAAA8AIAEAAOECADACAADeAgAgBgYAALwEACD8AQEAAAAB_QEBAAAAAf4BEAAAAAH_AYAAAAABgAJAAAAAAQEWAADlAgAgBfwBAQAAAAH9AQEAAAAB_gEQAAAAAf8BgAAAAAGAAkAAAAABARYAAOcCADABFgAA5wIAMAYGAADeAwAg_AEBANsDACH9AQEA2wMAIf4BEADcAwAh_wGAAAAAAYACQADdAwAhAgAAAN4CACAWAADqAgAgBfwBAQDbAwAh_QEBANsDACH-ARAA3AMAIf8BgAAAAAGAAkAA3QMAIQIAAAAPACAWAADsAgAgAgAAAA8AIBYAAOwCACADAAAA3gIAIB0AAOUCACAeAADqAgAgAQAAAN4CACABAAAADwAgBQcAANYDACAjAADZAwAgJAAA2AMAIJUBAADXAwAglgEAANoDACAI-QEAAPYCADD6AQAA8wIAEPsBAAD2AgAw_AEBAPcCACH9AQEA9wIAIf4BEAD4AgAh_wEAAPkCACCAAkAA-gIAIQMAAAAPACABAADyAgAwIgAA8wIAIAMAAAAPACABAADhAgAwAgAA3gIAIAj5AQAA9gIAMPoBAADzAgAQ-wEAAPYCADD8AQEA9wIAIf0BAQD3AgAh_gEQAPgCACH_AQAA-QIAIIACQAD6AgAhDgcAAPwCACAjAACCAwAgJAAAggMAIIECAQAAAAGCAgEAAAAEgwIBAAAABIQCAQAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEAgQMAIY8CAQAAAAGQAgEAAAABkQIBAAAAAQ0HAAD8AgAgIwAAgAMAICQAAIADACCVAQAAgAMAIJYBAACAAwAggQIQAAAAAYICEAAAAASDAhAAAAAEhAIQAAAAAYUCEAAAAAGGAhAAAAABhwIQAAAAAYgCEAD_AgAhDwcAAPwCACAjAAD-AgAgJAAA_gIAIIECgAAAAAGEAoAAAAABhQKAAAAAAYYCgAAAAAGHAoAAAAABiAKAAAAAAYkCAQAAAAGKAgEAAAABiwIBAAAAAYwCgAAAAAGNAoAAAAABjgKAAAAAAQsHAAD8AgAgIwAA_QIAICQAAP0CACCBAkAAAAABggJAAAAABIMCQAAAAASEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAPsCACELBwAA_AIAICMAAP0CACAkAAD9AgAggQJAAAAAAYICQAAAAASDAkAAAAAEhAJAAAAAAYUCQAAAAAGGAkAAAAABhwJAAAAAAYgCQAD7AgAhCIECAgAAAAGCAgIAAAAEgwICAAAABIQCAgAAAAGFAgIAAAABhgICAAAAAYcCAgAAAAGIAgIA_AIAIQiBAkAAAAABggJAAAAABIMCQAAAAASEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAP0CACEMgQKAAAAAAYQCgAAAAAGFAoAAAAABhgKAAAAAAYcCgAAAAAGIAoAAAAABiQIBAAAAAYoCAQAAAAGLAgEAAAABjAKAAAAAAY0CgAAAAAGOAoAAAAABDQcAAPwCACAjAACAAwAgJAAAgAMAIJUBAACAAwAglgEAAIADACCBAhAAAAABggIQAAAABIMCEAAAAASEAhAAAAABhQIQAAAAAYYCEAAAAAGHAhAAAAABiAIQAP8CACEIgQIQAAAAAYICEAAAAASDAhAAAAAEhAIQAAAAAYUCEAAAAAGGAhAAAAABhwIQAAAAAYgCEACAAwAhDgcAAPwCACAjAACCAwAgJAAAggMAIIECAQAAAAGCAgEAAAAEgwIBAAAABIQCAQAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEAgQMAIY8CAQAAAAGQAgEAAAABkQIBAAAAAQuBAgEAAAABggIBAAAABIMCAQAAAASEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAIIDACGPAgEAAAABkAIBAAAAAZECAQAAAAEJBgAAiAMAIPkBAACDAwAw-gEAAA8AEPsBAACDAwAw_AEBAIQDACH9AQEAhAMAIf4BEACFAwAh_wEAAIYDACCAAkAAhwMAIQuBAgEAAAABggIBAAAABIMCAQAAAASEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAIIDACGPAgEAAAABkAIBAAAAAZECAQAAAAEIgQIQAAAAAYICEAAAAASDAhAAAAAEhAIQAAAAAYUCEAAAAAGGAhAAAAABhwIQAAAAAYgCEACAAwAhDIECgAAAAAGEAoAAAAABhQKAAAAAAYYCgAAAAAGHAoAAAAABiAKAAAAAAYkCAQAAAAGKAgEAAAABiwIBAAAAAYwCgAAAAAGNAoAAAAABjgKAAAAAAQiBAkAAAAABggJAAAAABIMCQAAAAASEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAP0CACEDkgIAABEAIJMCAAARACCUAgAAEQAgDfkBAACJAwAw-gEAANsCABD7AQAAiQMAMJUCAQCKAwAhlgIBAPcCACGXAgEA9wIAIZgCQAD6AgAhmQICAIsDACGaAkAA-gIAIZsCAgCLAwAhnAJAAIwDACGdAkAA-gIAIZ4CQAD6AgAhCwcAAPwCACAjAACCAwAgJAAAggMAIIECAQAAAAGCAgEAAAAEgwIBAAAABIQCAQAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEAkgMAIQ0HAAD8AgAgIwAA_AIAICQAAPwCACCVAQAAkQMAIJYBAAD8AgAggQICAAAAAYICAgAAAASDAgIAAAAEhAICAAAAAYUCAgAAAAGGAgIAAAABhwICAAAAAYgCAgCQAwAhCwcAAI4DACAjAACPAwAgJAAAjwMAIIECQAAAAAGCAkAAAAAFgwJAAAAABYQCQAAAAAGFAkAAAAABhgJAAAAAAYcCQAAAAAGIAkAAjQMAIQsHAACOAwAgIwAAjwMAICQAAI8DACCBAkAAAAABggJAAAAABYMCQAAAAAWEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAI0DACEIgQICAAAAAYICAgAAAAWDAgIAAAAFhAICAAAAAYUCAgAAAAGGAgIAAAABhwICAAAAAYgCAgCOAwAhCIECQAAAAAGCAkAAAAAFgwJAAAAABYQCQAAAAAGFAkAAAAABhgJAAAAAAYcCQAAAAAGIAkAAjwMAIQ0HAAD8AgAgIwAA_AIAICQAAPwCACCVAQAAkQMAIJYBAAD8AgAggQICAAAAAYICAgAAAASDAgIAAAAEhAICAAAAAYUCAgAAAAGGAgIAAAABhwICAAAAAYgCAgCQAwAhCIECCAAAAAGCAggAAAAEgwIIAAAABIQCCAAAAAGFAggAAAABhgIIAAAAAYcCCAAAAAGIAggAkQMAIQsHAAD8AgAgIwAAggMAICQAAIIDACCBAgEAAAABggIBAAAABIMCAQAAAASEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAJIDACEN-QEAAJMDADD6AQAAyAIAEPsBAACTAwAwlQIBAJQDACGWAgEAhAMAIZcCAQCEAwAhmAJAAIcDACGZAgIAlQMAIZoCQACHAwAhmwICAJUDACGcAkAAlgMAIZ0CQACHAwAhngJAAIcDACEIgQIBAAAAAYICAQAAAASDAgEAAAAEhAIBAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQCXAwAhCIECAgAAAAGCAgIAAAAEgwICAAAABIQCAgAAAAGFAgIAAAABhgICAAAAAYcCAgAAAAGIAgIA_AIAIQiBAkAAAAABggJAAAAABYMCQAAAAAWEAkAAAAABhQJAAAAAAYYCQAAAAAGHAkAAAAABiAJAAI8DACEIgQIBAAAAAYICAQAAAASDAgEAAAAEhAIBAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQCXAwAhD_kBAACYAwAw-gEAAMICABD7AQAAmAMAMJUCAQCKAwAhlgIBAPcCACGXAgEA9wIAIZgCQAD6AgAhmQICAIsDACGaAkAA-gIAIZsCAgCLAwAhnQJAAPoCACGeAkAA-gIAIZ8CAQD3AgAhoAJAAIwDACGhAkAAjAMAIQ_5AQAAmQMAMPoBAACvAgAQ-wEAAJkDADCVAgEAlAMAIZYCAQCEAwAhlwIBAIQDACGYAkAAhwMAIZkCAgCVAwAhmgJAAIcDACGbAgIAlQMAIZ0CQACHAwAhngJAAIcDACGfAgEAhAMAIaACQACWAwAhoQJAAJYDACEO-QEAAJoDADD6AQAAqQIAEPsBAACaAwAwlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhogIBAPcCACGjAgEAigMAIaQCQAD6AgAhpQIBAPcCACGmAgEA9wIAIacCAQD3AgAhqAIBAPcCACGqAgAAmwOqAiIHBwAA_AIAICMAAJ0DACAkAACdAwAggQIAAACqAgKCAgAAAKoCCIMCAAAAqgIIiAIAAJwDqgIiBwcAAPwCACAjAACdAwAgJAAAnQMAIIECAAAAqgICggIAAACqAgiDAgAAAKoCCIgCAACcA6oCIgSBAgAAAKoCAoICAAAAqgIIgwIAAACqAgiIAgAAnQOqAiIM-QEAAJ4DADD6AQAAkwIAEPsBAACeAwAw_gEQAPgCACGVAgEAigMAIZ0CQAD6AgAhngJAAPoCACGjAgEAigMAIaUCAQCgAwAhpgIBAKADACGsAgAAnwOsAiOtAiAAoQMAIQcHAACOAwAgIwAApwMAICQAAKcDACCBAgAAAKwCA4ICAAAArAIJgwIAAACsAgmIAgAApgOsAiMOBwAAjgMAICMAAKUDACAkAAClAwAggQIBAAAAAYICAQAAAAWDAgEAAAAFhAIBAAAAAYUCAQAAAAGGAgEAAAABhwIBAAAAAYgCAQCkAwAhjwIBAAAAAZACAQAAAAGRAgEAAAABBQcAAPwCACAjAACjAwAgJAAAowMAIIECIAAAAAGIAiAAogMAIQUHAAD8AgAgIwAAowMAICQAAKMDACCBAiAAAAABiAIgAKIDACECgQIgAAAAAYgCIACjAwAhDgcAAI4DACAjAAClAwAgJAAApQMAIIECAQAAAAGCAgEAAAAFgwIBAAAABYQCAQAAAAGFAgEAAAABhgIBAAAAAYcCAQAAAAGIAgEApAMAIY8CAQAAAAGQAgEAAAABkQIBAAAAAQuBAgEAAAABggIBAAAABYMCAQAAAAWEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAKUDACGPAgEAAAABkAIBAAAAAZECAQAAAAEHBwAAjgMAICMAAKcDACAkAACnAwAggQIAAACsAgOCAgAAAKwCCYMCAAAArAIJiAIAAKYDrAIjBIECAAAArAIDggIAAACsAgmDAgAAAKwCCYgCAACnA6wCIwn5AQAAqAMAMPoBAAD9AQAQ-wEAAKgDADCVAgEAigMAIZ0CQAD6AgAhowIBAIoDACGlAgEA9wIAIaYCAQD3AgAhrAIAAKkDrAIiBwcAAPwCACAjAACrAwAgJAAAqwMAIIECAAAArAICggIAAACsAgiDAgAAAKwCCIgCAACqA6wCIgcHAAD8AgAgIwAAqwMAICQAAKsDACCBAgAAAKwCAoICAAAArAIIgwIAAACsAgiIAgAAqgOsAiIEgQIAAACsAgKCAgAAAKwCCIMCAAAArAIIiAIAAKsDrAIiC_kBAACsAwAw-gEAAOcBABD7AQAArAMAMP0BAQD3AgAhlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhrgIBAIoDACGvAgEAigMAIbACAgCLAwAhsQIQAPgCACEJ-QEAAK0DADD6AQAA0QEAEPsBAACtAwAw_QEBAPcCACGVAgEAigMAIZ0CQAD6AgAhngJAAPoCACGtAiAAoQMAIbICAQD3AgAhCgsAALADACD5AQAArgMAMPoBAAC-AQAQ-wEAAK4DADD9AQEAhAMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIa0CIACvAwAhsgIBAIQDACECgQIgAAAAAYgCIACjAwAhA5ICAAAXACCTAgAAFwAglAIAABcAIAf5AQAAsQMAMPoBAAC4AQAQ-wEAALEDADCdAkAA-gIAIa4CAQCKAwAhswIBAPcCACG1AgAAsgO1AiIHBwAA_AIAICMAALQDACAkAAC0AwAggQIAAAC1AgKCAgAAALUCCIMCAAAAtQIIiAIAALMDtQIiBwcAAPwCACAjAAC0AwAgJAAAtAMAIIECAAAAtQICggIAAAC1AgiDAgAAALUCCIgCAACzA7UCIgSBAgAAALUCAoICAAAAtQIIgwIAAAC1AgiIAgAAtAO1AiIO-QEAALUDADD6AQAAogEAEPsBAAC1AwAwlQIBAIoDACGdAkAA-gIAIZ4CQAD6AgAhtgIBAPcCACG3AgEAoAMAIbgCAQCgAwAhuQIBAKADACG6AgEAoAMAIbsCAQD3AgAhvAIBAPcCACG9AgEAoAMAIQn5AQAAtgMAMPoBAACKAQAQ-wEAALYDADCVAgEA9wIAIZ0CQAD6AgAhngJAAPoCACG-AgEA9wIAIb8CAQD3AgAhwAJAAPoCACEJ-QEAALcDADD6AQAAdwAQ-wEAALcDADCVAgEAhAMAIZ0CQACHAwAhngJAAIcDACG-AgEAhAMAIb8CAQCEAwAhwAJAAIcDACEQ-QEAALgDADD6AQAAcQAQ-wEAALgDADCVAgEA9wIAIZ0CQAD6AgAhngJAAPoCACGzAgEA9wIAIcECAQD3AgAhwgIBAPcCACHDAgEAoAMAIcQCAQCgAwAhxQIBAKADACHGAkAAjAMAIccCQACMAwAhyAIBAKADACHJAgEAoAMAIQv5AQAAuQMAMPoBAABbABD7AQAAuQMAMJUCAQD3AgAhnQJAAPoCACGeAkAA-gIAIbMCAQD3AgAhwAJAAPoCACHKAgEA9wIAIcsCAQCgAwAhzAIBAKADACEL-QEAALoDADD6AQAARQAQ-wEAALoDADD9AQEA9wIAIZUCAQD3AgAhlgIBAPcCACGdAkAA-gIAIZ4CQAD6AgAhtQIBAPcCACHNAiAAoQMAIc4CAQCgAwAhDgQAAL0DACAFAAC-AwAgBgAAvwMAIPkBAAC7AwAw-gEAADIAEPsBAAC7AwAw_QEBAIQDACGVAgEAhAMAIZYCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbUCAQCEAwAhzQIgAK8DACHOAgEAvAMAIQuBAgEAAAABggIBAAAABYMCAQAAAAWEAgEAAAABhQIBAAAAAYYCAQAAAAGHAgEAAAABiAIBAKUDACGPAgEAAAABkAIBAAAAAZECAQAAAAEDkgIAAAMAIJMCAAADACCUAgAAAwAgA5ICAAAHACCTAgAABwAglAIAAAcAIAOSAgAACwAgkwIAAAsAIJQCAAALACADowIBAAAAAaQCQAAAAAGlAgEAAAABDw0AAMMDACD5AQAAwQMAMPoBAAAlABD7AQAAwQMAMJUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIaICAQCEAwAhowIBAJQDACGkAkAAhwMAIaUCAQCEAwAhpgIBAIQDACGnAgEAhAMAIagCAQCEAwAhqgIAAMIDqgIiBIECAAAAqgICggIAAACqAgiDAgAAAKoCCIgCAACdA6oCIhIKAADJAwAgDAAAygMAIA4AAMsDACAPAADMAwAgEAAAzQMAIPkBAADIAwAw-gEAABcAEPsBAADIAwAw_QEBAIQDACGVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGuAgEAlAMAIa8CAQCUAwAhsAICAJUDACGxAhAAhQMAIdECAAAXACDSAgAAFwAgDQ0AAMMDACD5AQAAxAMAMPoBAAAhABD7AQAAxAMAMP4BEACFAwAhlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhowIBAJQDACGlAgEAvAMAIaYCAQC8AwAhrAIAAMUDrAIjrQIgAK8DACEEgQIAAACsAgOCAgAAAKwCCYMCAAAArAIJiAIAAKcDrAIjCg0AAMMDACD5AQAAxgMAMPoBAAAdABD7AQAAxgMAMJUCAQCUAwAhnQJAAIcDACGjAgEAlAMAIaUCAQCEAwAhpgIBAIQDACGsAgAAxwOsAiIEgQIAAACsAgKCAgAAAKwCCIMCAAAArAIIiAIAAKsDrAIiEAoAAMkDACAMAADKAwAgDgAAywMAIA8AAMwDACAQAADNAwAg-QEAAMgDADD6AQAAFwAQ-wEAAMgDADD9AQEAhAMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIa4CAQCUAwAhrwIBAJQDACGwAgIAlQMAIbECEACFAwAhEwgAAM8DACAJAAC_AwAgCwAAsAMAIPkBAADOAwAw-gEAABEAEPsBAADOAwAwlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhtgIBAIQDACG3AgEAvAMAIbgCAQC8AwAhuQIBALwDACG6AgEAvAMAIbsCAQCEAwAhvAIBAIQDACG9AgEAvAMAIdECAAARACDSAgAAEQAgDAsAALADACD5AQAArgMAMPoBAAC-AQAQ-wEAAK4DADD9AQEAhAMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIa0CIACvAwAhsgIBAIQDACHRAgAAvgEAINICAAC-AQAgA5ICAAAdACCTAgAAHQAglAIAAB0AIAOSAgAAIQAgkwIAACEAIJQCAAAhACADkgIAACUAIJMCAAAlACCUAgAAJQAgEQgAAM8DACAJAAC_AwAgCwAAsAMAIPkBAADOAwAw-gEAABEAEPsBAADOAwAwlQIBAJQDACGdAkAAhwMAIZ4CQACHAwAhtgIBAIQDACG3AgEAvAMAIbgCAQC8AwAhuQIBALwDACG6AgEAvAMAIbsCAQCEAwAhvAIBAIQDACG9AgEAvAMAIQsGAACIAwAg-QEAAIMDADD6AQAADwAQ-wEAAIMDADD8AQEAhAMAIf0BAQCEAwAh_gEQAIUDACH_AQAAhgMAIIACQACHAwAh0QIAAA8AINICAAAPACACrgIBAAAAAbMCAQAAAAEJAwAA0wMAIAoAAMkDACD5AQAA0QMAMPoBAAALABD7AQAA0QMAMJ0CQACHAwAhrgIBAJQDACGzAgEAhAMAIbUCAADSA7UCIgSBAgAAALUCAoICAAAAtQIIgwIAAAC1AgiIAgAAtAO1AiIQBAAAvQMAIAUAAL4DACAGAAC_AwAg-QEAALsDADD6AQAAMgAQ-wEAALsDADD9AQEAhAMAIZUCAQCEAwAhlgIBAIQDACGdAkAAhwMAIZ4CQACHAwAhtQIBAIQDACHNAiAArwMAIc4CAQC8AwAh0QIAADIAINICAAAyACARAwAA0wMAIPkBAADUAwAw-gEAAAcAEPsBAADUAwAwlQIBAIQDACGdAkAAhwMAIZ4CQACHAwAhswIBAIQDACHBAgEAhAMAIcICAQCEAwAhwwIBALwDACHEAgEAvAMAIcUCAQC8AwAhxgJAAJYDACHHAkAAlgMAIcgCAQC8AwAhyQIBALwDACEMAwAA0wMAIPkBAADVAwAw-gEAAAMAEPsBAADVAwAwlQIBAIQDACGdAkAAhwMAIZ4CQACHAwAhswIBAIQDACHAAkAAhwMAIcoCAQCEAwAhywIBALwDACHMAgEAvAMAIQAAAAAAAdYCAQAAAAEF1gIQAAAAAdwCEAAAAAHdAhAAAAAB3gIQAAAAAd8CEAAAAAEB1gJAAAAAAQsdAADfAwAwHgAA5AMAMNMCAADgAwAw1AIAAOEDADDVAgAA4gMAINYCAADjAwAw1wIAAOMDADDYAgAA4wMAMNkCAADjAwAw2gIAAOUDADDbAgAA5gMAMAwJAAC6BAAgCwAAuwQAIJUCAQAAAAGdAkAAAAABngJAAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAECAAAAEwAgHQAAuQQAIAMAAAATACAdAAC5BAAgHgAA6gMAIAEWAAD4BQAwEQgAAM8DACAJAAC_AwAgCwAAsAMAIPkBAADOAwAw-gEAABEAEPsBAADOAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACG2AgEAhAMAIbcCAQC8AwAhuAIBALwDACG5AgEAvAMAIboCAQC8AwAhuwIBAAAAAbwCAQCEAwAhvQIBALwDACECAAAAEwAgFgAA6gMAIAIAAADnAwAgFgAA6AMAIA75AQAA5gMAMPoBAADnAwAQ-wEAAOYDADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACG2AgEAhAMAIbcCAQC8AwAhuAIBALwDACG5AgEAvAMAIboCAQC8AwAhuwIBAIQDACG8AgEAhAMAIb0CAQC8AwAhDvkBAADmAwAw-gEAAOcDABD7AQAA5gMAMJUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIbYCAQCEAwAhtwIBALwDACG4AgEAvAMAIbkCAQC8AwAhugIBALwDACG7AgEAhAMAIbwCAQCEAwAhvQIBALwDACEKlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhtgIBANsDACG3AgEA6QMAIbgCAQDpAwAhuQIBAOkDACG6AgEA6QMAIbsCAQDbAwAhvAIBANsDACEB1gIBAAAAAQwJAADrAwAgCwAA7AMAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbYCAQDbAwAhtwIBAOkDACG4AgEA6QMAIbkCAQDpAwAhugIBAOkDACG7AgEA2wMAIbwCAQDbAwAhCx0AAKoEADAeAACvBAAw0wIAAKsEADDUAgAArAQAMNUCAACtBAAg1gIAAK4EADDXAgAArgQAMNgCAACuBAAw2QIAAK4EADDaAgAAsAQAMNsCAACxBAAwCx0AAO0DADAeAADyAwAw0wIAAO4DADDUAgAA7wMAMNUCAADwAwAg1gIAAPEDADDXAgAA8QMAMNgCAADxAwAw2QIAAPEDADDaAgAA8wMAMNsCAAD0AwAwCwwAAKYEACAOAACnBAAgDwAAqAQAIBAAAKkEACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrwIBAAAAAbACAgAAAAGxAhAAAAABAgAAABkAIB0AAKUEACADAAAAGQAgHQAApQQAIB4AAPgDACABFgAA9wUAMBAKAADJAwAgDAAAygMAIA4AAMsDACAPAADMAwAgEAAAzQMAIPkBAADIAwAw-gEAABcAEPsBAADIAwAw_QEBAIQDACGVAgEAAAABnQJAAIcDACGeAkAAhwMAIa4CAQCUAwAhrwIBAJQDACGwAgIAlQMAIbECEACFAwAhAgAAABkAIBYAAPgDACACAAAA9QMAIBYAAPYDACAL-QEAAPQDADD6AQAA9QMAEPsBAAD0AwAw_QEBAIQDACGVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGuAgEAlAMAIa8CAQCUAwAhsAICAJUDACGxAhAAhQMAIQv5AQAA9AMAMPoBAAD1AwAQ-wEAAPQDADD9AQEAhAMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIa4CAQCUAwAhrwIBAJQDACGwAgIAlQMAIbECEACFAwAhB_0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhBdYCAgAAAAHcAgIAAAAB3QICAAAAAd4CAgAAAAHfAgIAAAABCwwAAPkDACAOAAD6AwAgDwAA-wMAIBAAAPwDACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa8CAQDbAwAhsAICAPcDACGxAhAA3AMAIQUdAADvBQAgHgAA9QUAINMCAADwBQAg1AIAAPQFACDZAgAAuwEAIAsdAACYBAAwHgAAnQQAMNMCAACZBAAw1AIAAJoEADDVAgAAmwQAINYCAACcBAAw1wIAAJwEADDYAgAAnAQAMNkCAACcBAAw2gIAAJ4EADDbAgAAnwQAMAsdAACKBAAwHgAAjwQAMNMCAACLBAAw1AIAAIwEADDVAgAAjQQAINYCAACOBAAw1wIAAI4EADDYAgAAjgQAMNkCAACOBAAw2gIAAJAEADDbAgAAkQQAMAsdAAD9AwAwHgAAggQAMNMCAAD-AwAw1AIAAP8DADDVAgAAgAQAINYCAACBBAAw1wIAAIEEADDYAgAAgQQAMNkCAACBBAAw2gIAAIMEADDbAgAAhAQAMAqVAgEAAAABnQJAAAAAAZ4CQAAAAAGiAgEAAAABpAJAAAAAAaUCAQAAAAGmAgEAAAABpwIBAAAAAagCAQAAAAGqAgAAAKoCAgIAAAAnACAdAACJBAAgAwAAACcAIB0AAIkEACAeAACIBAAgARYAAPMFADAQDQAAwwMAIPkBAADBAwAw-gEAACUAEPsBAADBAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACGiAgEAAAABowIBAJQDACGkAkAAhwMAIaUCAQCEAwAhpgIBAIQDACGnAgEAhAMAIagCAQCEAwAhqgIAAMIDqgIizwIAAMADACACAAAAJwAgFgAAiAQAIAIAAACFBAAgFgAAhgQAIA75AQAAhAQAMPoBAACFBAAQ-wEAAIQEADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGiAgEAhAMAIaMCAQCUAwAhpAJAAIcDACGlAgEAhAMAIaYCAQCEAwAhpwIBAIQDACGoAgEAhAMAIaoCAADCA6oCIg75AQAAhAQAMPoBAACFBAAQ-wEAAIQEADCVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGiAgEAhAMAIaMCAQCUAwAhpAJAAIcDACGlAgEAhAMAIaYCAQCEAwAhpwIBAIQDACGoAgEAhAMAIaoCAADCA6oCIgqVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGiAgEA2wMAIaQCQADdAwAhpQIBANsDACGmAgEA2wMAIacCAQDbAwAhqAIBANsDACGqAgAAhwSqAiIB1gIAAACqAgIKlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhogIBANsDACGkAkAA3QMAIaUCAQDbAwAhpgIBANsDACGnAgEA2wMAIagCAQDbAwAhqgIAAIcEqgIiCpUCAQAAAAGdAkAAAAABngJAAAAAAaICAQAAAAGkAkAAAAABpQIBAAAAAaYCAQAAAAGnAgEAAAABqAIBAAAAAaoCAAAAqgICCP4BEAAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGlAgEAAAABpgIBAAAAAawCAAAArAIDrQIgAAAAAQIAAAAjACAdAACXBAAgAwAAACMAIB0AAJcEACAeAACWBAAgARYAAPIFADANDQAAwwMAIPkBAADEAwAw-gEAACEAEPsBAADEAwAw_gEQAIUDACGVAgEAAAABnQJAAIcDACGeAkAAhwMAIaMCAQCUAwAhpQIBALwDACGmAgEAvAMAIawCAADFA6wCI60CIACvAwAhAgAAACMAIBYAAJYEACACAAAAkgQAIBYAAJMEACAM-QEAAJEEADD6AQAAkgQAEPsBAACRBAAw_gEQAIUDACGVAgEAlAMAIZ0CQACHAwAhngJAAIcDACGjAgEAlAMAIaUCAQC8AwAhpgIBALwDACGsAgAAxQOsAiOtAiAArwMAIQz5AQAAkQQAMPoBAACSBAAQ-wEAAJEEADD-ARAAhQMAIZUCAQCUAwAhnQJAAIcDACGeAkAAhwMAIaMCAQCUAwAhpQIBALwDACGmAgEAvAMAIawCAADFA6wCI60CIACvAwAhCP4BEADcAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhpQIBAOkDACGmAgEA6QMAIawCAACUBKwCI60CIACVBAAhAdYCAAAArAIDAdYCIAAAAAEI_gEQANwDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGlAgEA6QMAIaYCAQDpAwAhrAIAAJQErAIjrQIgAJUEACEI_gEQAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgOtAiAAAAABBZUCAQAAAAGdAkAAAAABpQIBAAAAAaYCAQAAAAGsAgAAAKwCAgIAAAAfACAdAACkBAAgAwAAAB8AIB0AAKQEACAeAACjBAAgARYAAPEFADAKDQAAwwMAIPkBAADGAwAw-gEAAB0AEPsBAADGAwAwlQIBAAAAAZ0CQACHAwAhowIBAJQDACGlAgEAhAMAIaYCAQCEAwAhrAIAAMcDrAIiAgAAAB8AIBYAAKMEACACAAAAoAQAIBYAAKEEACAJ-QEAAJ8EADD6AQAAoAQAEPsBAACfBAAwlQIBAJQDACGdAkAAhwMAIaMCAQCUAwAhpQIBAIQDACGmAgEAhAMAIawCAADHA6wCIgn5AQAAnwQAMPoBAACgBAAQ-wEAAJ8EADCVAgEAlAMAIZ0CQACHAwAhowIBAJQDACGlAgEAhAMAIaYCAQCEAwAhrAIAAMcDrAIiBZUCAQDbAwAhnQJAAN0DACGlAgEA2wMAIaYCAQDbAwAhrAIAAKIErAIiAdYCAAAArAICBZUCAQDbAwAhnQJAAN0DACGlAgEA2wMAIaYCAQDbAwAhrAIAAKIErAIiBZUCAQAAAAGdAkAAAAABpQIBAAAAAaYCAQAAAAGsAgAAAKwCAgsMAACmBAAgDgAApwQAIA8AAKgEACAQAACpBAAg_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQMdAADvBQAg0wIAAPAFACDZAgAAuwEAIAQdAACYBAAw0wIAAJkEADDVAgAAmwQAINkCAACcBAAwBB0AAIoEADDTAgAAiwQAMNUCAACNBAAg2QIAAI4EADAEHQAA_QMAMNMCAAD-AwAw1QIAAIAEACDZAgAAgQQAMAQDAAC4BAAgnQJAAAAAAbMCAQAAAAG1AgAAALUCAgIAAAANACAdAAC3BAAgAwAAAA0AIB0AALcEACAeAAC1BAAgARYAAO4FADAKAwAA0wMAIAoAAMkDACD5AQAA0QMAMPoBAAALABD7AQAA0QMAMJ0CQACHAwAhrgIBAJQDACGzAgEAhAMAIbUCAADSA7UCItACAADQAwAgAgAAAA0AIBYAALUEACACAAAAsgQAIBYAALMEACAH-QEAALEEADD6AQAAsgQAEPsBAACxBAAwnQJAAIcDACGuAgEAlAMAIbMCAQCEAwAhtQIAANIDtQIiB_kBAACxBAAw-gEAALIEABD7AQAAsQQAMJ0CQACHAwAhrgIBAJQDACGzAgEAhAMAIbUCAADSA7UCIgOdAkAA3QMAIbMCAQDbAwAhtQIAALQEtQIiAdYCAAAAtQICBAMAALYEACCdAkAA3QMAIbMCAQDbAwAhtQIAALQEtQIiBR0AAOkFACAeAADsBQAg0wIAAOoFACDUAgAA6wUAINkCAAABACAEAwAAuAQAIJ0CQAAAAAGzAgEAAAABtQIAAAC1AgIDHQAA6QUAINMCAADqBQAg2QIAAAEAIAwJAAC6BAAgCwAAuwQAIJUCAQAAAAGdAkAAAAABngJAAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG6AgEAAAABuwIBAAAAAbwCAQAAAAEEHQAAqgQAMNMCAACrBAAw1QIAAK0EACDZAgAArgQAMAQdAADtAwAw0wIAAO4DADDVAgAA8AMAINkCAADxAwAwBB0AAN8DADDTAgAA4AMAMNUCAADiAwAg2QIAAOMDADAAAAAAAAAAAdYCQAAAAAEAAAAAAAAAAAUdAADkBQAgHgAA5wUAINMCAADlBQAg1AIAAOYFACDZAgAAGQAgAx0AAOQFACDTAgAA5QUAINkCAAAZACAAAAAAAAUdAADfBQAgHgAA4gUAINMCAADgBQAg1AIAAOEFACDZAgAAGQAgAx0AAN8FACDTAgAA4AUAINkCAAAZACAAAAAFHQAA2gUAIB4AAN0FACDTAgAA2wUAINQCAADcBQAg2QIAABkAIAMdAADaBQAg0wIAANsFACDZAgAAGQAgAAAAAAAFHQAA1QUAIB4AANgFACDTAgAA1gUAINQCAADXBQAg2QIAABMAIAMdAADVBQAg0wIAANYFACDZAgAAEwAgAAAACx0AAOYEADAeAADqBAAw0wIAAOcEADDUAgAA6AQAMNUCAADpBAAg1gIAAPEDADDXAgAA8QMAMNgCAADxAwAw2QIAAPEDADDaAgAA6wQAMNsCAAD0AwAwCwoAAOEEACAOAACnBAAgDwAAqAQAIBAAAKkEACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrgIBAAAAAbACAgAAAAGxAhAAAAABAgAAABkAIB0AAO4EACADAAAAGQAgHQAA7gQAIB4AAO0EACABFgAA1AUAMAIAAAAZACAWAADtBAAgAgAAAPUDACAWAADsBAAgB_0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGwAgIA9wMAIbECEADcAwAhCwoAAOAEACAOAAD6AwAgDwAA-wMAIBAAAPwDACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhsAICAPcDACGxAhAA3AMAIQsKAADhBAAgDgAApwQAIA8AAKgEACAQAACpBAAg_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa4CAQAAAAGwAgIAAAABsQIQAAAAAQQdAADmBAAw0wIAAOcEADDVAgAA6QQAINkCAADxAwAwAAAAAAUdAADPBQAgHgAA0gUAINMCAADQBQAg1AIAANEFACDZAgAAEwAgAx0AAM8FACDTAgAA0AUAINkCAAATACAAAAAHHQAAygUAIB4AAM0FACDTAgAAywUAINQCAADMBQAg1wIAAA8AINgCAAAPACDZAgAA3gIAIAMdAADKBQAg0wIAAMsFACDZAgAA3gIAIAAAAAAAAAUdAADFBQAgHgAAyAUAINMCAADGBQAg1AIAAMcFACDZAgAAAQAgAx0AAMUFACDTAgAAxgUAINkCAAABACAAAAAFHQAAwAUAIB4AAMMFACDTAgAAwQUAINQCAADCBQAg2QIAAAEAIAMdAADABQAg0wIAAMEFACDZAgAAAQAgAAAACx0AAKMFADAeAACoBQAw0wIAAKQFADDUAgAApQUAMNUCAACmBQAg1gIAAKcFADDXAgAApwUAMNgCAACnBQAw2QIAAKcFADDaAgAAqQUAMNsCAACqBQAwCx0AAJcFADAeAACcBQAw0wIAAJgFADDUAgAAmQUAMNUCAACaBQAg1gIAAJsFADDXAgAAmwUAMNgCAACbBQAw2QIAAJsFADDaAgAAnQUAMNsCAACeBQAwCx0AAI4FADAeAACSBQAw0wIAAI8FADDUAgAAkAUAMNUCAACRBQAg1gIAAK4EADDXAgAArgQAMNgCAACuBAAw2QIAAK4EADDaAgAAkwUAMNsCAACxBAAwBAoAAPUEACCdAkAAAAABrgIBAAAAAbUCAAAAtQICAgAAAA0AIB0AAJYFACADAAAADQAgHQAAlgUAIB4AAJUFACABFgAAvwUAMAIAAAANACAWAACVBQAgAgAAALIEACAWAACUBQAgA50CQADdAwAhrgIBANsDACG1AgAAtAS1AiIECgAA9AQAIJ0CQADdAwAhrgIBANsDACG1AgAAtAS1AiIECgAA9QQAIJ0CQAAAAAGuAgEAAAABtQIAAAC1AgIMlQIBAAAAAZ0CQAAAAAGeAkAAAAABwQIBAAAAAcICAQAAAAHDAgEAAAABxAIBAAAAAcUCAQAAAAHGAkAAAAABxwJAAAAAAcgCAQAAAAHJAgEAAAABAgAAAAkAIB0AAKIFACADAAAACQAgHQAAogUAIB4AAKEFACABFgAAvgUAMBEDAADTAwAg-QEAANQDADD6AQAABwAQ-wEAANQDADCVAgEAAAABnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwQIBAIQDACHCAgEAhAMAIcMCAQC8AwAhxAIBALwDACHFAgEAvAMAIcYCQACWAwAhxwJAAJYDACHIAgEAvAMAIckCAQC8AwAhAgAAAAkAIBYAAKEFACACAAAAnwUAIBYAAKAFACAQ-QEAAJ4FADD6AQAAnwUAEPsBAACeBQAwlQIBAIQDACGdAkAAhwMAIZ4CQACHAwAhswIBAIQDACHBAgEAhAMAIcICAQCEAwAhwwIBALwDACHEAgEAvAMAIcUCAQC8AwAhxgJAAJYDACHHAkAAlgMAIcgCAQC8AwAhyQIBALwDACEQ-QEAAJ4FADD6AQAAnwUAEPsBAACeBQAwlQIBAIQDACGdAkAAhwMAIZ4CQACHAwAhswIBAIQDACHBAgEAhAMAIcICAQCEAwAhwwIBALwDACHEAgEAvAMAIcUCAQC8AwAhxgJAAJYDACHHAkAAlgMAIcgCAQC8AwAhyQIBALwDACEMlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhwQIBANsDACHCAgEA2wMAIcMCAQDpAwAhxAIBAOkDACHFAgEA6QMAIcYCQADEBAAhxwJAAMQEACHIAgEA6QMAIckCAQDpAwAhDJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIcECAQDbAwAhwgIBANsDACHDAgEA6QMAIcQCAQDpAwAhxQIBAOkDACHGAkAAxAQAIccCQADEBAAhyAIBAOkDACHJAgEA6QMAIQyVAgEAAAABnQJAAAAAAZ4CQAAAAAHBAgEAAAABwgIBAAAAAcMCAQAAAAHEAgEAAAABxQIBAAAAAcYCQAAAAAHHAkAAAAAByAIBAAAAAckCAQAAAAEHlQIBAAAAAZ0CQAAAAAGeAkAAAAABwAJAAAAAAcoCAQAAAAHLAgEAAAABzAIBAAAAAQIAAAAFACAdAACuBQAgAwAAAAUAIB0AAK4FACAeAACtBQAgARYAAL0FADAMAwAA0wMAIPkBAADVAwAw-gEAAAMAEPsBAADVAwAwlQIBAAAAAZ0CQACHAwAhngJAAIcDACGzAgEAhAMAIcACQACHAwAhygIBAAAAAcsCAQC8AwAhzAIBALwDACECAAAABQAgFgAArQUAIAIAAACrBQAgFgAArAUAIAv5AQAAqgUAMPoBAACrBQAQ-wEAAKoFADCVAgEAhAMAIZ0CQACHAwAhngJAAIcDACGzAgEAhAMAIcACQACHAwAhygIBAIQDACHLAgEAvAMAIcwCAQC8AwAhC_kBAACqBQAw-gEAAKsFABD7AQAAqgUAMJUCAQCEAwAhnQJAAIcDACGeAkAAhwMAIbMCAQCEAwAhwAJAAIcDACHKAgEAhAMAIcsCAQC8AwAhzAIBALwDACEHlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACEHlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhwAJAAN0DACHKAgEA2wMAIcsCAQDpAwAhzAIBAOkDACEHlQIBAAAAAZ0CQAAAAAGeAkAAAAABwAJAAAAAAcoCAQAAAAHLAgEAAAABzAIBAAAAAQQdAACjBQAw0wIAAKQFADDVAgAApgUAINkCAACnBQAwBB0AAJcFADDTAgAAmAUAMNUCAACaBQAg2QIAAJsFADAEHQAAjgUAMNMCAACPBQAw1QIAAJEFACDZAgAArgQAMAAAAAUKAAC2BQAgDAAAtwUAIA4AALgFACAPAAC5BQAgEAAAugUAIAgIAAC7BQAgCQAAtAUAIAsAAPAEACC3AgAAvgQAILgCAAC-BAAguQIAAL4EACC6AgAAvgQAIL0CAAC-BAAgAQsAAPAEACAAAAABBgAAvQQAIAQEAACyBQAgBQAAswUAIAYAALQFACDOAgAAvgQAIAeVAgEAAAABnQJAAAAAAZ4CQAAAAAHAAkAAAAABygIBAAAAAcsCAQAAAAHMAgEAAAABDJUCAQAAAAGdAkAAAAABngJAAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAcQCAQAAAAHFAgEAAAABxgJAAAAAAccCQAAAAAHIAgEAAAAByQIBAAAAAQOdAkAAAAABrgIBAAAAAbUCAAAAtQICCgUAALAFACAGAACxBQAg_QEBAAAAAZUCAQAAAAGWAgEAAAABnQJAAAAAAZ4CQAAAAAG1AgEAAAABzQIgAAAAAc4CAQAAAAECAAAAAQAgHQAAwAUAIAMAAAAyACAdAADABQAgHgAAxAUAIAwAAAAyACAFAACMBQAgBgAAjQUAIBYAAMQFACD9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhtQIBANsDACHNAiAAlQQAIc4CAQDpAwAhCgUAAIwFACAGAACNBQAg_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbUCAQDbAwAhzQIgAJUEACHOAgEA6QMAIQoEAACvBQAgBgAAsQUAIP0BAQAAAAGVAgEAAAABlgIBAAAAAZ0CQAAAAAGeAkAAAAABtQIBAAAAAc0CIAAAAAHOAgEAAAABAgAAAAEAIB0AAMUFACADAAAAMgAgHQAAxQUAIB4AAMkFACAMAAAAMgAgBAAAiwUAIAYAAI0FACAWAADJBQAg_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbUCAQDbAwAhzQIgAJUEACHOAgEA6QMAIQoEAACLBQAgBgAAjQUAIP0BAQDbAwAhlQIBANsDACGWAgEA2wMAIZ0CQADdAwAhngJAAN0DACG1AgEA2wMAIc0CIACVBAAhzgIBAOkDACEF_AEBAAAAAf0BAQAAAAH-ARAAAAAB_wGAAAAAAYACQAAAAAECAAAA3gIAIB0AAMoFACADAAAADwAgHQAAygUAIB4AAM4FACAHAAAADwAgFgAAzgUAIPwBAQDbAwAh_QEBANsDACH-ARAA3AMAIf8BgAAAAAGAAkAA3QMAIQX8AQEA2wMAIf0BAQDbAwAh_gEQANwDACH_AYAAAAABgAJAAN0DACENCAAA-gQAIAsAALsEACCVAgEAAAABnQJAAAAAAZ4CQAAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABvQIBAAAAAQIAAAATACAdAADPBQAgAwAAABEAIB0AAM8FACAeAADTBQAgDwAAABEAIAgAAPkEACALAADsAwAgFgAA0wUAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbYCAQDbAwAhtwIBAOkDACG4AgEA6QMAIbkCAQDpAwAhugIBAOkDACG7AgEA2wMAIbwCAQDbAwAhvQIBAOkDACENCAAA-QQAIAsAAOwDACCVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG2AgEA2wMAIbcCAQDpAwAhuAIBAOkDACG5AgEA6QMAIboCAQDpAwAhuwIBANsDACG8AgEA2wMAIb0CAQDpAwAhB_0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGuAgEAAAABsAICAAAAAbECEAAAAAENCAAA-gQAIAkAALoEACCVAgEAAAABnQJAAAAAAZ4CQAAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABvQIBAAAAAQIAAAATACAdAADVBQAgAwAAABEAIB0AANUFACAeAADZBQAgDwAAABEAIAgAAPkEACAJAADrAwAgFgAA2QUAIJUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbYCAQDbAwAhtwIBAOkDACG4AgEA6QMAIbkCAQDpAwAhugIBAOkDACG7AgEA2wMAIbwCAQDbAwAhvQIBAOkDACENCAAA-QQAIAkAAOsDACCVAgEA2wMAIZ0CQADdAwAhngJAAN0DACG2AgEA2wMAIbcCAQDpAwAhuAIBAOkDACG5AgEA6QMAIboCAQDpAwAhuwIBANsDACG8AgEA2wMAIb0CAQDpAwAhDAoAAOEEACAMAACmBAAgDwAAqAQAIBAAAKkEACD9AQEAAAABlQIBAAAAAZ0CQAAAAAGeAkAAAAABrgIBAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQIAAAAZACAdAADaBQAgAwAAABcAIB0AANoFACAeAADeBQAgDgAAABcAIAoAAOAEACAMAAD5AwAgDwAA-wMAIBAAAPwDACAWAADeBQAg_QEBANsDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGuAgEA2wMAIa8CAQDbAwAhsAICAPcDACGxAhAA3AMAIQwKAADgBAAgDAAA-QMAIA8AAPsDACAQAAD8AwAg_QEBANsDACGVAgEA2wMAIZ0CQADdAwAhngJAAN0DACGuAgEA2wMAIa8CAQDbAwAhsAICAPcDACGxAhAA3AMAIQwKAADhBAAgDAAApgQAIA4AAKcEACAQAACpBAAg_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa4CAQAAAAGvAgEAAAABsAICAAAAAbECEAAAAAECAAAAGQAgHQAA3wUAIAMAAAAXACAdAADfBQAgHgAA4wUAIA4AAAAXACAKAADgBAAgDAAA-QMAIA4AAPoDACAQAAD8AwAgFgAA4wUAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGvAgEA2wMAIbACAgD3AwAhsQIQANwDACEMCgAA4AQAIAwAAPkDACAOAAD6AwAgEAAA_AMAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrgIBANsDACGvAgEA2wMAIbACAgD3AwAhsQIQANwDACEMCgAA4QQAIAwAAKYEACAOAACnBAAgDwAAqAQAIP0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGuAgEAAAABrwIBAAAAAbACAgAAAAGxAhAAAAABAgAAABkAIB0AAOQFACADAAAAFwAgHQAA5AUAIB4AAOgFACAOAAAAFwAgCgAA4AQAIAwAAPkDACAOAAD6AwAgDwAA-wMAIBYAAOgFACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhDAoAAOAEACAMAAD5AwAgDgAA-gMAIA8AAPsDACD9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa4CAQDbAwAhrwIBANsDACGwAgIA9wMAIbECEADcAwAhCgQAAK8FACAFAACwBQAg_QEBAAAAAZUCAQAAAAGWAgEAAAABnQJAAAAAAZ4CQAAAAAG1AgEAAAABzQIgAAAAAc4CAQAAAAECAAAAAQAgHQAA6QUAIAMAAAAyACAdAADpBQAgHgAA7QUAIAwAAAAyACAEAACLBQAgBQAAjAUAIBYAAO0FACD9AQEA2wMAIZUCAQDbAwAhlgIBANsDACGdAkAA3QMAIZ4CQADdAwAhtQIBANsDACHNAiAAlQQAIc4CAQDpAwAhCgQAAIsFACAFAACMBQAg_QEBANsDACGVAgEA2wMAIZYCAQDbAwAhnQJAAN0DACGeAkAA3QMAIbUCAQDbAwAhzQIgAJUEACHOAgEA6QMAIQOdAkAAAAABswIBAAAAAbUCAAAAtQICBv0BAQAAAAGVAgEAAAABnQJAAAAAAZ4CQAAAAAGtAiAAAAABsgIBAAAAAQIAAAC7AQAgHQAA7wUAIAWVAgEAAAABnQJAAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgII_gEQAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAaUCAQAAAAGmAgEAAAABrAIAAACsAgOtAiAAAAABCpUCAQAAAAGdAkAAAAABngJAAAAAAaICAQAAAAGkAkAAAAABpQIBAAAAAaYCAQAAAAGnAgEAAAABqAIBAAAAAaoCAAAAqgICAwAAAL4BACAdAADvBQAgHgAA9gUAIAgAAAC-AQAgFgAA9gUAIP0BAQDbAwAhlQIBANsDACGdAkAA3QMAIZ4CQADdAwAhrQIgAJUEACGyAgEA2wMAIQb9AQEA2wMAIZUCAQDbAwAhnQJAAN0DACGeAkAA3QMAIa0CIACVBAAhsgIBANsDACEH_QEBAAAAAZUCAQAAAAGdAkAAAAABngJAAAAAAa8CAQAAAAGwAgIAAAABsQIQAAAAAQqVAgEAAAABnQJAAAAAAZ4CQAAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABugIBAAAAAbsCAQAAAAG8AgEAAAABBAQGAgUKAwYOBAcAEAEDAAEBAwABAgMAAQoABQQHAA8IEAYJFgQLGggCBhQFBwAHAQYVAAYHAA4KAAUMAAkOIAsPJAwQKA0CBwAKCxsIAQscAAENAAgBDQAIAQ0ACAMOKQAPKgAQKwACCSwACy0AAwQuAAUvAAYwAAAAAAMHABUjABYkABcAAAADBwAVIwAWJAAXAQMAAQEDAAEDBwAcIwAdJAAeAAAAAwcAHCMAHSQAHgEDAAEBAwABAwcAIyMAJCQAJQAAAAMHACMjACQkACUAAAADBwArIwAsJAAtAAAAAwcAKyMALCQALQEIlwEGAQidAQYDBwAyIwAzJAA0AAAAAwcAMiMAMyQANAIDAAEKAAUCAwABCgAFAwcAOSMAOiQAOwAAAAMHADkjADokADsAAAMHAEAjAEEkAEIAAAADBwBAIwBBJABCAgoABQwACQIKAAUMAAkFBwBHIwBKJABLlQEASJYBAEkAAAAAAAUHAEcjAEokAEuVAQBIlgEASQENAAgBDQAIAwcAUCMAUSQAUgAAAAMHAFAjAFEkAFIBDQAIAQ0ACAUHAFcjAFokAFuVAQBYlgEAWQAAAAAABQcAVyMAWiQAW5UBAFiWAQBZAQ0ACAENAAgDBwBgIwBhJABiAAAAAwcAYCMAYSQAYgAAAAUHAGgjAGskAGyVAQBplgEAagAAAAAABQcAaCMAayQAbJUBAGmWAQBqAAAABQcAciMAdSQAdpUBAHOWAQB0AAAAAAAFBwByIwB1JAB2lQEAc5YBAHQAAAUHAHsjAH4kAH-VAQB8lgEAfQAAAAAABQcAeyMAfiQAf5UBAHyWAQB9EQIBEjEBEzQBFDUBFTYBFzgBGDoRGTsSGj0BGz8RHEATH0EBIEIBIUMRJUYUJkcYJ0gCKEkCKUoCKksCK0wCLE4CLVARLlEZL1MCMFURMVYaMlcCM1gCNFkRNVwbNl0fN14DOF8DOWADOmEDO2IDPGQDPWYRPmcgP2kDQGsRQWwhQm0DQ24DRG8RRXIiRnMmR3UnSHYnSXknSnonS3snTH0nTX8RToABKE-CASdQhAERUYUBKVKGASdThwEnVIgBEVWLASpWjAEuV40BBViOAQVZjwEFWpABBVuRAQVckwEFXZUBEV6WAS9fmQEFYJsBEWGcATBingEFY58BBWSgARFlowExZqQBNWelAQRopgEEaacBBGqoAQRrqQEEbKsBBG2tARFurgE2b7ABBHCyARFxswE3crQBBHO1AQR0tgERdbkBOHa6ATx3vAEJeL0BCXnAAQl6wQEJe8IBCXzEAQl9xgERfscBPX_JAQmAAcsBEYEBzAE-ggHNAQmDAc4BCYQBzwERhQHSAT-GAdMBQ4cB1AEIiAHVAQiJAdYBCIoB1wEIiwHYAQiMAdoBCI0B3AERjgHdAUSPAd8BCJAB4QERkQHiAUWSAeMBCJMB5AEIlAHlARGXAegBRpgB6QFMmQHqAQuaAesBC5sB7AELnAHtAQudAe4BC54B8AELnwHyARGgAfMBTaEB9QELogH3ARGjAfgBTqQB-QELpQH6AQumAfsBEacB_gFPqAH_AVOpAYACDKoBgQIMqwGCAgysAYMCDK0BhAIMrgGGAgyvAYgCEbABiQJUsQGLAgyyAY0CEbMBjgJVtAGPAgy1AZACDLYBkQIRtwGUAla4AZUCXLkBlgINugGXAg27AZgCDbwBmQINvQGaAg2-AZwCDb8BngIRwAGfAl3BAaECDcIBowIRwwGkAl7EAaUCDcUBpgINxgGnAhHHAaoCX8gBqwJjyQGtAmTKAa4CZMsBsQJkzAGyAmTNAbMCZM4BtQJkzwG3AhHQAbgCZdEBugJk0gG8AhHTAb0CZtQBvgJk1QG_AmTWAcACEdcBwwJn2AHEAm3ZAcYCbtoBxwJu2wHKAm7cAcsCbt0BzAJu3gHOAm7fAdACEeAB0QJv4QHTAm7iAdUCEeMB1gJw5AHXAm7lAdgCbuYB2QIR5wHcAnHoAd0Cd-kB3wIG6gHgAgbrAeICBuwB4wIG7QHkAgbuAeYCBu8B6AIR8AHpAnjxAesCBvIB7QIR8wHuAnn0Ae8CBvUB8AIG9gHxAhH3AfQCevgB9QKAAQ" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"user\",\"sessions\",\"accounts\",\"complexes\",\"_count\",\"plan\",\"users\",\"complex\",\"invitations\",\"courts\",\"sport\",\"court\",\"availabilities\",\"priceRules\",\"bookings\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Complex.findUnique\",\"Complex.findUniqueOrThrow\",\"Complex.findFirst\",\"Complex.findFirstOrThrow\",\"Complex.findMany\",\"Complex.createOne\",\"Complex.createMany\",\"Complex.createManyAndReturn\",\"Complex.updateOne\",\"Complex.updateMany\",\"Complex.updateManyAndReturn\",\"Complex.upsertOne\",\"Complex.deleteOne\",\"Complex.deleteMany\",\"Complex.groupBy\",\"Complex.aggregate\",\"ComplexUser.findUnique\",\"ComplexUser.findUniqueOrThrow\",\"ComplexUser.findFirst\",\"ComplexUser.findFirstOrThrow\",\"ComplexUser.findMany\",\"ComplexUser.createOne\",\"ComplexUser.createMany\",\"ComplexUser.createManyAndReturn\",\"ComplexUser.updateOne\",\"ComplexUser.updateMany\",\"ComplexUser.updateManyAndReturn\",\"ComplexUser.upsertOne\",\"ComplexUser.deleteOne\",\"ComplexUser.deleteMany\",\"ComplexUser.groupBy\",\"ComplexUser.aggregate\",\"ComplexInvitation.findUnique\",\"ComplexInvitation.findUniqueOrThrow\",\"ComplexInvitation.findFirst\",\"ComplexInvitation.findFirstOrThrow\",\"ComplexInvitation.findMany\",\"ComplexInvitation.createOne\",\"ComplexInvitation.createMany\",\"ComplexInvitation.createManyAndReturn\",\"ComplexInvitation.updateOne\",\"ComplexInvitation.updateMany\",\"ComplexInvitation.updateManyAndReturn\",\"ComplexInvitation.upsertOne\",\"ComplexInvitation.deleteOne\",\"ComplexInvitation.deleteMany\",\"ComplexInvitation.groupBy\",\"ComplexInvitation.aggregate\",\"Sport.findUnique\",\"Sport.findUniqueOrThrow\",\"Sport.findFirst\",\"Sport.findFirstOrThrow\",\"Sport.findMany\",\"Sport.createOne\",\"Sport.createMany\",\"Sport.createManyAndReturn\",\"Sport.updateOne\",\"Sport.updateMany\",\"Sport.updateManyAndReturn\",\"Sport.upsertOne\",\"Sport.deleteOne\",\"Sport.deleteMany\",\"Sport.groupBy\",\"Sport.aggregate\",\"Court.findUnique\",\"Court.findUniqueOrThrow\",\"Court.findFirst\",\"Court.findFirstOrThrow\",\"Court.findMany\",\"Court.createOne\",\"Court.createMany\",\"Court.createManyAndReturn\",\"Court.updateOne\",\"Court.updateMany\",\"Court.updateManyAndReturn\",\"Court.upsertOne\",\"Court.deleteOne\",\"Court.deleteMany\",\"_avg\",\"_sum\",\"Court.groupBy\",\"Court.aggregate\",\"CourtAvailability.findUnique\",\"CourtAvailability.findUniqueOrThrow\",\"CourtAvailability.findFirst\",\"CourtAvailability.findFirstOrThrow\",\"CourtAvailability.findMany\",\"CourtAvailability.createOne\",\"CourtAvailability.createMany\",\"CourtAvailability.createManyAndReturn\",\"CourtAvailability.updateOne\",\"CourtAvailability.updateMany\",\"CourtAvailability.updateManyAndReturn\",\"CourtAvailability.upsertOne\",\"CourtAvailability.deleteOne\",\"CourtAvailability.deleteMany\",\"CourtAvailability.groupBy\",\"CourtAvailability.aggregate\",\"CourtPriceRule.findUnique\",\"CourtPriceRule.findUniqueOrThrow\",\"CourtPriceRule.findFirst\",\"CourtPriceRule.findFirstOrThrow\",\"CourtPriceRule.findMany\",\"CourtPriceRule.createOne\",\"CourtPriceRule.createMany\",\"CourtPriceRule.createManyAndReturn\",\"CourtPriceRule.updateOne\",\"CourtPriceRule.updateMany\",\"CourtPriceRule.updateManyAndReturn\",\"CourtPriceRule.upsertOne\",\"CourtPriceRule.deleteOne\",\"CourtPriceRule.deleteMany\",\"CourtPriceRule.groupBy\",\"CourtPriceRule.aggregate\",\"CourtBooking.findUnique\",\"CourtBooking.findUniqueOrThrow\",\"CourtBooking.findFirst\",\"CourtBooking.findFirstOrThrow\",\"CourtBooking.findMany\",\"CourtBooking.createOne\",\"CourtBooking.createMany\",\"CourtBooking.createManyAndReturn\",\"CourtBooking.updateOne\",\"CourtBooking.updateMany\",\"CourtBooking.updateManyAndReturn\",\"CourtBooking.upsertOne\",\"CourtBooking.deleteOne\",\"CourtBooking.deleteMany\",\"CourtBooking.groupBy\",\"CourtBooking.aggregate\",\"OnboardingRequest.findUnique\",\"OnboardingRequest.findUniqueOrThrow\",\"OnboardingRequest.findFirst\",\"OnboardingRequest.findFirstOrThrow\",\"OnboardingRequest.findMany\",\"OnboardingRequest.createOne\",\"OnboardingRequest.createMany\",\"OnboardingRequest.createManyAndReturn\",\"OnboardingRequest.updateOne\",\"OnboardingRequest.updateMany\",\"OnboardingRequest.updateManyAndReturn\",\"OnboardingRequest.upsertOne\",\"OnboardingRequest.deleteOne\",\"OnboardingRequest.deleteMany\",\"OnboardingRequest.groupBy\",\"OnboardingRequest.aggregate\",\"PasswordResetRequest.findUnique\",\"PasswordResetRequest.findUniqueOrThrow\",\"PasswordResetRequest.findFirst\",\"PasswordResetRequest.findFirstOrThrow\",\"PasswordResetRequest.findMany\",\"PasswordResetRequest.createOne\",\"PasswordResetRequest.createMany\",\"PasswordResetRequest.createManyAndReturn\",\"PasswordResetRequest.updateOne\",\"PasswordResetRequest.updateMany\",\"PasswordResetRequest.updateManyAndReturn\",\"PasswordResetRequest.upsertOne\",\"PasswordResetRequest.deleteOne\",\"PasswordResetRequest.deleteMany\",\"PasswordResetRequest.groupBy\",\"PasswordResetRequest.aggregate\",\"Plan.findUnique\",\"Plan.findUniqueOrThrow\",\"Plan.findFirst\",\"Plan.findFirstOrThrow\",\"Plan.findMany\",\"Plan.createOne\",\"Plan.createMany\",\"Plan.createManyAndReturn\",\"Plan.updateOne\",\"Plan.updateMany\",\"Plan.updateManyAndReturn\",\"Plan.upsertOne\",\"Plan.deleteOne\",\"Plan.deleteMany\",\"Plan.groupBy\",\"Plan.aggregate\",\"AND\",\"OR\",\"NOT\",\"code\",\"name\",\"price\",\"rules\",\"lastUpdatedAt\",\"equals\",\"in\",\"notIn\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"contains\",\"startsWith\",\"endsWith\",\"every\",\"some\",\"none\",\"id\",\"email\",\"otpHash\",\"otpExpiresAt\",\"otpAttempts\",\"otpLastSentAt\",\"otpResendCount\",\"usedAt\",\"createdAt\",\"updatedAt\",\"fullName\",\"emailVerifiedAt\",\"completedAt\",\"bookingCode\",\"courtId\",\"bookingDate\",\"startTime\",\"endTime\",\"customerName\",\"customerPhone\",\"CourtBookingStatus\",\"status\",\"DayOfWeek\",\"dayOfWeek\",\"isActive\",\"complexId\",\"sportId\",\"slotDurationMinutes\",\"basePrice\",\"slug\",\"tokenHash\",\"expiresAt\",\"acceptedAt\",\"revokedAt\",\"userId\",\"ComplexUserRole\",\"role\",\"complexName\",\"physicalAddress\",\"city\",\"state\",\"country\",\"complexSlug\",\"adminEmail\",\"planCode\",\"identifier\",\"value\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"emailVerified\",\"image\",\"courtId_bookingDate_startTime\",\"complexId_userId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "sAaIAfABDgQAANkDACAFAADaAwAgBgAA2wMAIIoCAADXAwAwiwIAADcAEIwCAADXAwAwjgIBAJ8DACGmAgEAAAABpwIBAAAAAa4CQACiAwAhrwJAAKIDACHKAgEAnwMAIeECIADKAwAh4gIBANgDACEBAAAAAQAgDAMAAPEDACCKAgAA8wMAMIsCAAADABCMAgAA8wMAMKYCAQCfAwAhrgJAAKIDACGvAkAAogMAIcUCQACiAwAhyAIBAJ8DACHeAgEAnwMAId8CAQDYAwAh4AIBANgDACEDAwAA7gUAIN8CAADrBAAg4AIAAOsEACAMAwAA8QMAIIoCAADzAwAwiwIAAAMAEIwCAADzAwAwpgIBAAAAAa4CQACiAwAhrwJAAKIDACHFAkAAogMAIcgCAQCfAwAh3gIBAAAAAd8CAQDYAwAh4AIBANgDACEDAAAAAwAgAQAABAAwAgAABQAgEQMAAPEDACCKAgAA8gMAMIsCAAAHABCMAgAA8gMAMKYCAQCfAwAhrgJAAKIDACGvAkAAogMAIcgCAQCfAwAh1QIBAJ8DACHWAgEAnwMAIdcCAQDYAwAh2AIBANgDACHZAgEA2AMAIdoCQACxAwAh2wJAALEDACHcAgEA2AMAId0CAQDYAwAhCAMAAO4FACDXAgAA6wQAINgCAADrBAAg2QIAAOsEACDaAgAA6wQAINsCAADrBAAg3AIAAOsEACDdAgAA6wQAIBEDAADxAwAgigIAAPIDADCLAgAABwAQjAIAAPIDADCmAgEAAAABrgJAAKIDACGvAkAAogMAIcgCAQCfAwAh1QIBAJ8DACHWAgEAnwMAIdcCAQDYAwAh2AIBANgDACHZAgEA2AMAIdoCQACxAwAh2wJAALEDACHcAgEA2AMAId0CAQDYAwAhAwAAAAcAIAEAAAgAMAIAAAkAIAkDAADxAwAgCgAA5QMAIIoCAADvAwAwiwIAAAsAEIwCAADvAwAwrgJAAKIDACG_AgEArwMAIcgCAQCfAwAhygIAAPADygIiAgMAAO4FACAKAADnBQAgCgMAAPEDACAKAADlAwAgigIAAO8DADCLAgAACwAQjAIAAO8DADCuAkAAogMAIb8CAQCvAwAhyAIBAJ8DACHKAgAA8APKAiLkAgAA7gMAIAMAAAALACABAAAMADACAAANACAJBgAAowMAIIoCAACeAwAwiwIAAA8AEIwCAACeAwAwjQIBAJ8DACGOAgEAnwMAIY8CEACgAwAhkAIAAKEDACCRAkAAogMAIQEAAAAPACASCAAA7AMAIAkAANsDACALAADtAwAgDAAAywMAIIoCAADrAwAwiwIAABEAEIwCAADrAwAwpgIBAK8DACGuAkAAogMAIa8CQACiAwAhywIBAJ8DACHMAgEA2AMAIc0CAQDYAwAhzgIBANgDACHPAgEA2AMAIdACAQCfAwAh0QIBAJ8DACHSAgEA2AMAIQkIAADsBQAgCQAA5QUAIAsAAO0FACAMAACcBQAgzAIAAOsEACDNAgAA6wQAIM4CAADrBAAgzwIAAOsEACDSAgAA6wQAIBIIAADsAwAgCQAA2wMAIAsAAO0DACAMAADLAwAgigIAAOsDADCLAgAAEQAQjAIAAOsDADCmAgEAAAABrgJAAKIDACGvAkAAogMAIcsCAQCfAwAhzAIBANgDACHNAgEA2AMAIc4CAQDYAwAhzwIBANgDACHQAgEAAAAB0QIBAJ8DACHSAgEA2AMAIQMAAAARACABAAASADACAAATACABAAAAEQAgAwAAAAsAIAEAAAwAMAIAAA0AIA0KAADlAwAgigIAAOoDADCLAgAAFwAQjAIAAOoDADCmAgEArwMAIacCAQCfAwAhrgJAAKIDACGvAkAAogMAIb8CAQCvAwAhxAIBAJ8DACHFAkAAogMAIcYCQACxAwAhxwJAALEDACEDCgAA5wUAIMYCAADrBAAgxwIAAOsEACANCgAA5QMAIIoCAADqAwAwiwIAABcAEIwCAADqAwAwpgIBAAAAAacCAQCfAwAhrgJAAKIDACGvAkAAogMAIb8CAQCvAwAhxAIBAAAAAcUCQACiAwAhxgJAALEDACHHAkAAsQMAIQMAAAAXACABAAAYADACAAAZACAQCgAA5QMAIA0AAOYDACAPAADnAwAgEAAA6AMAIBEAAOkDACCKAgAA5AMAMIsCAAAbABCMAgAA5AMAMI4CAQCfAwAhpgIBAK8DACGuAkAAogMAIa8CQACiAwAhvwIBAK8DACHAAgEArwMAIcECAgCwAwAhwgIQAKADACEFCgAA5wUAIA0AAOgFACAPAADpBQAgEAAA6gUAIBEAAOsFACAQCgAA5QMAIA0AAOYDACAPAADnAwAgEAAA6AMAIBEAAOkDACCKAgAA5AMAMIsCAAAbABCMAgAA5AMAMI4CAQCfAwAhpgIBAAAAAa4CQACiAwAhrwJAAKIDACG_AgEArwMAIcACAQCvAwAhwQICALADACHCAhAAoAMAIQMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgAQAAABsAIAoOAADfAwAgigIAAOIDADCLAgAAIQAQjAIAAOIDADCmAgEArwMAIa4CQACiAwAhtAIBAK8DACG2AgEAnwMAIbcCAQCfAwAhvQIAAOMDvQIiAQ4AAOYFACAKDgAA3wMAIIoCAADiAwAwiwIAACEAEIwCAADiAwAwpgIBAAAAAa4CQACiAwAhtAIBAK8DACG2AgEAnwMAIbcCAQCfAwAhvQIAAOMDvQIiAwAAACEAIAEAACIAMAIAACMAIA0OAADfAwAgigIAAOADADCLAgAAJQAQjAIAAOADADCPAhAAoAMAIaYCAQCvAwAhrgJAAKIDACGvAkAAogMAIbQCAQCvAwAhtgIBANgDACG3AgEA2AMAIb0CAADhA70CI74CIADKAwAhBA4AAOYFACC2AgAA6wQAILcCAADrBAAgvQIAAOsEACANDgAA3wMAIIoCAADgAwAwiwIAACUAEIwCAADgAwAwjwIQAKADACGmAgEAAAABrgJAAKIDACGvAkAAogMAIbQCAQCvAwAhtgIBANgDACG3AgEA2AMAIb0CAADhA70CI74CIADKAwAhAwAAACUAIAEAACYAMAIAACcAIA8OAADfAwAgigIAAN0DADCLAgAAKQAQjAIAAN0DADCmAgEArwMAIa4CQACiAwAhrwJAAKIDACGzAgEAnwMAIbQCAQCvAwAhtQJAAKIDACG2AgEAnwMAIbcCAQCfAwAhuAIBAJ8DACG5AgEAnwMAIbsCAADeA7sCIgEOAADmBQAgEA4AAN8DACCKAgAA3QMAMIsCAAApABCMAgAA3QMAMKYCAQAAAAGuAkAAogMAIa8CQACiAwAhswIBAAAAAbQCAQCvAwAhtQJAAKIDACG2AgEAnwMAIbcCAQCfAwAhuAIBAJ8DACG5AgEAnwMAIbsCAADeA7sCIuMCAADcAwAgAwAAACkAIAEAACoAMAIAACsAIAEAAAAhACABAAAAJQAgAQAAACkAIAEAAAALACABAAAAFwAgAQAAABsAIAEAAAADACABAAAABwAgAQAAAAsAIAEAAAABACAOBAAA2QMAIAUAANoDACAGAADbAwAgigIAANcDADCLAgAANwAQjAIAANcDADCOAgEAnwMAIaYCAQCfAwAhpwIBAJ8DACGuAkAAogMAIa8CQACiAwAhygIBAJ8DACHhAiAAygMAIeICAQDYAwAhBAQAAOMFACAFAADkBQAgBgAA5QUAIOICAADrBAAgAwAAADcAIAEAADgAMAIAAAEAIAMAAAA3ACABAAA4ADACAAABACADAAAANwAgAQAAOAAwAgAAAQAgCwQAAOAFACAFAADhBQAgBgAA4gUAII4CAQAAAAGmAgEAAAABpwIBAAAAAa4CQAAAAAGvAkAAAAABygIBAAAAAeECIAAAAAHiAgEAAAABARcAADwAIAiOAgEAAAABpgIBAAAAAacCAQAAAAGuAkAAAAABrwJAAAAAAcoCAQAAAAHhAiAAAAAB4gIBAAAAAQEXAAA-ADABFwAAPgAwCwQAALwFACAFAAC9BQAgBgAAvgUAII4CAQD5AwAhpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHKAgEA-QMAIeECIAC0BAAh4gIBAIcEACECAAAAAQAgFwAAQQAgCI4CAQD5AwAhpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHKAgEA-QMAIeECIAC0BAAh4gIBAIcEACECAAAANwAgFwAAQwAgAgAAADcAIBcAAEMAIAMAAAABACAeAAA8ACAfAABBACABAAAAAQAgAQAAADcAIAQHAAC5BQAgJAAAuwUAICUAALoFACDiAgAA6wQAIAuKAgAA1gMAMIsCAABKABCMAgAA1gMAMI4CAQCSAwAhpgIBAJIDACGnAgEAkgMAIa4CQACVAwAhrwJAAJUDACHKAgEAkgMAIeECIAC8AwAh4gIBALsDACEDAAAANwAgAQAASQAwIwAASgAgAwAAADcAIAEAADgAMAIAAAEAIAEAAAAFACABAAAABQAgAwAAAAMAIAEAAAQAMAIAAAUAIAMAAAADACABAAAEADACAAAFACADAAAAAwAgAQAABAAwAgAABQAgCQMAALgFACCmAgEAAAABrgJAAAAAAa8CQAAAAAHFAkAAAAAByAIBAAAAAd4CAQAAAAHfAgEAAAAB4AIBAAAAAQEXAABSACAIpgIBAAAAAa4CQAAAAAGvAkAAAAABxQJAAAAAAcgCAQAAAAHeAgEAAAAB3wIBAAAAAeACAQAAAAEBFwAAVAAwARcAAFQAMAkDAAC3BQAgpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhxQJAAPsDACHIAgEA-QMAId4CAQD5AwAh3wIBAIcEACHgAgEAhwQAIQIAAAAFACAXAABXACAIpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhxQJAAPsDACHIAgEA-QMAId4CAQD5AwAh3wIBAIcEACHgAgEAhwQAIQIAAAADACAXAABZACACAAAAAwAgFwAAWQAgAwAAAAUAIB4AAFIAIB8AAFcAIAEAAAAFACABAAAAAwAgBQcAALQFACAkAAC2BQAgJQAAtQUAIN8CAADrBAAg4AIAAOsEACALigIAANUDADCLAgAAYAAQjAIAANUDADCmAgEAkgMAIa4CQACVAwAhrwJAAJUDACHFAkAAlQMAIcgCAQCSAwAh3gIBAJIDACHfAgEAuwMAIeACAQC7AwAhAwAAAAMAIAEAAF8AMCMAAGAAIAMAAAADACABAAAEADACAAAFACABAAAACQAgAQAAAAkAIAMAAAAHACABAAAIADACAAAJACADAAAABwAgAQAACAAwAgAACQAgAwAAAAcAIAEAAAgAMAIAAAkAIA4DAACzBQAgpgIBAAAAAa4CQAAAAAGvAkAAAAAByAIBAAAAAdUCAQAAAAHWAgEAAAAB1wIBAAAAAdgCAQAAAAHZAgEAAAAB2gJAAAAAAdsCQAAAAAHcAgEAAAAB3QIBAAAAAQEXAABoACANpgIBAAAAAa4CQAAAAAGvAkAAAAAByAIBAAAAAdUCAQAAAAHWAgEAAAAB1wIBAAAAAdgCAQAAAAHZAgEAAAAB2gJAAAAAAdsCQAAAAAHcAgEAAAAB3QIBAAAAAQEXAABqADABFwAAagAwDgMAALIFACCmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHIAgEA-QMAIdUCAQD5AwAh1gIBAPkDACHXAgEAhwQAIdgCAQCHBAAh2QIBAIcEACHaAkAA0wQAIdsCQADTBAAh3AIBAIcEACHdAgEAhwQAIQIAAAAJACAXAABtACANpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhyAIBAPkDACHVAgEA-QMAIdYCAQD5AwAh1wIBAIcEACHYAgEAhwQAIdkCAQCHBAAh2gJAANMEACHbAkAA0wQAIdwCAQCHBAAh3QIBAIcEACECAAAABwAgFwAAbwAgAgAAAAcAIBcAAG8AIAMAAAAJACAeAABoACAfAABtACABAAAACQAgAQAAAAcAIAoHAACvBQAgJAAAsQUAICUAALAFACDXAgAA6wQAINgCAADrBAAg2QIAAOsEACDaAgAA6wQAINsCAADrBAAg3AIAAOsEACDdAgAA6wQAIBCKAgAA1AMAMIsCAAB2ABCMAgAA1AMAMKYCAQCSAwAhrgJAAJUDACGvAkAAlQMAIcgCAQCSAwAh1QIBAJIDACHWAgEAkgMAIdcCAQC7AwAh2AIBALsDACHZAgEAuwMAIdoCQACnAwAh2wJAAKcDACHcAgEAuwMAId0CAQC7AwAhAwAAAAcAIAEAAHUAMCMAAHYAIAMAAAAHACABAAAIADACAAAJACAJigIAANMDADCLAgAAfAAQjAIAANMDADCmAgEAAAABrgJAAKIDACGvAkAAogMAIcUCQACiAwAh0wIBAJ8DACHUAgEAnwMAIQEAAAB5ACABAAAAeQAgCYoCAADTAwAwiwIAAHwAEIwCAADTAwAwpgIBAJ8DACGuAkAAogMAIa8CQACiAwAhxQJAAKIDACHTAgEAnwMAIdQCAQCfAwAhAAMAAAB8ACABAAB9ADACAAB5ACADAAAAfAAgAQAAfQAwAgAAeQAgAwAAAHwAIAEAAH0AMAIAAHkAIAamAgEAAAABrgJAAAAAAa8CQAAAAAHFAkAAAAAB0wIBAAAAAdQCAQAAAAEBFwAAgQEAIAamAgEAAAABrgJAAAAAAa8CQAAAAAHFAkAAAAAB0wIBAAAAAdQCAQAAAAEBFwAAgwEAMAEXAACDAQAwBqYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcUCQAD7AwAh0wIBAPkDACHUAgEA-QMAIQIAAAB5ACAXAACGAQAgBqYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcUCQAD7AwAh0wIBAPkDACHUAgEA-QMAIQIAAAB8ACAXAACIAQAgAgAAAHwAIBcAAIgBACADAAAAeQAgHgAAgQEAIB8AAIYBACABAAAAeQAgAQAAAHwAIAMHAACsBQAgJAAArgUAICUAAK0FACAJigIAANIDADCLAgAAjwEAEIwCAADSAwAwpgIBAJIDACGuAkAAlQMAIa8CQACVAwAhxQJAAJUDACHTAgEAkgMAIdQCAQCSAwAhAwAAAHwAIAEAAI4BADAjAACPAQAgAwAAAHwAIAEAAH0AMAIAAHkAIAEAAAATACABAAAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACADAAAAEQAgAQAAEgAwAgAAEwAgDwgAAKsFACAJAADmBAAgCwAA5wQAIAwAAOgEACCmAgEAAAABrgJAAAAAAa8CQAAAAAHLAgEAAAABzAIBAAAAAc0CAQAAAAHOAgEAAAABzwIBAAAAAdACAQAAAAHRAgEAAAAB0gIBAAAAAQEXAACXAQAgC6YCAQAAAAGuAkAAAAABrwJAAAAAAcsCAQAAAAHMAgEAAAABzQIBAAAAAc4CAQAAAAHPAgEAAAAB0AIBAAAAAdECAQAAAAHSAgEAAAABARcAAJkBADABFwAAmQEAMAEAAAAPACAPCAAAqgUAIAkAAIkEACALAACKBAAgDAAAiwQAIKYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcsCAQD5AwAhzAIBAIcEACHNAgEAhwQAIc4CAQCHBAAhzwIBAIcEACHQAgEA-QMAIdECAQD5AwAh0gIBAIcEACECAAAAEwAgFwAAnQEAIAumAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIcwCAQCHBAAhzQIBAIcEACHOAgEAhwQAIc8CAQCHBAAh0AIBAPkDACHRAgEA-QMAIdICAQCHBAAhAgAAABEAIBcAAJ8BACACAAAAEQAgFwAAnwEAIAEAAAAPACADAAAAEwAgHgAAlwEAIB8AAJ0BACABAAAAEwAgAQAAABEAIAgHAACnBQAgJAAAqQUAICUAAKgFACDMAgAA6wQAIM0CAADrBAAgzgIAAOsEACDPAgAA6wQAINICAADrBAAgDooCAADRAwAwiwIAAKcBABCMAgAA0QMAMKYCAQClAwAhrgJAAJUDACGvAkAAlQMAIcsCAQCSAwAhzAIBALsDACHNAgEAuwMAIc4CAQC7AwAhzwIBALsDACHQAgEAkgMAIdECAQCSAwAh0gIBALsDACEDAAAAEQAgAQAApgEAMCMAAKcBACADAAAAEQAgAQAAEgAwAgAAEwAgAQAAAA0AIAEAAAANACADAAAACwAgAQAADAAwAgAADQAgAwAAAAsAIAEAAAwAMAIAAA0AIAMAAAALACABAAAMADACAAANACAGAwAA5AQAIAoAAKYFACCuAkAAAAABvwIBAAAAAcgCAQAAAAHKAgAAAMoCAgEXAACvAQAgBK4CQAAAAAG_AgEAAAAByAIBAAAAAcoCAAAAygICARcAALEBADABFwAAsQEAMAYDAADiBAAgCgAApQUAIK4CQAD7AwAhvwIBAPkDACHIAgEA-QMAIcoCAADgBMoCIgIAAAANACAXAAC0AQAgBK4CQAD7AwAhvwIBAPkDACHIAgEA-QMAIcoCAADgBMoCIgIAAAALACAXAAC2AQAgAgAAAAsAIBcAALYBACADAAAADQAgHgAArwEAIB8AALQBACABAAAADQAgAQAAAAsAIAMHAACiBQAgJAAApAUAICUAAKMFACAHigIAAM0DADCLAgAAvQEAEIwCAADNAwAwrgJAAJUDACG_AgEApQMAIcgCAQCSAwAhygIAAM4DygIiAwAAAAsAIAEAALwBADAjAAC9AQAgAwAAAAsAIAEAAAwAMAIAAA0AIAEAAAAZACABAAAAGQAgAwAAABcAIAEAABgAMAIAABkAIAMAAAAXACABAAAYADACAAAZACADAAAAFwAgAQAAGAAwAgAAGQAgCgoAAKEFACCmAgEAAAABpwIBAAAAAa4CQAAAAAGvAkAAAAABvwIBAAAAAcQCAQAAAAHFAkAAAAABxgJAAAAAAccCQAAAAAEBFwAAxQEAIAmmAgEAAAABpwIBAAAAAa4CQAAAAAGvAkAAAAABvwIBAAAAAcQCAQAAAAHFAkAAAAABxgJAAAAAAccCQAAAAAEBFwAAxwEAMAEXAADHAQAwCgoAAKAFACCmAgEA-QMAIacCAQD5AwAhrgJAAPsDACGvAkAA-wMAIb8CAQD5AwAhxAIBAPkDACHFAkAA-wMAIcYCQADTBAAhxwJAANMEACECAAAAGQAgFwAAygEAIAmmAgEA-QMAIacCAQD5AwAhrgJAAPsDACGvAkAA-wMAIb8CAQD5AwAhxAIBAPkDACHFAkAA-wMAIcYCQADTBAAhxwJAANMEACECAAAAFwAgFwAAzAEAIAIAAAAXACAXAADMAQAgAwAAABkAIB4AAMUBACAfAADKAQAgAQAAABkAIAEAAAAXACAFBwAAnQUAICQAAJ8FACAlAACeBQAgxgIAAOsEACDHAgAA6wQAIAyKAgAAzAMAMIsCAADTAQAQjAIAAMwDADCmAgEApQMAIacCAQCSAwAhrgJAAJUDACGvAkAAlQMAIb8CAQClAwAhxAIBAJIDACHFAkAAlQMAIcYCQACnAwAhxwJAAKcDACEDAAAAFwAgAQAA0gEAMCMAANMBACADAAAAFwAgAQAAGAAwAgAAGQAgCgwAAMsDACCKAgAAyQMAMIsCAADZAQAQjAIAAMkDADCOAgEAAAABpgIBAAAAAa4CQACiAwAhrwJAAKIDACG-AiAAygMAIcMCAQAAAAEBAAAA1gEAIAEAAADWAQAgCgwAAMsDACCKAgAAyQMAMIsCAADZAQAQjAIAAMkDADCOAgEAnwMAIaYCAQCvAwAhrgJAAKIDACGvAkAAogMAIb4CIADKAwAhwwIBAJ8DACEBDAAAnAUAIAMAAADZAQAgAQAA2gEAMAIAANYBACADAAAA2QEAIAEAANoBADACAADWAQAgAwAAANkBACABAADaAQAwAgAA1gEAIAcMAACbBQAgjgIBAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAb4CIAAAAAHDAgEAAAABARcAAN4BACAGjgIBAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAb4CIAAAAAHDAgEAAAABARcAAOABADABFwAA4AEAMAcMAACRBQAgjgIBAPkDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACG-AiAAtAQAIcMCAQD5AwAhAgAAANYBACAXAADjAQAgBo4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhvgIgALQEACHDAgEA-QMAIQIAAADZAQAgFwAA5QEAIAIAAADZAQAgFwAA5QEAIAMAAADWAQAgHgAA3gEAIB8AAOMBACABAAAA1gEAIAEAAADZAQAgAwcAAI4FACAkAACQBQAgJQAAjwUAIAmKAgAAyAMAMIsCAADsAQAQjAIAAMgDADCOAgEAkgMAIaYCAQClAwAhrgJAAJUDACGvAkAAlQMAIb4CIAC8AwAhwwIBAJIDACEDAAAA2QEAIAEAAOsBADAjAADsAQAgAwAAANkBACABAADaAQAwAgAA1gEAIAEAAAAdACABAAAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgDQoAAI0FACANAADFBAAgDwAAxgQAIBAAAMcEACARAADIBAAgjgIBAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAb8CAQAAAAHAAgEAAAABwQICAAAAAcICEAAAAAEBFwAA9AEAIAiOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABvwIBAAAAAcACAQAAAAHBAgIAAAABwgIQAAAAAQEXAAD2AQAwARcAAPYBADANCgAAjAUAIA0AAJgEACAPAACZBAAgEAAAmgQAIBEAAJsEACCOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIb8CAQD5AwAhwAIBAPkDACHBAgIAlgQAIcICEAD6AwAhAgAAAB0AIBcAAPkBACAIjgIBAPkDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACG_AgEA-QMAIcACAQD5AwAhwQICAJYEACHCAhAA-gMAIQIAAAAbACAXAAD7AQAgAgAAABsAIBcAAPsBACADAAAAHQAgHgAA9AEAIB8AAPkBACABAAAAHQAgAQAAABsAIAUHAACHBQAgJAAAigUAICUAAIkFACCmAQAAiAUAIKcBAACLBQAgC4oCAADHAwAwiwIAAIICABCMAgAAxwMAMI4CAQCSAwAhpgIBAKUDACGuAkAAlQMAIa8CQACVAwAhvwIBAKUDACHAAgEApQMAIcECAgCmAwAhwgIQAJMDACEDAAAAGwAgAQAAgQIAMCMAAIICACADAAAAGwAgAQAAHAAwAgAAHQAgAQAAACMAIAEAAAAjACADAAAAIQAgAQAAIgAwAgAAIwAgAwAAACEAIAEAACIAMAIAACMAIAMAAAAhACABAAAiADACAAAjACAHDgAAhgUAIKYCAQAAAAGuAkAAAAABtAIBAAAAAbYCAQAAAAG3AgEAAAABvQIAAAC9AgIBFwAAigIAIAamAgEAAAABrgJAAAAAAbQCAQAAAAG2AgEAAAABtwIBAAAAAb0CAAAAvQICARcAAIwCADABFwAAjAIAMAcOAACFBQAgpgIBAPkDACGuAkAA-wMAIbQCAQD5AwAhtgIBAPkDACG3AgEA-QMAIb0CAADBBL0CIgIAAAAjACAXAACPAgAgBqYCAQD5AwAhrgJAAPsDACG0AgEA-QMAIbYCAQD5AwAhtwIBAPkDACG9AgAAwQS9AiICAAAAIQAgFwAAkQIAIAIAAAAhACAXAACRAgAgAwAAACMAIB4AAIoCACAfAACPAgAgAQAAACMAIAEAAAAhACADBwAAggUAICQAAIQFACAlAACDBQAgCYoCAADDAwAwiwIAAJgCABCMAgAAwwMAMKYCAQClAwAhrgJAAJUDACG0AgEApQMAIbYCAQCSAwAhtwIBAJIDACG9AgAAxAO9AiIDAAAAIQAgAQAAlwIAMCMAAJgCACADAAAAIQAgAQAAIgAwAgAAIwAgAQAAACcAIAEAAAAnACADAAAAJQAgAQAAJgAwAgAAJwAgAwAAACUAIAEAACYAMAIAACcAIAMAAAAlACABAAAmADACAAAnACAKDgAAgQUAII8CEAAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAG0AgEAAAABtgIBAAAAAbcCAQAAAAG9AgAAAL0CA74CIAAAAAEBFwAAoAIAIAmPAhAAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABtAIBAAAAAbYCAQAAAAG3AgEAAAABvQIAAAC9AgO-AiAAAAABARcAAKICADABFwAAogIAMAoOAACABQAgjwIQAPoDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACG0AgEA-QMAIbYCAQCHBAAhtwIBAIcEACG9AgAAswS9AiO-AiAAtAQAIQIAAAAnACAXAAClAgAgCY8CEAD6AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhtAIBAPkDACG2AgEAhwQAIbcCAQCHBAAhvQIAALMEvQIjvgIgALQEACECAAAAJQAgFwAApwIAIAIAAAAlACAXAACnAgAgAwAAACcAIB4AAKACACAfAAClAgAgAQAAACcAIAEAAAAlACAIBwAA-wQAICQAAP4EACAlAAD9BAAgpgEAAPwEACCnAQAA_wQAILYCAADrBAAgtwIAAOsEACC9AgAA6wQAIAyKAgAAuQMAMIsCAACuAgAQjAIAALkDADCPAhAAkwMAIaYCAQClAwAhrgJAAJUDACGvAkAAlQMAIbQCAQClAwAhtgIBALsDACG3AgEAuwMAIb0CAAC6A70CI74CIAC8AwAhAwAAACUAIAEAAK0CADAjAACuAgAgAwAAACUAIAEAACYAMAIAACcAIAEAAAArACABAAAAKwAgAwAAACkAIAEAACoAMAIAACsAIAMAAAApACABAAAqADACAAArACADAAAAKQAgAQAAKgAwAgAAKwAgDA4AAPoEACCmAgEAAAABrgJAAAAAAa8CQAAAAAGzAgEAAAABtAIBAAAAAbUCQAAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABuwIAAAC7AgIBFwAAtgIAIAumAgEAAAABrgJAAAAAAa8CQAAAAAGzAgEAAAABtAIBAAAAAbUCQAAAAAG2AgEAAAABtwIBAAAAAbgCAQAAAAG5AgEAAAABuwIAAAC7AgIBFwAAuAIAMAEXAAC4AgAwDA4AAPkEACCmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACGzAgEA-QMAIbQCAQD5AwAhtQJAAPsDACG2AgEA-QMAIbcCAQD5AwAhuAIBAPkDACG5AgEA-QMAIbsCAACmBLsCIgIAAAArACAXAAC7AgAgC6YCAQD5AwAhrgJAAPsDACGvAkAA-wMAIbMCAQD5AwAhtAIBAPkDACG1AkAA-wMAIbYCAQD5AwAhtwIBAPkDACG4AgEA-QMAIbkCAQD5AwAhuwIAAKYEuwIiAgAAACkAIBcAAL0CACACAAAAKQAgFwAAvQIAIAMAAAArACAeAAC2AgAgHwAAuwIAIAEAAAArACABAAAAKQAgAwcAAPYEACAkAAD4BAAgJQAA9wQAIA6KAgAAtQMAMIsCAADEAgAQjAIAALUDADCmAgEApQMAIa4CQACVAwAhrwJAAJUDACGzAgEAkgMAIbQCAQClAwAhtQJAAJUDACG2AgEAkgMAIbcCAQCSAwAhuAIBAJIDACG5AgEAkgMAIbsCAAC2A7sCIgMAAAApACABAADDAgAwIwAAxAIAIAMAAAApACABAAAqADACAAArACAPigIAALQDADCLAgAAygIAEIwCAAC0AwAwpgIBAAAAAacCAQCfAwAhqAIBAJ8DACGpAkAAogMAIaoCAgCwAwAhqwJAAKIDACGsAgIAsAMAIa4CQACiAwAhrwJAAKIDACGwAgEAnwMAIbECQACxAwAhsgJAALEDACEBAAAAxwIAIAEAAADHAgAgD4oCAAC0AwAwiwIAAMoCABCMAgAAtAMAMKYCAQCvAwAhpwIBAJ8DACGoAgEAnwMAIakCQACiAwAhqgICALADACGrAkAAogMAIawCAgCwAwAhrgJAAKIDACGvAkAAogMAIbACAQCfAwAhsQJAALEDACGyAkAAsQMAIQKxAgAA6wQAILICAADrBAAgAwAAAMoCACABAADLAgAwAgAAxwIAIAMAAADKAgAgAQAAywIAMAIAAMcCACADAAAAygIAIAEAAMsCADACAADHAgAgDKYCAQAAAAGnAgEAAAABqAIBAAAAAakCQAAAAAGqAgIAAAABqwJAAAAAAawCAgAAAAGuAkAAAAABrwJAAAAAAbACAQAAAAGxAkAAAAABsgJAAAAAAQEXAADPAgAgDKYCAQAAAAGnAgEAAAABqAIBAAAAAakCQAAAAAGqAgIAAAABqwJAAAAAAawCAgAAAAGuAkAAAAABrwJAAAAAAbACAQAAAAGxAkAAAAABsgJAAAAAAQEXAADRAgAwARcAANECADAMpgIBAPkDACGnAgEA-QMAIagCAQD5AwAhqQJAAPsDACGqAgIAlgQAIasCQAD7AwAhrAICAJYEACGuAkAA-wMAIa8CQAD7AwAhsAIBAPkDACGxAkAA0wQAIbICQADTBAAhAgAAAMcCACAXAADUAgAgDKYCAQD5AwAhpwIBAPkDACGoAgEA-QMAIakCQAD7AwAhqgICAJYEACGrAkAA-wMAIawCAgCWBAAhrgJAAPsDACGvAkAA-wMAIbACAQD5AwAhsQJAANMEACGyAkAA0wQAIQIAAADKAgAgFwAA1gIAIAIAAADKAgAgFwAA1gIAIAMAAADHAgAgHgAAzwIAIB8AANQCACABAAAAxwIAIAEAAADKAgAgBwcAAPEEACAkAAD0BAAgJQAA8wQAIKYBAADyBAAgpwEAAPUEACCxAgAA6wQAILICAADrBAAgD4oCAACzAwAwiwIAAN0CABCMAgAAswMAMKYCAQClAwAhpwIBAJIDACGoAgEAkgMAIakCQACVAwAhqgICAKYDACGrAkAAlQMAIawCAgCmAwAhrgJAAJUDACGvAkAAlQMAIbACAQCSAwAhsQJAAKcDACGyAkAApwMAIQMAAADKAgAgAQAA3AIAMCMAAN0CACADAAAAygIAIAEAAMsCADACAADHAgAgDYoCAACuAwAwiwIAAOMCABCMAgAArgMAMKYCAQAAAAGnAgEAnwMAIagCAQCfAwAhqQJAAKIDACGqAgIAsAMAIasCQACiAwAhrAICALADACGtAkAAsQMAIa4CQACiAwAhrwJAAKIDACEBAAAA4AIAIAEAAADgAgAgDYoCAACuAwAwiwIAAOMCABCMAgAArgMAMKYCAQCvAwAhpwIBAJ8DACGoAgEAnwMAIakCQACiAwAhqgICALADACGrAkAAogMAIawCAgCwAwAhrQJAALEDACGuAkAAogMAIa8CQACiAwAhAa0CAADrBAAgAwAAAOMCACABAADkAgAwAgAA4AIAIAMAAADjAgAgAQAA5AIAMAIAAOACACADAAAA4wIAIAEAAOQCADACAADgAgAgCqYCAQAAAAGnAgEAAAABqAIBAAAAAakCQAAAAAGqAgIAAAABqwJAAAAAAawCAgAAAAGtAkAAAAABrgJAAAAAAa8CQAAAAAEBFwAA6AIAIAqmAgEAAAABpwIBAAAAAagCAQAAAAGpAkAAAAABqgICAAAAAasCQAAAAAGsAgIAAAABrQJAAAAAAa4CQAAAAAGvAkAAAAABARcAAOoCADABFwAA6gIAMAqmAgEA-QMAIacCAQD5AwAhqAIBAPkDACGpAkAA-wMAIaoCAgCWBAAhqwJAAPsDACGsAgIAlgQAIa0CQADTBAAhrgJAAPsDACGvAkAA-wMAIQIAAADgAgAgFwAA7QIAIAqmAgEA-QMAIacCAQD5AwAhqAIBAPkDACGpAkAA-wMAIaoCAgCWBAAhqwJAAPsDACGsAgIAlgQAIa0CQADTBAAhrgJAAPsDACGvAkAA-wMAIQIAAADjAgAgFwAA7wIAIAIAAADjAgAgFwAA7wIAIAMAAADgAgAgHgAA6AIAIB8AAO0CACABAAAA4AIAIAEAAADjAgAgBgcAAOwEACAkAADvBAAgJQAA7gQAIKYBAADtBAAgpwEAAPAEACCtAgAA6wQAIA2KAgAApAMAMIsCAAD2AgAQjAIAAKQDADCmAgEApQMAIacCAQCSAwAhqAIBAJIDACGpAkAAlQMAIaoCAgCmAwAhqwJAAJUDACGsAgIApgMAIa0CQACnAwAhrgJAAJUDACGvAkAAlQMAIQMAAADjAgAgAQAA9QIAMCMAAPYCACADAAAA4wIAIAEAAOQCADACAADgAgAgCQYAAKMDACCKAgAAngMAMIsCAAAPABCMAgAAngMAMI0CAQAAAAGOAgEAnwMAIY8CEACgAwAhkAIAAKEDACCRAkAAogMAIQEAAAD5AgAgAQAAAPkCACABBgAA6gQAIAMAAAAPACABAAD8AgAwAgAA-QIAIAMAAAAPACABAAD8AgAwAgAA-QIAIAMAAAAPACABAAD8AgAwAgAA-QIAIAYGAADpBAAgjQIBAAAAAY4CAQAAAAGPAhAAAAABkAKAAAAAAZECQAAAAAEBFwAAgAMAIAWNAgEAAAABjgIBAAAAAY8CEAAAAAGQAoAAAAABkQJAAAAAAQEXAACCAwAwARcAAIIDADAGBgAA_AMAII0CAQD5AwAhjgIBAPkDACGPAhAA-gMAIZACgAAAAAGRAkAA-wMAIQIAAAD5AgAgFwAAhQMAIAWNAgEA-QMAIY4CAQD5AwAhjwIQAPoDACGQAoAAAAABkQJAAPsDACECAAAADwAgFwAAhwMAIAIAAAAPACAXAACHAwAgAwAAAPkCACAeAACAAwAgHwAAhQMAIAEAAAD5AgAgAQAAAA8AIAUHAAD0AwAgJAAA9wMAICUAAPYDACCmAQAA9QMAIKcBAAD4AwAgCIoCAACRAwAwiwIAAI4DABCMAgAAkQMAMI0CAQCSAwAhjgIBAJIDACGPAhAAkwMAIZACAACUAwAgkQJAAJUDACEDAAAADwAgAQAAjQMAMCMAAI4DACADAAAADwAgAQAA_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_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-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIcwCAQCHBAAhzQIBAIcEACHOAgEAhwQAIc8CAQCHBAAh0AIBAPkDACHRAgEA-QMAIQHqAgEAAAABDQkAAIkEACALAACKBAAgDAAAiwQAIKYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcsCAQD5AwAhzAIBAIcEACHNAgEAhwQAIc4CAQCHBAAhzwIBAIcEACHQAgEA-QMAIdECAQD5AwAhCx4AANYEADAfAADbBAAw5wIAANcEADDoAgAA2AQAMOkCAADZBAAg6gIAANoEADDrAgAA2gQAMOwCAADaBAAw7QIAANoEADDuAgAA3AQAMO8CAADdBAAwCx4AAMkEADAfAADOBAAw5wIAAMoEADDoAgAAywQAMOkCAADMBAAg6gIAAM0EADDrAgAAzQQAMOwCAADNBAAw7QIAAM0EADDuAgAAzwQAMO8CAADQBAAwCx4AAIwEADAfAACRBAAw5wIAAI0EADDoAgAAjgQAMOkCAACPBAAg6gIAAJAEADDrAgAAkAQAMOwCAACQBAAw7QIAAJAEADDuAgAAkgQAMO8CAACTBAAwCw0AAMUEACAPAADGBAAgEAAAxwQAIBEAAMgEACCOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABwAIBAAAAAcECAgAAAAHCAhAAAAABAgAAAB0AIB4AAMQEACADAAAAHQAgHgAAxAQAIB8AAJcEACABFwAArwYAMBAKAADlAwAgDQAA5gMAIA8AAOcDACAQAADoAwAgEQAA6QMAIIoCAADkAwAwiwIAABsAEIwCAADkAwAwjgIBAJ8DACGmAgEAAAABrgJAAKIDACGvAkAAogMAIb8CAQCvAwAhwAIBAK8DACHBAgIAsAMAIcICEACgAwAhAgAAAB0AIBcAAJcEACACAAAAlAQAIBcAAJUEACALigIAAJMEADCLAgAAlAQAEIwCAACTBAAwjgIBAJ8DACGmAgEArwMAIa4CQACiAwAhrwJAAKIDACG_AgEArwMAIcACAQCvAwAhwQICALADACHCAhAAoAMAIQuKAgAAkwQAMIsCAACUBAAQjAIAAJMEADCOAgEAnwMAIaYCAQCvAwAhrgJAAKIDACGvAkAAogMAIb8CAQCvAwAhwAIBAK8DACHBAgIAsAMAIcICEACgAwAhB44CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhwAIBAPkDACHBAgIAlgQAIcICEAD6AwAhBeoCAgAAAAHwAgIAAAAB8QICAAAAAfICAgAAAAHzAgIAAAABCw0AAJgEACAPAACZBAAgEAAAmgQAIBEAAJsEACCOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcACAQD5AwAhwQICAJYEACHCAhAA-gMAIQUeAACnBgAgHwAArQYAIOcCAACoBgAg6AIAAKwGACDtAgAA1gEAIAseAAC3BAAwHwAAvAQAMOcCAAC4BAAw6AIAALkEADDpAgAAugQAIOoCAAC7BAAw6wIAALsEADDsAgAAuwQAMO0CAAC7BAAw7gIAAL0EADDvAgAAvgQAMAseAACpBAAwHwAArgQAMOcCAACqBAAw6AIAAKsEADDpAgAArAQAIOoCAACtBAAw6wIAAK0EADDsAgAArQQAMO0CAACtBAAw7gIAAK8EADDvAgAAsAQAMAseAACcBAAwHwAAoQQAMOcCAACdBAAw6AIAAJ4EADDpAgAAnwQAIOoCAACgBAAw6wIAAKAEADDsAgAAoAQAMO0CAACgBAAw7gIAAKIEADDvAgAAowQAMAqmAgEAAAABrgJAAAAAAa8CQAAAAAGzAgEAAAABtQJAAAAAAbYCAQAAAAG3AgEAAAABuAIBAAAAAbkCAQAAAAG7AgAAALsCAgIAAAArACAeAACoBAAgAwAAACsAIB4AAKgEACAfAACnBAAgARcAAKsGADAQDgAA3wMAIIoCAADdAwAwiwIAACkAEIwCAADdAwAwpgIBAAAAAa4CQACiAwAhrwJAAKIDACGzAgEAAAABtAIBAK8DACG1AkAAogMAIbYCAQCfAwAhtwIBAJ8DACG4AgEAnwMAIbkCAQCfAwAhuwIAAN4DuwIi4wIAANwDACACAAAAKwAgFwAApwQAIAIAAACkBAAgFwAApQQAIA6KAgAAowQAMIsCAACkBAAQjAIAAKMEADCmAgEArwMAIa4CQACiAwAhrwJAAKIDACGzAgEAnwMAIbQCAQCvAwAhtQJAAKIDACG2AgEAnwMAIbcCAQCfAwAhuAIBAJ8DACG5AgEAnwMAIbsCAADeA7sCIg6KAgAAowQAMIsCAACkBAAQjAIAAKMEADCmAgEArwMAIa4CQACiAwAhrwJAAKIDACGzAgEAnwMAIbQCAQCvAwAhtQJAAKIDACG2AgEAnwMAIbcCAQCfAwAhuAIBAJ8DACG5AgEAnwMAIbsCAADeA7sCIgqmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACGzAgEA-QMAIbUCQAD7AwAhtgIBAPkDACG3AgEA-QMAIbgCAQD5AwAhuQIBAPkDACG7AgAApgS7AiIB6gIAAAC7AgIKpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhswIBAPkDACG1AkAA-wMAIbYCAQD5AwAhtwIBAPkDACG4AgEA-QMAIbkCAQD5AwAhuwIAAKYEuwIiCqYCAQAAAAGuAkAAAAABrwJAAAAAAbMCAQAAAAG1AkAAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQIBAAAAAbsCAAAAuwICCI8CEAAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAG2AgEAAAABtwIBAAAAAb0CAAAAvQIDvgIgAAAAAQIAAAAnACAeAAC2BAAgAwAAACcAIB4AALYEACAfAAC1BAAgARcAAKoGADANDgAA3wMAIIoCAADgAwAwiwIAACUAEIwCAADgAwAwjwIQAKADACGmAgEAAAABrgJAAKIDACGvAkAAogMAIbQCAQCvAwAhtgIBANgDACG3AgEA2AMAIb0CAADhA70CI74CIADKAwAhAgAAACcAIBcAALUEACACAAAAsQQAIBcAALIEACAMigIAALAEADCLAgAAsQQAEIwCAACwBAAwjwIQAKADACGmAgEArwMAIa4CQACiAwAhrwJAAKIDACG0AgEArwMAIbYCAQDYAwAhtwIBANgDACG9AgAA4QO9AiO-AiAAygMAIQyKAgAAsAQAMIsCAACxBAAQjAIAALAEADCPAhAAoAMAIaYCAQCvAwAhrgJAAKIDACGvAkAAogMAIbQCAQCvAwAhtgIBANgDACG3AgEA2AMAIb0CAADhA70CI74CIADKAwAhCI8CEAD6AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhtgIBAIcEACG3AgEAhwQAIb0CAACzBL0CI74CIAC0BAAhAeoCAAAAvQIDAeoCIAAAAAEIjwIQAPoDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACG2AgEAhwQAIbcCAQCHBAAhvQIAALMEvQIjvgIgALQEACEIjwIQAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAbYCAQAAAAG3AgEAAAABvQIAAAC9AgO-AiAAAAABBaYCAQAAAAGuAkAAAAABtgIBAAAAAbcCAQAAAAG9AgAAAL0CAgIAAAAjACAeAADDBAAgAwAAACMAIB4AAMMEACAfAADCBAAgARcAAKkGADAKDgAA3wMAIIoCAADiAwAwiwIAACEAEIwCAADiAwAwpgIBAAAAAa4CQACiAwAhtAIBAK8DACG2AgEAnwMAIbcCAQCfAwAhvQIAAOMDvQIiAgAAACMAIBcAAMIEACACAAAAvwQAIBcAAMAEACAJigIAAL4EADCLAgAAvwQAEIwCAAC-BAAwpgIBAK8DACGuAkAAogMAIbQCAQCvAwAhtgIBAJ8DACG3AgEAnwMAIb0CAADjA70CIgmKAgAAvgQAMIsCAAC_BAAQjAIAAL4EADCmAgEArwMAIa4CQACiAwAhtAIBAK8DACG2AgEAnwMAIbcCAQCfAwAhvQIAAOMDvQIiBaYCAQD5AwAhrgJAAPsDACG2AgEA-QMAIbcCAQD5AwAhvQIAAMEEvQIiAeoCAAAAvQICBaYCAQD5AwAhrgJAAPsDACG2AgEA-QMAIbcCAQD5AwAhvQIAAMEEvQIiBaYCAQAAAAGuAkAAAAABtgIBAAAAAbcCAQAAAAG9AgAAAL0CAgsNAADFBAAgDwAAxgQAIBAAAMcEACARAADIBAAgjgIBAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAcACAQAAAAHBAgIAAAABwgIQAAAAAQMeAACnBgAg5wIAAKgGACDtAgAA1gEAIAQeAAC3BAAw5wIAALgEADDpAgAAugQAIO0CAAC7BAAwBB4AAKkEADDnAgAAqgQAMOkCAACsBAAg7QIAAK0EADAEHgAAnAQAMOcCAACdBAAw6QIAAJ8EACDtAgAAoAQAMAimAgEAAAABpwIBAAAAAa4CQAAAAAGvAkAAAAABxAIBAAAAAcUCQAAAAAHGAkAAAAABxwJAAAAAAQIAAAAZACAeAADVBAAgAwAAABkAIB4AANUEACAfAADUBAAgARcAAKYGADANCgAA5QMAIIoCAADqAwAwiwIAABcAEIwCAADqAwAwpgIBAAAAAacCAQCfAwAhrgJAAKIDACGvAkAAogMAIb8CAQCvAwAhxAIBAAAAAcUCQACiAwAhxgJAALEDACHHAkAAsQMAIQIAAAAZACAXAADUBAAgAgAAANEEACAXAADSBAAgDIoCAADQBAAwiwIAANEEABCMAgAA0AQAMKYCAQCvAwAhpwIBAJ8DACGuAkAAogMAIa8CQACiAwAhvwIBAK8DACHEAgEAnwMAIcUCQACiAwAhxgJAALEDACHHAkAAsQMAIQyKAgAA0AQAMIsCAADRBAAQjAIAANAEADCmAgEArwMAIacCAQCfAwAhrgJAAKIDACGvAkAAogMAIb8CAQCvAwAhxAIBAJ8DACHFAkAAogMAIcYCQACxAwAhxwJAALEDACEIpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHEAgEA-QMAIcUCQAD7AwAhxgJAANMEACHHAkAA0wQAIQHqAkAAAAABCKYCAQD5AwAhpwIBAPkDACGuAkAA-wMAIa8CQAD7AwAhxAIBAPkDACHFAkAA-wMAIcYCQADTBAAhxwJAANMEACEIpgIBAAAAAacCAQAAAAGuAkAAAAABrwJAAAAAAcQCAQAAAAHFAkAAAAABxgJAAAAAAccCQAAAAAEEAwAA5AQAIK4CQAAAAAHIAgEAAAABygIAAADKAgICAAAADQAgHgAA4wQAIAMAAAANACAeAADjBAAgHwAA4QQAIAEXAAClBgAwCgMAAPEDACAKAADlAwAgigIAAO8DADCLAgAACwAQjAIAAO8DADCuAkAAogMAIb8CAQCvAwAhyAIBAJ8DACHKAgAA8APKAiLkAgAA7gMAIAIAAAANACAXAADhBAAgAgAAAN4EACAXAADfBAAgB4oCAADdBAAwiwIAAN4EABCMAgAA3QQAMK4CQACiAwAhvwIBAK8DACHIAgEAnwMAIcoCAADwA8oCIgeKAgAA3QQAMIsCAADeBAAQjAIAAN0EADCuAkAAogMAIb8CAQCvAwAhyAIBAJ8DACHKAgAA8APKAiIDrgJAAPsDACHIAgEA-QMAIcoCAADgBMoCIgHqAgAAAMoCAgQDAADiBAAgrgJAAPsDACHIAgEA-QMAIcoCAADgBMoCIgUeAACgBgAgHwAAowYAIOcCAAChBgAg6AIAAKIGACDtAgAAAQAgBAMAAOQEACCuAkAAAAAByAIBAAAAAcoCAAAAygICAx4AAKAGACDnAgAAoQYAIO0CAAABACANCQAA5gQAIAsAAOcEACAMAADoBAAgpgIBAAAAAa4CQAAAAAGvAkAAAAABywIBAAAAAcwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAAAAB0QIBAAAAAQQeAADWBAAw5wIAANcEADDpAgAA2QQAIO0CAADaBAAwBB4AAMkEADDnAgAAygQAMOkCAADMBAAg7QIAAM0EADAEHgAAjAQAMOcCAACNBAAw6QIAAI8EACDtAgAAkAQAMAQeAAD9AwAw5wIAAP4DADDpAgAAgAQAIO0CAACBBAAwAAAAAAAAAAAAAAAAAAAABR4AAJsGACAfAACeBgAg5wIAAJwGACDoAgAAnQYAIO0CAAAdACADHgAAmwYAIOcCAACcBgAg7QIAAB0AIAAAAAAABR4AAJYGACAfAACZBgAg5wIAAJcGACDoAgAAmAYAIO0CAAAdACADHgAAlgYAIOcCAACXBgAg7QIAAB0AIAAAAAUeAACRBgAgHwAAlAYAIOcCAACSBgAg6AIAAJMGACDtAgAAHQAgAx4AAJEGACDnAgAAkgYAIO0CAAAdACAAAAAAAAUeAACMBgAgHwAAjwYAIOcCAACNBgAg6AIAAI4GACDtAgAAEwAgAx4AAIwGACDnAgAAjQYAIO0CAAATACAAAAALHgAAkgUAMB8AAJYFADDnAgAAkwUAMOgCAACUBQAw6QIAAJUFACDqAgAAkAQAMOsCAACQBAAw7AIAAJAEADDtAgAAkAQAMO4CAACXBQAw7wIAAJMEADALCgAAjQUAIA8AAMYEACAQAADHBAAgEQAAyAQAII4CAQAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAG_AgEAAAABwQICAAAAAcICEAAAAAECAAAAHQAgHgAAmgUAIAMAAAAdACAeAACaBQAgHwAAmQUAIAEXAACLBgAwAgAAAB0AIBcAAJkFACACAAAAlAQAIBcAAJgFACAHjgIBAPkDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACG_AgEA-QMAIcECAgCWBAAhwgIQAPoDACELCgAAjAUAIA8AAJkEACAQAACaBAAgEQAAmwQAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhvwIBAPkDACHBAgIAlgQAIcICEAD6AwAhCwoAAI0FACAPAADGBAAgEAAAxwQAIBEAAMgEACCOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABvwIBAAAAAcECAgAAAAHCAhAAAAABBB4AAJIFADDnAgAAkwUAMOkCAACVBQAg7QIAAJAEADAAAAAABR4AAIYGACAfAACJBgAg5wIAAIcGACDoAgAAiAYAIO0CAAATACADHgAAhgYAIOcCAACHBgAg7QIAABMAIAAAAAUeAACBBgAgHwAAhAYAIOcCAACCBgAg6AIAAIMGACDtAgAAEwAgAx4AAIEGACDnAgAAggYAIO0CAAATACAAAAAHHgAA_AUAIB8AAP8FACDnAgAA_QUAIOgCAAD-BQAg6wIAAA8AIOwCAAAPACDtAgAA-QIAIAMeAAD8BQAg5wIAAP0FACDtAgAA-QIAIAAAAAAAAAUeAAD3BQAgHwAA-gUAIOcCAAD4BQAg6AIAAPkFACDtAgAAAQAgAx4AAPcFACDnAgAA-AUAIO0CAAABACAAAAAFHgAA8gUAIB8AAPUFACDnAgAA8wUAIOgCAAD0BQAg7QIAAAEAIAMeAADyBQAg5wIAAPMFACDtAgAAAQAgAAAACx4AANQFADAfAADZBQAw5wIAANUFADDoAgAA1gUAMOkCAADXBQAg6gIAANgFADDrAgAA2AUAMOwCAADYBQAw7QIAANgFADDuAgAA2gUAMO8CAADbBQAwCx4AAMgFADAfAADNBQAw5wIAAMkFADDoAgAAygUAMOkCAADLBQAg6gIAAMwFADDrAgAAzAUAMOwCAADMBQAw7QIAAMwFADDuAgAAzgUAMO8CAADPBQAwCx4AAL8FADAfAADDBQAw5wIAAMAFADDoAgAAwQUAMOkCAADCBQAg6gIAANoEADDrAgAA2gQAMOwCAADaBAAw7QIAANoEADDuAgAAxAUAMO8CAADdBAAwBAoAAKYFACCuAkAAAAABvwIBAAAAAcoCAAAAygICAgAAAA0AIB4AAMcFACADAAAADQAgHgAAxwUAIB8AAMYFACABFwAA8QUAMAIAAAANACAXAADGBQAgAgAAAN4EACAXAADFBQAgA64CQAD7AwAhvwIBAPkDACHKAgAA4ATKAiIECgAApQUAIK4CQAD7AwAhvwIBAPkDACHKAgAA4ATKAiIECgAApgUAIK4CQAAAAAG_AgEAAAABygIAAADKAgIMpgIBAAAAAa4CQAAAAAGvAkAAAAAB1QIBAAAAAdYCAQAAAAHXAgEAAAAB2AIBAAAAAdkCAQAAAAHaAkAAAAAB2wJAAAAAAdwCAQAAAAHdAgEAAAABAgAAAAkAIB4AANMFACADAAAACQAgHgAA0wUAIB8AANIFACABFwAA8AUAMBEDAADxAwAgigIAAPIDADCLAgAABwAQjAIAAPIDADCmAgEAAAABrgJAAKIDACGvAkAAogMAIcgCAQCfAwAh1QIBAJ8DACHWAgEAnwMAIdcCAQDYAwAh2AIBANgDACHZAgEA2AMAIdoCQACxAwAh2wJAALEDACHcAgEA2AMAId0CAQDYAwAhAgAAAAkAIBcAANIFACACAAAA0AUAIBcAANEFACAQigIAAM8FADCLAgAA0AUAEIwCAADPBQAwpgIBAJ8DACGuAkAAogMAIa8CQACiAwAhyAIBAJ8DACHVAgEAnwMAIdYCAQCfAwAh1wIBANgDACHYAgEA2AMAIdkCAQDYAwAh2gJAALEDACHbAkAAsQMAIdwCAQDYAwAh3QIBANgDACEQigIAAM8FADCLAgAA0AUAEIwCAADPBQAwpgIBAJ8DACGuAkAAogMAIa8CQACiAwAhyAIBAJ8DACHVAgEAnwMAIdYCAQCfAwAh1wIBANgDACHYAgEA2AMAIdkCAQDYAwAh2gJAALEDACHbAkAAsQMAIdwCAQDYAwAh3QIBANgDACEMpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAh1QIBAPkDACHWAgEA-QMAIdcCAQCHBAAh2AIBAIcEACHZAgEAhwQAIdoCQADTBAAh2wJAANMEACHcAgEAhwQAId0CAQCHBAAhDKYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIdUCAQD5AwAh1gIBAPkDACHXAgEAhwQAIdgCAQCHBAAh2QIBAIcEACHaAkAA0wQAIdsCQADTBAAh3AIBAIcEACHdAgEAhwQAIQymAgEAAAABrgJAAAAAAa8CQAAAAAHVAgEAAAAB1gIBAAAAAdcCAQAAAAHYAgEAAAAB2QIBAAAAAdoCQAAAAAHbAkAAAAAB3AIBAAAAAd0CAQAAAAEHpgIBAAAAAa4CQAAAAAGvAkAAAAABxQJAAAAAAd4CAQAAAAHfAgEAAAAB4AIBAAAAAQIAAAAFACAeAADfBQAgAwAAAAUAIB4AAN8FACAfAADeBQAgARcAAO8FADAMAwAA8QMAIIoCAADzAwAwiwIAAAMAEIwCAADzAwAwpgIBAAAAAa4CQACiAwAhrwJAAKIDACHFAkAAogMAIcgCAQCfAwAh3gIBAAAAAd8CAQDYAwAh4AIBANgDACECAAAABQAgFwAA3gUAIAIAAADcBQAgFwAA3QUAIAuKAgAA2wUAMIsCAADcBQAQjAIAANsFADCmAgEAnwMAIa4CQACiAwAhrwJAAKIDACHFAkAAogMAIcgCAQCfAwAh3gIBAJ8DACHfAgEA2AMAIeACAQDYAwAhC4oCAADbBQAwiwIAANwFABCMAgAA2wUAMKYCAQCfAwAhrgJAAKIDACGvAkAAogMAIcUCQACiAwAhyAIBAJ8DACHeAgEAnwMAId8CAQDYAwAh4AIBANgDACEHpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhxQJAAPsDACHeAgEA-QMAId8CAQCHBAAh4AIBAIcEACEHpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhxQJAAPsDACHeAgEA-QMAId8CAQCHBAAh4AIBAIcEACEHpgIBAAAAAa4CQAAAAAGvAkAAAAABxQJAAAAAAd4CAQAAAAHfAgEAAAAB4AIBAAAAAQQeAADUBQAw5wIAANUFADDpAgAA1wUAIO0CAADYBQAwBB4AAMgFADDnAgAAyQUAMOkCAADLBQAg7QIAAMwFADAEHgAAvwUAMOcCAADABQAw6QIAAMIFACDtAgAA2gQAMAAAAAUKAADnBQAgDQAA6AUAIA8AAOkFACAQAADqBQAgEQAA6wUAIAkIAADsBQAgCQAA5QUAIAsAAO0FACAMAACcBQAgzAIAAOsEACDNAgAA6wQAIM4CAADrBAAgzwIAAOsEACDSAgAA6wQAIAEMAACcBQAgAAAAAQYAAOoEACAABAQAAOMFACAFAADkBQAgBgAA5QUAIOICAADrBAAgB6YCAQAAAAGuAkAAAAABrwJAAAAAAcUCQAAAAAHeAgEAAAAB3wIBAAAAAeACAQAAAAEMpgIBAAAAAa4CQAAAAAGvAkAAAAAB1QIBAAAAAdYCAQAAAAHXAgEAAAAB2AIBAAAAAdkCAQAAAAHaAkAAAAAB2wJAAAAAAdwCAQAAAAHdAgEAAAABA64CQAAAAAG_AgEAAAABygIAAADKAgIKBQAA4QUAIAYAAOIFACCOAgEAAAABpgIBAAAAAacCAQAAAAGuAkAAAAABrwJAAAAAAcoCAQAAAAHhAiAAAAAB4gIBAAAAAQIAAAABACAeAADyBQAgAwAAADcAIB4AAPIFACAfAAD2BQAgDAAAADcAIAUAAL0FACAGAAC-BQAgFwAA9gUAII4CAQD5AwAhpgIBAPkDACGnAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHKAgEA-QMAIeECIAC0BAAh4gIBAIcEACEKBQAAvQUAIAYAAL4FACCOAgEA-QMAIaYCAQD5AwAhpwIBAPkDACGuAkAA-wMAIa8CQAD7AwAhygIBAPkDACHhAiAAtAQAIeICAQCHBAAhCgQAAOAFACAGAADiBQAgjgIBAAAAAaYCAQAAAAGnAgEAAAABrgJAAAAAAa8CQAAAAAHKAgEAAAAB4QIgAAAAAeICAQAAAAECAAAAAQAgHgAA9wUAIAMAAAA3ACAeAAD3BQAgHwAA-wUAIAwAAAA3ACAEAAC8BQAgBgAAvgUAIBcAAPsFACCOAgEA-QMAIaYCAQD5AwAhpwIBAPkDACGuAkAA-wMAIa8CQAD7AwAhygIBAPkDACHhAiAAtAQAIeICAQCHBAAhCgQAALwFACAGAAC-BQAgjgIBAPkDACGmAgEA-QMAIacCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcoCAQD5AwAh4QIgALQEACHiAgEAhwQAIQWNAgEAAAABjgIBAAAAAY8CEAAAAAGQAoAAAAABkQJAAAAAAQIAAAD5AgAgHgAA_AUAIAMAAAAPACAeAAD8BQAgHwAAgAYAIAcAAAAPACAXAACABgAgjQIBAPkDACGOAgEA-QMAIY8CEAD6AwAhkAKAAAAAAZECQAD7AwAhBY0CAQD5AwAhjgIBAPkDACGPAhAA-gMAIZACgAAAAAGRAkAA-wMAIQ4IAACrBQAgCwAA5wQAIAwAAOgEACCmAgEAAAABrgJAAAAAAa8CQAAAAAHLAgEAAAABzAIBAAAAAc0CAQAAAAHOAgEAAAABzwIBAAAAAdACAQAAAAHRAgEAAAAB0gIBAAAAAQIAAAATACAeAACBBgAgAwAAABEAIB4AAIEGACAfAACFBgAgEAAAABEAIAgAAKoFACALAACKBAAgDAAAiwQAIBcAAIUGACCmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIcwCAQCHBAAhzQIBAIcEACHOAgEAhwQAIc8CAQCHBAAh0AIBAPkDACHRAgEA-QMAIdICAQCHBAAhDggAAKoFACALAACKBAAgDAAAiwQAIKYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcsCAQD5AwAhzAIBAIcEACHNAgEAhwQAIc4CAQCHBAAhzwIBAIcEACHQAgEA-QMAIdECAQD5AwAh0gIBAIcEACEOCAAAqwUAIAkAAOYEACAMAADoBAAgpgIBAAAAAa4CQAAAAAGvAkAAAAABywIBAAAAAcwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAAAAB0QIBAAAAAdICAQAAAAECAAAAEwAgHgAAhgYAIAMAAAARACAeAACGBgAgHwAAigYAIBAAAAARACAIAACqBQAgCQAAiQQAIAwAAIsEACAXAACKBgAgpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhywIBAPkDACHMAgEAhwQAIc0CAQCHBAAhzgIBAIcEACHPAgEAhwQAIdACAQD5AwAh0QIBAPkDACHSAgEAhwQAIQ4IAACqBQAgCQAAiQQAIAwAAIsEACCmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIcwCAQCHBAAhzQIBAIcEACHOAgEAhwQAIc8CAQCHBAAh0AIBAPkDACHRAgEA-QMAIdICAQCHBAAhB44CAQAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAG_AgEAAAABwQICAAAAAcICEAAAAAEOCAAAqwUAIAkAAOYEACALAADnBAAgpgIBAAAAAa4CQAAAAAGvAkAAAAABywIBAAAAAcwCAQAAAAHNAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAAAAB0QIBAAAAAdICAQAAAAECAAAAEwAgHgAAjAYAIAMAAAARACAeAACMBgAgHwAAkAYAIBAAAAARACAIAACqBQAgCQAAiQQAIAsAAIoEACAXAACQBgAgpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhywIBAPkDACHMAgEAhwQAIc0CAQCHBAAhzgIBAIcEACHPAgEAhwQAIdACAQD5AwAh0QIBAPkDACHSAgEAhwQAIQ4IAACqBQAgCQAAiQQAIAsAAIoEACCmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACHLAgEA-QMAIcwCAQCHBAAhzQIBAIcEACHOAgEAhwQAIc8CAQCHBAAh0AIBAPkDACHRAgEA-QMAIdICAQCHBAAhDAoAAI0FACANAADFBAAgEAAAxwQAIBEAAMgEACCOAgEAAAABpgIBAAAAAa4CQAAAAAGvAkAAAAABvwIBAAAAAcACAQAAAAHBAgIAAAABwgIQAAAAAQIAAAAdACAeAACRBgAgAwAAABsAIB4AAJEGACAfAACVBgAgDgAAABsAIAoAAIwFACANAACYBAAgEAAAmgQAIBEAAJsEACAXAACVBgAgjgIBAPkDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACG_AgEA-QMAIcACAQD5AwAhwQICAJYEACHCAhAA-gMAIQwKAACMBQAgDQAAmAQAIBAAAJoEACARAACbBAAgjgIBAPkDACGmAgEA-QMAIa4CQAD7AwAhrwJAAPsDACG_AgEA-QMAIcACAQD5AwAhwQICAJYEACHCAhAA-gMAIQwKAACNBQAgDQAAxQQAIA8AAMYEACARAADIBAAgjgIBAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAb8CAQAAAAHAAgEAAAABwQICAAAAAcICEAAAAAECAAAAHQAgHgAAlgYAIAMAAAAbACAeAACWBgAgHwAAmgYAIA4AAAAbACAKAACMBQAgDQAAmAQAIA8AAJkEACARAACbBAAgFwAAmgYAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhvwIBAPkDACHAAgEA-QMAIcECAgCWBAAhwgIQAPoDACEMCgAAjAUAIA0AAJgEACAPAACZBAAgEQAAmwQAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhvwIBAPkDACHAAgEA-QMAIcECAgCWBAAhwgIQAPoDACEMCgAAjQUAIA0AAMUEACAPAADGBAAgEAAAxwQAII4CAQAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAG_AgEAAAABwAIBAAAAAcECAgAAAAHCAhAAAAABAgAAAB0AIB4AAJsGACADAAAAGwAgHgAAmwYAIB8AAJ8GACAOAAAAGwAgCgAAjAUAIA0AAJgEACAPAACZBAAgEAAAmgQAIBcAAJ8GACCOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIb8CAQD5AwAhwAIBAPkDACHBAgIAlgQAIcICEAD6AwAhDAoAAIwFACANAACYBAAgDwAAmQQAIBAAAJoEACCOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIb8CAQD5AwAhwAIBAPkDACHBAgIAlgQAIcICEAD6AwAhCgQAAOAFACAFAADhBQAgjgIBAAAAAaYCAQAAAAGnAgEAAAABrgJAAAAAAa8CQAAAAAHKAgEAAAAB4QIgAAAAAeICAQAAAAECAAAAAQAgHgAAoAYAIAMAAAA3ACAeAACgBgAgHwAApAYAIAwAAAA3ACAEAAC8BQAgBQAAvQUAIBcAAKQGACCOAgEA-QMAIaYCAQD5AwAhpwIBAPkDACGuAkAA-wMAIa8CQAD7AwAhygIBAPkDACHhAiAAtAQAIeICAQCHBAAhCgQAALwFACAFAAC9BQAgjgIBAPkDACGmAgEA-QMAIacCAQD5AwAhrgJAAPsDACGvAkAA-wMAIcoCAQD5AwAh4QIgALQEACHiAgEAhwQAIQOuAkAAAAAByAIBAAAAAcoCAAAAygICCKYCAQAAAAGnAgEAAAABrgJAAAAAAa8CQAAAAAHEAgEAAAABxQJAAAAAAcYCQAAAAAHHAkAAAAABBo4CAQAAAAGmAgEAAAABrgJAAAAAAa8CQAAAAAG-AiAAAAABwwIBAAAAAQIAAADWAQAgHgAApwYAIAWmAgEAAAABrgJAAAAAAbYCAQAAAAG3AgEAAAABvQIAAAC9AgIIjwIQAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAbYCAQAAAAG3AgEAAAABvQIAAAC9AgO-AiAAAAABCqYCAQAAAAGuAkAAAAABrwJAAAAAAbMCAQAAAAG1AkAAAAABtgIBAAAAAbcCAQAAAAG4AgEAAAABuQIBAAAAAbsCAAAAuwICAwAAANkBACAeAACnBgAgHwAArgYAIAgAAADZAQAgFwAArgYAII4CAQD5AwAhpgIBAPkDACGuAkAA-wMAIa8CQAD7AwAhvgIgALQEACHDAgEA-QMAIQaOAgEA-QMAIaYCAQD5AwAhrgJAAPsDACGvAkAA-wMAIb4CIAC0BAAhwwIBAPkDACEHjgIBAAAAAaYCAQAAAAGuAkAAAAABrwJAAAAAAcACAQAAAAHBAgIAAAABwgIQAAAAAQqmAgEAAAABrgJAAAAAAa8CQAAAAAHLAgEAAAABzAIBAAAAAc0CAQAAAAHOAgEAAAABzwIBAAAAAdACAQAAAAHRAgEAAAABBAQGAgUKAwYOBAcAEQEDAAEBAwABAgMAAQoABQUHABAIEAYJFgQLGggMHgkCBhQFBwAHAQYVAAEKAAUGBwAPCgAFDQAKDyQMECgNESwOAgcACwwfCQEMIAABDgAJAQ4ACQEOAAkDDy0AEC4AES8AAwkwAAsxAAwyAAMEMwAFNAAGNQAAAAADBwAWJAAXJQAYAAAAAwcAFiQAFyUAGAEDAAEBAwABAwcAHSQAHiUAHwAAAAMHAB0kAB4lAB8BAwABAQMAAQMHACQkACUlACYAAAADBwAkJAAlJQAmAAAAAwcALCQALSUALgAAAAMHACwkAC0lAC4BCJwBBgEIogEGAwcAMyQANCUANQAAAAMHADMkADQlADUCAwABCgAFAgMAAQoABQMHADokADslADwAAAADBwA6JAA7JQA8AQoABQEKAAUDBwBBJABCJQBDAAAAAwcAQSQAQiUAQwAAAwcASCQASSUASgAAAAMHAEgkAEklAEoCCgAFDQAKAgoABQ0ACgUHAE8kAFIlAFOmAQBQpwEAUQAAAAAABQcATyQAUiUAU6YBAFCnAQBRAQ4ACQEOAAkDBwBYJABZJQBaAAAAAwcAWCQAWSUAWgEOAAkBDgAJBQcAXyQAYiUAY6YBAGCnAQBhAAAAAAAFBwBfJABiJQBjpgEAYKcBAGEBDgAJAQ4ACQMHAGgkAGklAGoAAAADBwBoJABpJQBqAAAABQcAcCQAcyUAdKYBAHGnAQByAAAAAAAFBwBwJABzJQB0pgEAcacBAHIAAAAFBwB6JAB9JQB-pgEAe6cBAHwAAAAAAAUHAHokAH0lAH6mAQB7pwEAfAAABQcAgwEkAIYBJQCHAaYBAIQBpwEAhQEAAAAAAAUHAIMBJACGASUAhwGmAQCEAacBAIUBEgIBEzYBFDkBFToBFjsBGD0BGT8SGkATG0IBHEQSHUUUIEYBIUcBIkgSJksVJ0wZKE0CKU4CKk8CK1ACLFECLVMCLlUSL1YaMFgCMVoSMlsbM1wCNF0CNV4SNmEcN2IgOGMDOWQDOmUDO2YDPGcDPWkDPmsSP2whQG4DQXASQnEiQ3IDRHMDRXQSRncjR3gnSHooSXsoSn4oS38oTIABKE2CAShOhAEST4UBKVCHAShRiQESUooBKlOLAShUjAEoVY0BElaQAStXkQEvWJIBBVmTAQValAEFW5UBBVyWAQVdmAEFXpoBEl-bATBgngEFYaABEmKhATFjowEFZKQBBWWlARJmqAEyZ6kBNmiqAQRpqwEEaqwBBGutAQRsrgEEbbABBG6yARJvswE3cLUBBHG3ARJyuAE4c7kBBHS6AQR1uwESdr4BOXe_AT14wAEIecEBCHrCAQh7wwEIfMQBCH3GAQh-yAESf8kBPoABywEIgQHNARKCAc4BP4MBzwEIhAHQAQiFAdEBEoYB1AFAhwHVAUSIAdcBCokB2AEKigHbAQqLAdwBCowB3QEKjQHfAQqOAeEBEo8B4gFFkAHkAQqRAeYBEpIB5wFGkwHoAQqUAekBCpUB6gESlgHtAUeXAe4BS5gB7wEJmQHwAQmaAfEBCZsB8gEJnAHzAQmdAfUBCZ4B9wESnwH4AUygAfoBCaEB_AESogH9AU2jAf4BCaQB_wEJpQGAAhKoAYMCTqkBhAJUqgGFAgyrAYYCDKwBhwIMrQGIAgyuAYkCDK8BiwIMsAGNAhKxAY4CVbIBkAIMswGSAhK0AZMCVrUBlAIMtgGVAgy3AZYCErgBmQJXuQGaAlu6AZsCDbsBnAINvAGdAg29AZ4CDb4BnwINvwGhAg3AAaMCEsEBpAJcwgGmAg3DAagCEsQBqQJdxQGqAg3GAasCDccBrAISyAGvAl7JAbACZMoBsQIOywGyAg7MAbMCDs0BtAIOzgG1Ag7PAbcCDtABuQIS0QG6AmXSAbwCDtMBvgIS1AG_AmbVAcACDtYBwQIO1wHCAhLYAcUCZ9kBxgJr2gHIAmzbAckCbNwBzAJs3QHNAmzeAc4CbN8B0AJs4AHSAhLhAdMCbeIB1QJs4wHXAhLkAdgCbuUB2QJs5gHaAmznAdsCEugB3gJv6QHfAnXqAeECdusB4gJ27AHlAnbtAeYCdu4B5wJ27wHpAnbwAesCEvEB7AJ38gHuAnbzAfACEvQB8QJ49QHyAnb2AfMCdvcB9AIS-AH3Ann5AfgCf_oB-gIG-wH7Agb8Af0CBv0B_gIG_gH_Agb_AYEDBoACgwMSgQKEA4ABggKGAwaDAogDEoQCiQOBAYUCigMGhgKLAwaHAowDEogCjwOCAYkCkAOIAQ" } async function decodeBase64AsWasm(wasmBase64: string): Promise { @@ -248,6 +248,16 @@ export interface PrismaClient< */ get complexUser(): Prisma.ComplexUserDelegate; + /** + * `prisma.complexInvitation`: Exposes CRUD operations for the **ComplexInvitation** model. + * Example usage: + * ```ts + * // Fetch zero or more ComplexInvitations + * const complexInvitations = await prisma.complexInvitation.findMany() + * ``` + */ + get complexInvitation(): Prisma.ComplexInvitationDelegate; + /** * `prisma.sport`: Exposes CRUD operations for the **Sport** model. * Example usage: diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts index 0a8cc94..c51f691 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespace.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespace.ts @@ -390,6 +390,7 @@ export const ModelName = { Verification: 'Verification', Complex: 'Complex', ComplexUser: 'ComplexUser', + ComplexInvitation: 'ComplexInvitation', Sport: 'Sport', Court: 'Court', CourtAvailability: 'CourtAvailability', @@ -413,7 +414,7 @@ export type TypeMap + fields: Prisma.ComplexInvitationFieldRefs + operations: { + findUnique: { + args: Prisma.ComplexInvitationFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.ComplexInvitationFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.ComplexInvitationFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.ComplexInvitationFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.ComplexInvitationFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.ComplexInvitationCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.ComplexInvitationCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.ComplexInvitationCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.ComplexInvitationDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.ComplexInvitationUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.ComplexInvitationDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.ComplexInvitationUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.ComplexInvitationUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.ComplexInvitationUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.ComplexInvitationAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.ComplexInvitationGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.ComplexInvitationCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } Sport: { payload: Prisma.$SportPayload fields: Prisma.SportFieldRefs @@ -1578,6 +1653,21 @@ export const ComplexUserScalarFieldEnum = { export type ComplexUserScalarFieldEnum = (typeof ComplexUserScalarFieldEnum)[keyof typeof ComplexUserScalarFieldEnum] +export const ComplexInvitationScalarFieldEnum = { + id: 'id', + complexId: 'complexId', + email: 'email', + tokenHash: 'tokenHash', + expiresAt: 'expiresAt', + acceptedAt: 'acceptedAt', + revokedAt: 'revokedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type ComplexInvitationScalarFieldEnum = (typeof ComplexInvitationScalarFieldEnum)[keyof typeof ComplexInvitationScalarFieldEnum] + + export const SportScalarFieldEnum = { id: 'id', name: 'name', @@ -1972,6 +2062,7 @@ export type GlobalOmitConfig = { verification?: Prisma.VerificationOmit complex?: Prisma.ComplexOmit complexUser?: Prisma.ComplexUserOmit + complexInvitation?: Prisma.ComplexInvitationOmit sport?: Prisma.SportOmit court?: Prisma.CourtOmit courtAvailability?: Prisma.CourtAvailabilityOmit diff --git a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts index b416860..ba86db4 100644 --- a/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/apps/backend/src/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -57,6 +57,7 @@ export const ModelName = { Verification: 'Verification', Complex: 'Complex', ComplexUser: 'ComplexUser', + ComplexInvitation: 'ComplexInvitation', Sport: 'Sport', Court: 'Court', CourtAvailability: 'CourtAvailability', @@ -169,6 +170,21 @@ export const ComplexUserScalarFieldEnum = { export type ComplexUserScalarFieldEnum = (typeof ComplexUserScalarFieldEnum)[keyof typeof ComplexUserScalarFieldEnum] +export const ComplexInvitationScalarFieldEnum = { + id: 'id', + complexId: 'complexId', + email: 'email', + tokenHash: 'tokenHash', + expiresAt: 'expiresAt', + acceptedAt: 'acceptedAt', + revokedAt: 'revokedAt', + createdAt: 'createdAt', + updatedAt: 'updatedAt' +} as const + +export type ComplexInvitationScalarFieldEnum = (typeof ComplexInvitationScalarFieldEnum)[keyof typeof ComplexInvitationScalarFieldEnum] + + export const SportScalarFieldEnum = { id: 'id', name: 'name', diff --git a/apps/backend/src/generated/prisma/models.ts b/apps/backend/src/generated/prisma/models.ts index cef5ba6..3b46099 100644 --- a/apps/backend/src/generated/prisma/models.ts +++ b/apps/backend/src/generated/prisma/models.ts @@ -14,6 +14,7 @@ export type * from './models/Account' export type * from './models/Verification' export type * from './models/Complex' export type * from './models/ComplexUser' +export type * from './models/ComplexInvitation' export type * from './models/Sport' export type * from './models/Court' export type * from './models/CourtAvailability' diff --git a/apps/backend/src/generated/prisma/models/Complex.ts b/apps/backend/src/generated/prisma/models/Complex.ts index 95f08f1..fb3237a 100644 --- a/apps/backend/src/generated/prisma/models/Complex.ts +++ b/apps/backend/src/generated/prisma/models/Complex.ts @@ -232,6 +232,7 @@ export type ComplexWhereInput = { updatedAt?: Prisma.DateTimeFilter<"Complex"> | Date | string plan?: Prisma.XOR | null users?: Prisma.ComplexUserListRelationFilter + invitations?: Prisma.ComplexInvitationListRelationFilter courts?: Prisma.CourtListRelationFilter } @@ -249,6 +250,7 @@ export type ComplexOrderByWithRelationInput = { updatedAt?: Prisma.SortOrder plan?: Prisma.PlanOrderByWithRelationInput users?: Prisma.ComplexUserOrderByRelationAggregateInput + invitations?: Prisma.ComplexInvitationOrderByRelationAggregateInput courts?: Prisma.CourtOrderByRelationAggregateInput } @@ -269,6 +271,7 @@ export type ComplexWhereUniqueInput = Prisma.AtLeast<{ updatedAt?: Prisma.DateTimeFilter<"Complex"> | Date | string plan?: Prisma.XOR | null users?: Prisma.ComplexUserListRelationFilter + invitations?: Prisma.ComplexInvitationListRelationFilter courts?: Prisma.CourtListRelationFilter }, "id" | "complexSlug"> @@ -319,6 +322,7 @@ export type ComplexCreateInput = { updatedAt?: Date | string plan?: Prisma.PlanCreateNestedOneWithoutComplexesInput users?: Prisma.ComplexUserCreateNestedManyWithoutComplexInput + invitations?: Prisma.ComplexInvitationCreateNestedManyWithoutComplexInput courts?: Prisma.CourtCreateNestedManyWithoutComplexInput } @@ -335,6 +339,7 @@ export type ComplexUncheckedCreateInput = { createdAt?: Date | string updatedAt?: Date | string users?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutComplexInput + invitations?: Prisma.ComplexInvitationUncheckedCreateNestedManyWithoutComplexInput courts?: Prisma.CourtUncheckedCreateNestedManyWithoutComplexInput } @@ -351,6 +356,7 @@ export type ComplexUpdateInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string plan?: Prisma.PlanUpdateOneWithoutComplexesNestedInput users?: Prisma.ComplexUserUpdateManyWithoutComplexNestedInput + invitations?: Prisma.ComplexInvitationUpdateManyWithoutComplexNestedInput courts?: Prisma.CourtUpdateManyWithoutComplexNestedInput } @@ -367,6 +373,7 @@ export type ComplexUncheckedUpdateInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string users?: Prisma.ComplexUserUncheckedUpdateManyWithoutComplexNestedInput + invitations?: Prisma.ComplexInvitationUncheckedUpdateManyWithoutComplexNestedInput courts?: Prisma.CourtUncheckedUpdateManyWithoutComplexNestedInput } @@ -482,6 +489,20 @@ export type ComplexUpdateOneRequiredWithoutUsersNestedInput = { update?: Prisma.XOR, Prisma.ComplexUncheckedUpdateWithoutUsersInput> } +export type ComplexCreateNestedOneWithoutInvitationsInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ComplexCreateOrConnectWithoutInvitationsInput + connect?: Prisma.ComplexWhereUniqueInput +} + +export type ComplexUpdateOneRequiredWithoutInvitationsNestedInput = { + create?: Prisma.XOR + connectOrCreate?: Prisma.ComplexCreateOrConnectWithoutInvitationsInput + upsert?: Prisma.ComplexUpsertWithoutInvitationsInput + connect?: Prisma.ComplexWhereUniqueInput + update?: Prisma.XOR, Prisma.ComplexUncheckedUpdateWithoutInvitationsInput> +} + export type ComplexCreateNestedOneWithoutCourtsInput = { create?: Prisma.XOR connectOrCreate?: Prisma.ComplexCreateOrConnectWithoutCourtsInput @@ -550,6 +571,7 @@ export type ComplexCreateWithoutUsersInput = { createdAt?: Date | string updatedAt?: Date | string plan?: Prisma.PlanCreateNestedOneWithoutComplexesInput + invitations?: Prisma.ComplexInvitationCreateNestedManyWithoutComplexInput courts?: Prisma.CourtCreateNestedManyWithoutComplexInput } @@ -565,6 +587,7 @@ export type ComplexUncheckedCreateWithoutUsersInput = { planCode?: string | null createdAt?: Date | string updatedAt?: Date | string + invitations?: Prisma.ComplexInvitationUncheckedCreateNestedManyWithoutComplexInput courts?: Prisma.CourtUncheckedCreateNestedManyWithoutComplexInput } @@ -596,6 +619,7 @@ export type ComplexUpdateWithoutUsersInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string plan?: Prisma.PlanUpdateOneWithoutComplexesNestedInput + invitations?: Prisma.ComplexInvitationUpdateManyWithoutComplexNestedInput courts?: Prisma.CourtUpdateManyWithoutComplexNestedInput } @@ -611,6 +635,87 @@ export type ComplexUncheckedUpdateWithoutUsersInput = { planCode?: Prisma.NullableStringFieldUpdateOperationsInput | string | null createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + invitations?: Prisma.ComplexInvitationUncheckedUpdateManyWithoutComplexNestedInput + courts?: Prisma.CourtUncheckedUpdateManyWithoutComplexNestedInput +} + +export type ComplexCreateWithoutInvitationsInput = { + id: string + complexName: string + physicalAddress?: string | null + city?: string | null + state?: string | null + country?: string | null + complexSlug: string + adminEmail: string + createdAt?: Date | string + updatedAt?: Date | string + plan?: Prisma.PlanCreateNestedOneWithoutComplexesInput + users?: Prisma.ComplexUserCreateNestedManyWithoutComplexInput + courts?: Prisma.CourtCreateNestedManyWithoutComplexInput +} + +export type ComplexUncheckedCreateWithoutInvitationsInput = { + id: string + complexName: string + physicalAddress?: string | null + city?: string | null + state?: string | null + country?: string | null + complexSlug: string + adminEmail: string + planCode?: string | null + createdAt?: Date | string + updatedAt?: Date | string + users?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutComplexInput + courts?: Prisma.CourtUncheckedCreateNestedManyWithoutComplexInput +} + +export type ComplexCreateOrConnectWithoutInvitationsInput = { + where: Prisma.ComplexWhereUniqueInput + create: Prisma.XOR +} + +export type ComplexUpsertWithoutInvitationsInput = { + update: Prisma.XOR + create: Prisma.XOR + where?: Prisma.ComplexWhereInput +} + +export type ComplexUpdateToOneWithWhereWithoutInvitationsInput = { + where?: Prisma.ComplexWhereInput + data: Prisma.XOR +} + +export type ComplexUpdateWithoutInvitationsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + complexName?: Prisma.StringFieldUpdateOperationsInput | string + physicalAddress?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + city?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + state?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + country?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + complexSlug?: Prisma.StringFieldUpdateOperationsInput | string + adminEmail?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + plan?: Prisma.PlanUpdateOneWithoutComplexesNestedInput + users?: Prisma.ComplexUserUpdateManyWithoutComplexNestedInput + courts?: Prisma.CourtUpdateManyWithoutComplexNestedInput +} + +export type ComplexUncheckedUpdateWithoutInvitationsInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + complexName?: Prisma.StringFieldUpdateOperationsInput | string + physicalAddress?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + city?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + state?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + country?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + complexSlug?: Prisma.StringFieldUpdateOperationsInput | string + adminEmail?: Prisma.StringFieldUpdateOperationsInput | string + planCode?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + users?: Prisma.ComplexUserUncheckedUpdateManyWithoutComplexNestedInput courts?: Prisma.CourtUncheckedUpdateManyWithoutComplexNestedInput } @@ -627,6 +732,7 @@ export type ComplexCreateWithoutCourtsInput = { updatedAt?: Date | string plan?: Prisma.PlanCreateNestedOneWithoutComplexesInput users?: Prisma.ComplexUserCreateNestedManyWithoutComplexInput + invitations?: Prisma.ComplexInvitationCreateNestedManyWithoutComplexInput } export type ComplexUncheckedCreateWithoutCourtsInput = { @@ -642,6 +748,7 @@ export type ComplexUncheckedCreateWithoutCourtsInput = { createdAt?: Date | string updatedAt?: Date | string users?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutComplexInput + invitations?: Prisma.ComplexInvitationUncheckedCreateNestedManyWithoutComplexInput } export type ComplexCreateOrConnectWithoutCourtsInput = { @@ -673,6 +780,7 @@ export type ComplexUpdateWithoutCourtsInput = { updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string plan?: Prisma.PlanUpdateOneWithoutComplexesNestedInput users?: Prisma.ComplexUserUpdateManyWithoutComplexNestedInput + invitations?: Prisma.ComplexInvitationUpdateManyWithoutComplexNestedInput } export type ComplexUncheckedUpdateWithoutCourtsInput = { @@ -688,6 +796,7 @@ export type ComplexUncheckedUpdateWithoutCourtsInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string users?: Prisma.ComplexUserUncheckedUpdateManyWithoutComplexNestedInput + invitations?: Prisma.ComplexInvitationUncheckedUpdateManyWithoutComplexNestedInput } export type ComplexCreateWithoutPlanInput = { @@ -702,6 +811,7 @@ export type ComplexCreateWithoutPlanInput = { createdAt?: Date | string updatedAt?: Date | string users?: Prisma.ComplexUserCreateNestedManyWithoutComplexInput + invitations?: Prisma.ComplexInvitationCreateNestedManyWithoutComplexInput courts?: Prisma.CourtCreateNestedManyWithoutComplexInput } @@ -717,6 +827,7 @@ export type ComplexUncheckedCreateWithoutPlanInput = { createdAt?: Date | string updatedAt?: Date | string users?: Prisma.ComplexUserUncheckedCreateNestedManyWithoutComplexInput + invitations?: Prisma.ComplexInvitationUncheckedCreateNestedManyWithoutComplexInput courts?: Prisma.CourtUncheckedCreateNestedManyWithoutComplexInput } @@ -788,6 +899,7 @@ export type ComplexUpdateWithoutPlanInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string users?: Prisma.ComplexUserUpdateManyWithoutComplexNestedInput + invitations?: Prisma.ComplexInvitationUpdateManyWithoutComplexNestedInput courts?: Prisma.CourtUpdateManyWithoutComplexNestedInput } @@ -803,6 +915,7 @@ export type ComplexUncheckedUpdateWithoutPlanInput = { createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string updatedAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string users?: Prisma.ComplexUserUncheckedUpdateManyWithoutComplexNestedInput + invitations?: Prisma.ComplexInvitationUncheckedUpdateManyWithoutComplexNestedInput courts?: Prisma.CourtUncheckedUpdateManyWithoutComplexNestedInput } @@ -826,11 +939,13 @@ export type ComplexUncheckedUpdateManyWithoutPlanInput = { export type ComplexCountOutputType = { users: number + invitations: number courts: number } export type ComplexCountOutputTypeSelect = { users?: boolean | ComplexCountOutputTypeCountUsersArgs + invitations?: boolean | ComplexCountOutputTypeCountInvitationsArgs courts?: boolean | ComplexCountOutputTypeCountCourtsArgs } @@ -851,6 +966,13 @@ export type ComplexCountOutputTypeCountUsersArgs = { + where?: Prisma.ComplexInvitationWhereInput +} + /** * ComplexCountOutputType without action */ @@ -873,6 +995,7 @@ export type ComplexSelect users?: boolean | Prisma.Complex$usersArgs + invitations?: boolean | Prisma.Complex$invitationsArgs courts?: boolean | Prisma.Complex$courtsArgs _count?: boolean | Prisma.ComplexCountOutputTypeDefaultArgs }, ExtArgs["result"]["complex"]> @@ -925,6 +1048,7 @@ export type ComplexOmit = { plan?: boolean | Prisma.Complex$planArgs users?: boolean | Prisma.Complex$usersArgs + invitations?: boolean | Prisma.Complex$invitationsArgs courts?: boolean | Prisma.Complex$courtsArgs _count?: boolean | Prisma.ComplexCountOutputTypeDefaultArgs } @@ -940,6 +1064,7 @@ export type $ComplexPayload | null users: Prisma.$ComplexUserPayload[] + invitations: Prisma.$ComplexInvitationPayload[] courts: Prisma.$CourtPayload[] } scalars: runtime.Types.Extensions.GetPayloadResult<{ @@ -1350,6 +1475,7 @@ export interface Prisma__ComplexClient = {}>(args?: Prisma.Subset>): Prisma.Prisma__PlanClient, T, "findUniqueOrThrow", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> users = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> + invitations = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> courts = {}>(args?: Prisma.Subset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions> | Null> /** * Attaches callbacks for the resolution and/or rejection of the Promise. @@ -1834,6 +1960,30 @@ export type Complex$usersArgs = { + /** + * Select specific fields to fetch from the ComplexInvitation + */ + select?: Prisma.ComplexInvitationSelect | null + /** + * Omit specific fields from the ComplexInvitation + */ + omit?: Prisma.ComplexInvitationOmit | null + /** + * Choose, which related nodes to fetch as well + */ + include?: Prisma.ComplexInvitationInclude | null + where?: Prisma.ComplexInvitationWhereInput + orderBy?: Prisma.ComplexInvitationOrderByWithRelationInput | Prisma.ComplexInvitationOrderByWithRelationInput[] + cursor?: Prisma.ComplexInvitationWhereUniqueInput + take?: number + skip?: number + distinct?: Prisma.ComplexInvitationScalarFieldEnum | Prisma.ComplexInvitationScalarFieldEnum[] +} + /** * Complex.courts */ diff --git a/apps/backend/src/lib/auth.ts b/apps/backend/src/lib/auth.ts index 42a3231..a513895 100644 --- a/apps/backend/src/lib/auth.ts +++ b/apps/backend/src/lib/auth.ts @@ -1,37 +1,34 @@ +import { dash } from '@better-auth/infra'; import { betterAuth } from 'better-auth'; import { prismaAdapter } from 'better-auth/adapters/prisma'; import { openAPI } from 'better-auth/plugins'; import { db } from './prisma'; -import { dash } from "@better-auth/infra"; export const auth = betterAuth({ - database: prismaAdapter(db, { - provider: 'postgresql', - }), - secret: process.env.BETTER_AUTH_SECRET, - baseURL: process.env.BETTER_AUTH_URL, - session: { - cookieCache: { - enabled: false, - }, + database: prismaAdapter(db, { + provider: 'postgresql', + }), + secret: process.env.BETTER_AUTH_SECRET, + baseURL: process.env.BETTER_AUTH_URL, + session: { + cookieCache: { + enabled: false, }, - emailAndPassword: { - enabled: true, + }, + emailAndPassword: { + enabled: true, + }, + socialProviders: { + google: { + clientId: process.env.GOOGLE_CLIENT_ID!, + clientSecret: process.env.GOOGLE_CLIENT_SECRET!, }, - socialProviders: { - google: { - clientId: process.env.GOOGLE_CLIENT_ID!, - clientSecret: process.env.GOOGLE_CLIENT_SECRET!, - }, - }, - trustedOrigins: [ - process.env.APP_BASE_URL ?? 'http://localhost:5173', - process.env.BETTER_AUTH_URL ?? 'http://localhost:3000', - ], - plugins: [ - openAPI(), - dash() - ], + }, + trustedOrigins: [ + process.env.APP_BASE_URL ?? 'http://localhost:5173', + process.env.BETTER_AUTH_URL ?? 'http://localhost:3000', + ], + plugins: [openAPI(), dash()], }); export type Session = typeof auth.$Infer.Session.session; diff --git a/apps/backend/src/lib/avatar.ts b/apps/backend/src/lib/avatar.ts new file mode 100644 index 0000000..7378ebb --- /dev/null +++ b/apps/backend/src/lib/avatar.ts @@ -0,0 +1,17 @@ +import { createHash } from 'node:crypto'; + +function getGravatarUrl(email: string): string { + const hash = createHash('md5').update(email.trim().toLowerCase()).digest('hex'); + return `https://www.gravatar.com/avatar/${hash}?d=identicon`; +} + +export function resolveAvatarUrl(input: { + email: string; + image?: string | null; +}): string { + if (input.image) { + return input.image; + } + + return getGravatarUrl(input.email); +} diff --git a/apps/backend/src/modules/complex/complex.routes.ts b/apps/backend/src/modules/complex/complex.routes.ts index 79894c2..aa5b201 100644 --- a/apps/backend/src/modules/complex/complex.routes.ts +++ b/apps/backend/src/modules/complex/complex.routes.ts @@ -1,14 +1,25 @@ import { requireAuth } from '@/middlewares/require-auth.middleware'; +import { acceptComplexInvitationsHandler } from '@/modules/complex/handlers/accept-complex-invitations.handler'; +import { cancelComplexInvitationHandler } from '@/modules/complex/handlers/cancel-complex-invitation.handler'; import { createComplexHandler } from '@/modules/complex/handlers/create-complex.handler'; import { getComplexByIdHandler } from '@/modules/complex/handlers/get-complex-by-id.handler'; import { getComplexBySlugHandler } from '@/modules/complex/handlers/get-complex-by-slug.handler'; import { getCurrentComplexHandler } from '@/modules/complex/handlers/get-current-complex.handler'; +import { inviteComplexUserHandler } from '@/modules/complex/handlers/invite-complex-user.handler'; +import { listComplexUsersHandler } from '@/modules/complex/handlers/list-complex-users.handler'; import { listMyComplexesHandler } from '@/modules/complex/handlers/list-my-complexes.handler'; +import { resendComplexInvitationHandler } from '@/modules/complex/handlers/resend-complex-invitation.handler'; +import { revokeComplexUserHandler } from '@/modules/complex/handlers/revoke-complex-user.handler'; import { selectComplexHandler } from '@/modules/complex/handlers/select-complex.handler'; import { updateComplexHandler } from '@/modules/complex/handlers/update-complex.handler'; import type { AppEnv } from '@/types/hono'; import { zValidator } from '@hono/zod-validator'; -import { createComplexSchema, updateComplexSchema } from '@repo/api-contract'; +import { + acceptComplexInvitationsSchema, + createComplexSchema, + inviteComplexUserSchema, + updateComplexSchema, +} from '@repo/api-contract'; import { Hono } from 'hono'; import { z } from 'zod'; @@ -21,6 +32,11 @@ complexRoutes.use('*', requireAuth); complexRoutes.post('/', zValidator('json', createComplexSchema), createComplexHandler); complexRoutes.get('/me', getCurrentComplexHandler); complexRoutes.post('/select', selectComplexHandler); +complexRoutes.post( + '/accept-pending', + zValidator('json', acceptComplexInvitationsSchema), + acceptComplexInvitationsHandler +); complexRoutes.get('/mine', listMyComplexesHandler); complexRoutes.get( '/slug/:slug', @@ -28,6 +44,33 @@ complexRoutes.get( getComplexBySlugHandler ); +complexRoutes.get( + '/:id/users', + zValidator('param', complexIdParamsSchema), + listComplexUsersHandler +); +complexRoutes.post( + '/:id/users', + zValidator('param', complexIdParamsSchema), + zValidator('json', inviteComplexUserSchema), + inviteComplexUserHandler +); +complexRoutes.post( + '/:id/invitations/:invitationId/resend', + zValidator('param', z.object({ id: z.uuid(), invitationId: z.uuid() })), + resendComplexInvitationHandler +); +complexRoutes.delete( + '/:id/invitations/:invitationId', + zValidator('param', z.object({ id: z.uuid(), invitationId: z.uuid() })), + cancelComplexInvitationHandler +); +complexRoutes.delete( + '/:id/users/:userId', + zValidator('param', z.object({ id: z.uuid(), userId: z.string().min(1) })), + revokeComplexUserHandler +); + complexRoutes.get('/:id', zValidator('param', complexIdParamsSchema), getComplexByIdHandler); complexRoutes.patch( '/:id', diff --git a/apps/backend/src/modules/complex/handlers/accept-complex-invitations.handler.ts b/apps/backend/src/modules/complex/handlers/accept-complex-invitations.handler.ts new file mode 100644 index 0000000..4a0eb48 --- /dev/null +++ b/apps/backend/src/modules/complex/handlers/accept-complex-invitations.handler.ts @@ -0,0 +1,27 @@ +import { + ComplexMembersError, + acceptComplexInvitations, +} from '@/modules/complex/services/complex-members.service'; +import type { AppContext } from '@/types/hono'; +import type { AcceptComplexInvitationsInput } from '@repo/api-contract'; + +export async function acceptComplexInvitationsHandler(c: AppContext) { + const user = c.get('user'); + const payload = c.req.valid('json' as never) as AcceptComplexInvitationsInput; + + try { + const result = await acceptComplexInvitations(user.id, user.email, payload); + return c.json(result); + } catch (error) { + if (error instanceof ComplexMembersError) { + return c.json( + { message: error.message }, + { + status: error.status, + } + ); + } + + throw error; + } +} diff --git a/apps/backend/src/modules/complex/handlers/cancel-complex-invitation.handler.ts b/apps/backend/src/modules/complex/handlers/cancel-complex-invitation.handler.ts new file mode 100644 index 0000000..7e5de72 --- /dev/null +++ b/apps/backend/src/modules/complex/handlers/cancel-complex-invitation.handler.ts @@ -0,0 +1,27 @@ +import { + ComplexMembersError, + cancelComplexInvitation, +} from '@/modules/complex/services/complex-members.service'; +import type { AppContext } from '@/types/hono'; +import { z } from 'zod'; + +const cancelInvitationParamsSchema = z.object({ + id: z.uuid(), + invitationId: z.uuid(), +}); + +export async function cancelComplexInvitationHandler(c: AppContext) { + const user = c.get('user'); + const params = cancelInvitationParamsSchema.parse(c.req.param()); + + try { + const result = await cancelComplexInvitation(user.id, params.id, params.invitationId); + return c.json(result); + } catch (error) { + if (error instanceof ComplexMembersError) { + return c.json({ message: error.message }, { status: error.status }); + } + + throw error; + } +} diff --git a/apps/backend/src/modules/complex/handlers/invite-complex-user.handler.ts b/apps/backend/src/modules/complex/handlers/invite-complex-user.handler.ts new file mode 100644 index 0000000..e3293af --- /dev/null +++ b/apps/backend/src/modules/complex/handlers/invite-complex-user.handler.ts @@ -0,0 +1,33 @@ +import { + ComplexMembersError, + inviteComplexUser, +} from '@/modules/complex/services/complex-members.service'; +import type { AppContext } from '@/types/hono'; +import type { InviteComplexUserInput } from '@repo/api-contract'; +import { z } from 'zod'; + +const complexParamsSchema = z.object({ + id: z.uuid(), +}); + +export async function inviteComplexUserHandler(c: AppContext) { + const user = c.get('user'); + const params = complexParamsSchema.parse(c.req.param()); + const payload = c.req.valid('json' as never) as InviteComplexUserInput; + + try { + const result = await inviteComplexUser(user.id, params.id, payload); + return c.json(result, 201); + } catch (error) { + if (error instanceof ComplexMembersError) { + return c.json( + { message: error.message }, + { + status: error.status, + } + ); + } + + throw error; + } +} diff --git a/apps/backend/src/modules/complex/handlers/list-complex-users.handler.ts b/apps/backend/src/modules/complex/handlers/list-complex-users.handler.ts new file mode 100644 index 0000000..17b43f7 --- /dev/null +++ b/apps/backend/src/modules/complex/handlers/list-complex-users.handler.ts @@ -0,0 +1,14 @@ +import { getComplexUsersOverview } from '@/modules/complex/services/complex-members.service'; +import type { AppContext } from '@/types/hono'; +import { z } from 'zod'; + +const complexParamsSchema = z.object({ + id: z.uuid(), +}); + +export async function listComplexUsersHandler(c: AppContext) { + const user = c.get('user'); + const params = complexParamsSchema.parse(c.req.param()); + const result = await getComplexUsersOverview(user.id, params.id); + return c.json(result); +} diff --git a/apps/backend/src/modules/complex/handlers/resend-complex-invitation.handler.ts b/apps/backend/src/modules/complex/handlers/resend-complex-invitation.handler.ts new file mode 100644 index 0000000..a424fbc --- /dev/null +++ b/apps/backend/src/modules/complex/handlers/resend-complex-invitation.handler.ts @@ -0,0 +1,27 @@ +import { + ComplexMembersError, + resendComplexInvitation, +} from '@/modules/complex/services/complex-members.service'; +import type { AppContext } from '@/types/hono'; +import { z } from 'zod'; + +const resendInvitationParamsSchema = z.object({ + id: z.uuid(), + invitationId: z.uuid(), +}); + +export async function resendComplexInvitationHandler(c: AppContext) { + const user = c.get('user'); + const params = resendInvitationParamsSchema.parse(c.req.param()); + + try { + const result = await resendComplexInvitation(user.id, params.id, params.invitationId); + return c.json(result); + } catch (error) { + if (error instanceof ComplexMembersError) { + return c.json({ message: error.message }, { status: error.status }); + } + + throw error; + } +} diff --git a/apps/backend/src/modules/complex/handlers/revoke-complex-user.handler.ts b/apps/backend/src/modules/complex/handlers/revoke-complex-user.handler.ts new file mode 100644 index 0000000..c3547eb --- /dev/null +++ b/apps/backend/src/modules/complex/handlers/revoke-complex-user.handler.ts @@ -0,0 +1,32 @@ +import { + ComplexMembersError, + revokeComplexUser, +} from '@/modules/complex/services/complex-members.service'; +import type { AppContext } from '@/types/hono'; +import { z } from 'zod'; + +const revokeParamsSchema = z.object({ + id: z.uuid(), + userId: z.string().min(1), +}); + +export async function revokeComplexUserHandler(c: AppContext) { + const user = c.get('user'); + const params = revokeParamsSchema.parse(c.req.param()); + + try { + const result = await revokeComplexUser(user.id, params.id, { userId: params.userId }); + return c.json(result); + } catch (error) { + if (error instanceof ComplexMembersError) { + return c.json( + { message: error.message }, + { + status: error.status, + } + ); + } + + throw error; + } +} diff --git a/apps/backend/src/modules/complex/services/complex-members.service.ts b/apps/backend/src/modules/complex/services/complex-members.service.ts new file mode 100644 index 0000000..76831b6 --- /dev/null +++ b/apps/backend/src/modules/complex/services/complex-members.service.ts @@ -0,0 +1,525 @@ +import { createHash, randomBytes } from 'node:crypto'; +import { resolveAvatarUrl } from '@/lib/avatar'; +import { sendMail } from '@/lib/mailer'; +import { db } from '@/lib/prisma'; +import type { + AcceptComplexInvitationsInput, + AcceptComplexInvitationsResponse, + CancelComplexInvitationResponse, + ComplexInvitation, + ComplexInvitationStatus, + ComplexUsersOverview, + InviteComplexUserInput, + InviteComplexUserResponse, + RevokeComplexUserInput, +} from '@repo/api-contract'; +import { v7 as uuidv7 } from 'uuid'; + +const INVITATION_TTL_DAYS = Number(Bun.env.COMPLEX_INVITATION_TTL_DAYS ?? 7); +const APP_BASE_URL = Bun.env.APP_BASE_URL ?? 'http://localhost:5173'; + +export class ComplexMembersError extends Error { + status: 400 | 403 | 404 | 409; + + constructor(message: string, status: 400 | 403 | 404 | 409 = 400) { + super(message); + this.name = 'ComplexMembersError'; + this.status = status; + } +} + +function normalizeEmail(email: string): string { + return email.trim().toLowerCase(); +} + +function hashToken(token: string): string { + return createHash('sha256').update(token).digest('hex'); +} + +function createInvitationToken(): string { + return randomBytes(32).toString('hex'); +} + +function nowPlusDays(days: number): Date { + const date = new Date(); + date.setDate(date.getDate() + days); + return date; +} + +function getInvitationStatus(invitation: { + expiresAt: Date; + acceptedAt: Date | null; + revokedAt: Date | null; +}): ComplexInvitationStatus { + if (invitation.acceptedAt) return 'ACCEPTED'; + if (invitation.revokedAt) return 'REVOKED'; + if (invitation.expiresAt < new Date()) return 'EXPIRED'; + return 'PENDING'; +} + +function formatInvitation(invitation: { + id: string; + complexId: string; + email: string; + expiresAt: Date; + acceptedAt: Date | null; + revokedAt: Date | null; + createdAt: Date; +}): ComplexInvitation { + return { + id: invitation.id, + complexId: invitation.complexId, + email: invitation.email, + status: getInvitationStatus(invitation), + createdAt: invitation.createdAt.toISOString(), + expiresAt: invitation.expiresAt.toISOString(), + acceptedAt: invitation.acceptedAt?.toISOString() ?? null, + revokedAt: invitation.revokedAt?.toISOString() ?? null, + }; +} + +async function ensureComplexAdmin(userId: string, complexId: string) { + const membership = await db.complexUser.findUnique({ + where: { + complexId_userId: { + complexId, + userId, + }, + }, + select: { + role: true, + }, + }); + + if (!membership) { + throw new ComplexMembersError('No tenés acceso a este complejo.', 403); + } + + if (membership.role !== 'ADMIN') { + throw new ComplexMembersError('Solo un ADMIN puede administrar usuarios.', 403); + } +} + +async function ensureComplexMember(userId: string, complexId: string) { + const membership = await db.complexUser.findUnique({ + where: { + complexId_userId: { + complexId, + userId, + }, + }, + }); + + if (!membership) { + throw new ComplexMembersError('No tenés acceso a este complejo.', 403); + } + + return membership; +} + +async function sendInvitationEmail(input: { + complexName: string; + inviteeEmail: string; + token: string; +}) { + const inviteUrl = new URL('/invite', APP_BASE_URL); + inviteUrl.searchParams.set('inviteToken', input.token); + inviteUrl.searchParams.set('email', input.inviteeEmail); + + await sendMail({ + to: input.inviteeEmail, + subject: `Te invitaron a ${input.complexName}`, + text: `Te invitaron a sumarte a ${input.complexName}. Abrí este enlace para crear tu cuenta o iniciar sesión: ${inviteUrl.toString()}`, + html: ` +

Te invitaron a ${input.complexName}

+

Hacé click en el siguiente enlace para crear tu cuenta o iniciar sesión y aceptar la invitación:

+

${inviteUrl.toString()}

+ `, + }); +} + +async function refreshPendingInvitation(invitationId: string) { + const token = createInvitationToken(); + const tokenHash = hashToken(token); + const expiresAt = nowPlusDays(INVITATION_TTL_DAYS); + + const invitation = await db.complexInvitation.update({ + where: { + id: invitationId, + }, + data: { + tokenHash, + expiresAt, + acceptedAt: null, + revokedAt: null, + }, + include: { + complex: { + select: { + complexName: true, + }, + }, + }, + }); + + return { + invitation, + token, + }; +} + +export async function listComplexUsers(complexId: string) { + const [members, invitations] = await Promise.all([ + db.complexUser.findMany({ + where: { complexId }, + include: { + user: true, + }, + orderBy: { + createdAt: 'asc', + }, + }), + db.complexInvitation.findMany({ + where: { + complexId, + acceptedAt: null, + revokedAt: null, + expiresAt: { + gte: new Date(), + }, + }, + orderBy: { + createdAt: 'desc', + }, + }), + ]); + + const membersWithAvatars = members.map((member) => ({ + userId: member.userId, + fullName: member.user.name, + email: member.user.email, + avatarUrl: resolveAvatarUrl({ + email: member.user.email, + image: member.user.image, + }), + role: member.role, + createdAt: member.createdAt.toISOString(), + })); + + return { + members: membersWithAvatars, + invitations: invitations.map(formatInvitation), + } satisfies ComplexUsersOverview; +} + +export async function inviteComplexUser( + userId: string, + complexId: string, + input: InviteComplexUserInput +): Promise { + await ensureComplexAdmin(userId, complexId); + + const email = normalizeEmail(input.email); + const complex = await db.complex.findUnique({ + where: { id: complexId }, + select: { + complexName: true, + }, + }); + + if (!complex) { + throw new ComplexMembersError('El complejo no existe.', 404); + } + + const existingUser = await db.user.findUnique({ + where: { email }, + select: { id: true }, + }); + + if (existingUser) { + const existingMembership = await db.complexUser.findUnique({ + where: { + complexId_userId: { + complexId, + userId: existingUser.id, + }, + }, + select: { userId: true }, + }); + + if (existingMembership) { + throw new ComplexMembersError('Ese usuario ya pertenece al complejo.', 409); + } + } + + const token = createInvitationToken(); + + const invitation = await db.$transaction(async (tx) => { + const pendingInvitation = await tx.complexInvitation.findFirst({ + where: { + complexId, + email, + acceptedAt: null, + revokedAt: null, + expiresAt: { + gte: new Date(), + }, + }, + orderBy: { + createdAt: 'desc', + }, + }); + + if (pendingInvitation) { + const refreshed = await tx.complexInvitation.update({ + where: { + id: pendingInvitation.id, + }, + data: { + tokenHash: hashToken(token), + expiresAt: nowPlusDays(INVITATION_TTL_DAYS), + acceptedAt: null, + revokedAt: null, + }, + }); + + return refreshed; + } + + return tx.complexInvitation.create({ + data: { + id: uuidv7(), + complexId, + email, + tokenHash: hashToken(token), + expiresAt: nowPlusDays(INVITATION_TTL_DAYS), + }, + }); + }); + + await sendInvitationEmail({ + complexName: complex.complexName, + inviteeEmail: email, + token, + }); + + return { + invitation: formatInvitation(invitation), + }; +} + +export async function resendComplexInvitation( + userId: string, + complexId: string, + invitationId: string +): Promise { + await ensureComplexAdmin(userId, complexId); + + const pendingInvitation = await db.complexInvitation.findUnique({ + where: { + id: invitationId, + }, + include: { + complex: { + select: { + complexName: true, + }, + }, + }, + }); + + if (!pendingInvitation || pendingInvitation.complexId !== complexId) { + throw new ComplexMembersError('La invitación no existe.', 404); + } + + if (pendingInvitation.acceptedAt) { + throw new ComplexMembersError('La invitación ya fue aceptada.', 409); + } + + if (pendingInvitation.revokedAt) { + throw new ComplexMembersError('La invitación fue cancelada.', 409); + } + + const refreshed = await refreshPendingInvitation(invitationId); + + await sendInvitationEmail({ + complexName: refreshed.invitation.complex.complexName, + inviteeEmail: pendingInvitation.email, + token: refreshed.token, + }); + + return { + invitation: formatInvitation({ + id: refreshed.invitation.id, + complexId: refreshed.invitation.complexId, + email: refreshed.invitation.email, + expiresAt: refreshed.invitation.expiresAt, + acceptedAt: refreshed.invitation.acceptedAt, + revokedAt: refreshed.invitation.revokedAt, + createdAt: refreshed.invitation.createdAt, + }), + }; +} + +export async function acceptComplexInvitations( + userId: string, + email: string, + input: AcceptComplexInvitationsInput = {} +): Promise { + const normalizedEmail = normalizeEmail(email); + const tokenHash = input.inviteToken ? hashToken(input.inviteToken) : null; + + const invitations = await db.complexInvitation.findMany({ + where: { + email: normalizedEmail, + acceptedAt: null, + revokedAt: null, + expiresAt: { + gte: new Date(), + }, + ...(tokenHash + ? { + tokenHash, + } + : {}), + }, + orderBy: { + createdAt: 'asc', + }, + }); + + if (tokenHash && invitations.length === 0) { + throw new ComplexMembersError('La invitación es inválida o ya venció.', 404); + } + + let acceptedCount = 0; + + for (const invitation of invitations) { + await db.$transaction(async (tx) => { + const existingMembership = await tx.complexUser.findUnique({ + where: { + complexId_userId: { + complexId: invitation.complexId, + userId, + }, + }, + select: { + userId: true, + }, + }); + + if (!existingMembership) { + await tx.complexUser.create({ + data: { + complexId: invitation.complexId, + userId, + role: 'EMPLOYEE', + }, + }); + } + + await tx.complexInvitation.update({ + where: { + id: invitation.id, + }, + data: { + acceptedAt: new Date(), + }, + }); + }); + + acceptedCount += 1; + } + + return { + acceptedCount, + }; +} + +export async function revokeComplexUser( + userId: string, + complexId: string, + input: RevokeComplexUserInput +) { + await ensureComplexAdmin(userId, complexId); + + const membership = await db.complexUser.findUnique({ + where: { + complexId_userId: { + complexId, + userId: input.userId, + }, + }, + select: { + role: true, + }, + }); + + if (!membership) { + throw new ComplexMembersError('Ese usuario no pertenece al complejo.', 404); + } + + if (membership.role !== 'EMPLOYEE') { + throw new ComplexMembersError('Solo podés revocar usuarios con rol EMPLOYEE.', 409); + } + + await db.complexUser.delete({ + where: { + complexId_userId: { + complexId, + userId: input.userId, + }, + }, + }); + + return { + ok: true, + }; +} + +export async function cancelComplexInvitation( + userId: string, + complexId: string, + invitationId: string +): Promise { + await ensureComplexAdmin(userId, complexId); + + const invitation = await db.complexInvitation.findUnique({ + where: { + id: invitationId, + }, + select: { + complexId: true, + acceptedAt: true, + revokedAt: true, + }, + }); + + if (!invitation || invitation.complexId !== complexId) { + throw new ComplexMembersError('La invitación no existe.', 404); + } + + if (invitation.acceptedAt) { + throw new ComplexMembersError('La invitación ya fue aceptada.', 409); + } + + if (invitation.revokedAt) { + return { ok: true }; + } + + await db.complexInvitation.update({ + where: { + id: invitationId, + }, + data: { + revokedAt: new Date(), + }, + }); + + return { ok: true }; +} + +export async function getComplexUsersOverview(userId: string, complexId: string) { + await ensureComplexMember(userId, complexId); + return listComplexUsers(complexId); +} diff --git a/apps/backend/src/modules/complex/services/complex.service.ts b/apps/backend/src/modules/complex/services/complex.service.ts index 11956fd..2f37906 100644 --- a/apps/backend/src/modules/complex/services/complex.service.ts +++ b/apps/backend/src/modules/complex/services/complex.service.ts @@ -65,7 +65,7 @@ async function buildUniqueSlug(source: string, excludeComplexId?: string): Promi } export async function createComplex(input: CreateComplexInput) { - const { userId, ...rest } = input; + const { userId } = input; return db.$transaction(async (tx) => { const complexSlug = await buildUniqueSlug(input.complexName); diff --git a/apps/backend/src/modules/user/services/user.service.ts b/apps/backend/src/modules/user/services/user.service.ts index 225aba5..67bd8ea 100644 --- a/apps/backend/src/modules/user/services/user.service.ts +++ b/apps/backend/src/modules/user/services/user.service.ts @@ -1,14 +1,24 @@ -import { createHash } from 'node:crypto'; import type { User } from '@/lib/auth'; +import { resolveAvatarUrl } from '@/lib/avatar'; import { db } from '@/lib/prisma'; import type { UserProfile } from '@repo/api-contract'; -function getGravatarUrl(email: string): string { - const hash = createHash('md5').update(email.trim().toLowerCase()).digest('hex'); - return `https://www.gravatar.com/avatar/${hash}?d=identicon`; -} - export async function getUserProfile(user: User, complexId?: string): Promise { + const dbUser = await db.user.findUnique({ + where: { id: user.id }, + select: { + id: true, + name: true, + email: true, + image: true, + createdAt: true, + }, + }); + + if (!dbUser) { + throw new Error('User not found.'); + } + let role = 'member'; if (complexId) { @@ -27,11 +37,14 @@ export async function getUserProfile(user: User, complexId?: string): Promise word[0]?.toUpperCase() ?? '').join(''); + return initials || 'U'; +} + +export function UserAvatar({ + src, + alt, + fallbackText, + size = 'default', + className, +}: UserAvatarProps) { + const [imageError, setImageError] = useState(false); + + useEffect(() => { + setImageError(false); + }, [src]); + + const canShowImage = Boolean(src) && !imageError; + + return ( + + {canShowImage && ( + { + setImageError(true); + }} + /> + )} + {getInitials(fallbackText)} + + ); +} diff --git a/apps/frontend/src/features/complex/complex-settings-page.tsx b/apps/frontend/src/features/complex/complex-settings-page.tsx index 9640828..f1d075e 100644 --- a/apps/frontend/src/features/complex/complex-settings-page.tsx +++ b/apps/frontend/src/features/complex/complex-settings-page.tsx @@ -1,16 +1,17 @@ import { apiClient } from '@/lib/api-client'; import { setCurrentComplexSlug } from '@/lib/current-complex'; import { useQuery } from '@tanstack/react-query'; -import { Building2, MapPin, Settings } from 'lucide-react'; +import { Building2, MapPin, Settings, Users } from 'lucide-react'; import { useEffect, useState } from 'react'; import { ComplexCourtsSection } from './components/complex-courts-section'; import { ComplexDetailsSection } from './components/complex-details-section'; +import { ComplexUsersSection } from './components/complex-users-section'; type ComplexSettingsPageProps = { complexSlug: string; }; -type TabOption = 'details' | 'courts'; +type TabOption = 'details' | 'courts' | 'users'; export function ComplexSettingsPage({ complexSlug }: ComplexSettingsPageProps) { const [activeTab, setActiveTab] = useState('details'); @@ -24,11 +25,21 @@ export function ComplexSettingsPage({ complexSlug }: ComplexSettingsPageProps) { queryFn: () => apiClient.complexes.getBySlug(complexSlug), }); + const myComplexesQuery = useQuery({ + queryKey: ['my-complexes'], + queryFn: () => apiClient.complexes.listMine(), + }); + const complexId = complexQuery.data?.id ?? null; + const currentMembership = myComplexesQuery.data?.find( + (complex) => complex.complexSlug === complexSlug + ); + const canManageUsers = currentMembership?.role === 'ADMIN'; const tabs = [ { id: 'details' as const, label: 'Datos del complejo', icon: Building2 }, { id: 'courts' as const, label: 'Canchas', icon: MapPin }, + { id: 'users' as const, label: 'Usuarios', icon: Users }, ]; return ( @@ -76,6 +87,10 @@ export function ComplexSettingsPage({ complexSlug }: ComplexSettingsPageProps) { )} {activeTab === 'courts' && } + + {activeTab === 'users' && ( + + )} diff --git a/apps/frontend/src/features/complex/components/complex-users-section.tsx b/apps/frontend/src/features/complex/components/complex-users-section.tsx new file mode 100644 index 0000000..1234415 --- /dev/null +++ b/apps/frontend/src/features/complex/components/complex-users-section.tsx @@ -0,0 +1,374 @@ +import { Button } from '@/components/ui/button'; +import { Field, FieldLabel } from '@/components/ui/field'; +import { Input } from '@/components/ui/input'; +import { + ResponsiveDialog, + ResponsiveDialogClose, + ResponsiveDialogContent, + ResponsiveDialogDescription, + ResponsiveDialogFooter, + ResponsiveDialogHeader, + ResponsiveDialogTitle, +} from '@/components/ui/responsive-dialog'; +import { Separator } from '@/components/ui/separator'; +import { UserAvatar } from '@/components/user-avatar'; +import { apiClient } from '@/lib/api-client'; +import type { ComplexUsersOverview } from '@repo/api-contract'; +import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; +import { AlertCircle, Loader2, Mail, RotateCw, Trash2, UserPlus, UserX, Users } from 'lucide-react'; +import { useEffect, useState } from 'react'; + +type ComplexUsersSectionProps = { + complexId: string | null; + canManageUsers: boolean; +}; + +function formatDate(value: string) { + return new Intl.DateTimeFormat('es-AR', { + dateStyle: 'medium', + timeStyle: 'short', + }).format(new Date(value)); +} + +function UsersSkeleton() { + return ( +
+
+ +

Usuarios

+
+ +

Cargando usuarios...

+
+ ); +} + +export function ComplexUsersSection({ complexId, canManageUsers }: ComplexUsersSectionProps) { + const queryClient = useQueryClient(); + const [email, setEmail] = useState(''); + const [errorMessage, setErrorMessage] = useState(null); + const [successMessage, setSuccessMessage] = useState(null); + const [invitationToCancel, setInvitationToCancel] = useState< + ComplexUsersOverview['invitations'][number] | null + >(null); + + useEffect(() => { + setEmail(''); + setErrorMessage(null); + setSuccessMessage(null); + setInvitationToCancel(null); + }, [complexId]); + + const usersQuery = useQuery({ + queryKey: ['complex-users', complexId], + enabled: Boolean(complexId), + queryFn: () => apiClient.complexes.listUsers(complexId!), + }); + + const inviteMutation = useMutation({ + mutationFn: (payload: { email: string }) => apiClient.complexes.inviteUser(complexId!, payload), + onSuccess: async () => { + setEmail(''); + setErrorMessage(null); + setSuccessMessage('Invitación enviada correctamente.'); + await queryClient.invalidateQueries({ queryKey: ['complex-users', complexId] }); + }, + onError: (error: Error) => { + setErrorMessage(error.message || 'No pudimos enviar la invitación.'); + setSuccessMessage(null); + }, + }); + + const revokeMutation = useMutation({ + mutationFn: (userId: string) => apiClient.complexes.revokeUser(complexId!, { userId }), + onSuccess: async () => { + setErrorMessage(null); + setSuccessMessage('El usuario fue desvinculado del complejo.'); + await queryClient.invalidateQueries({ queryKey: ['complex-users', complexId] }); + }, + onError: (error: Error) => { + setErrorMessage(error.message || 'No pudimos revocar el permiso.'); + setSuccessMessage(null); + }, + }); + + const resendInvitationMutation = useMutation({ + mutationFn: (invitationId: string) => + apiClient.complexes.resendInvitation(complexId!, invitationId), + onSuccess: async () => { + setErrorMessage(null); + setSuccessMessage('La invitación se reenvió correctamente.'); + await queryClient.invalidateQueries({ queryKey: ['complex-users', complexId] }); + }, + onError: (error: Error) => { + setErrorMessage(error.message || 'No pudimos reenviar la invitación.'); + setSuccessMessage(null); + }, + }); + + const cancelInvitationMutation = useMutation({ + mutationFn: (invitationId: string) => + apiClient.complexes.cancelInvitation(complexId!, invitationId), + onSuccess: async () => { + setErrorMessage(null); + setSuccessMessage('La invitación fue cancelada.'); + setInvitationToCancel(null); + await queryClient.invalidateQueries({ queryKey: ['complex-users', complexId] }); + }, + onError: (error: Error) => { + setErrorMessage(error.message || 'No pudimos cancelar la invitación.'); + setSuccessMessage(null); + }, + }); + + const handleInvite = async (event: React.FormEvent) => { + event.preventDefault(); + setErrorMessage(null); + setSuccessMessage(null); + + const trimmedEmail = email.trim(); + + if (!trimmedEmail) { + setErrorMessage('Ingresá un email.'); + return; + } + + inviteMutation.mutate({ email: trimmedEmail }); + }; + + if (!complexId) { + return ( +
+
+ +

Usuarios

+
+ +

+ Seleccioná un complejo para ver sus usuarios. +

+
+ ); + } + + if (usersQuery.isLoading) { + return ; + } + + if (usersQuery.isError || !usersQuery.data) { + return ( +
+
+ +

Usuarios

+
+ +

No se pudieron cargar los usuarios del complejo.

+
+ ); + } + + const data: ComplexUsersOverview = usersQuery.data; + + return ( +
+
+ +

Usuarios

+
+ + + {canManageUsers ? ( +
+
+ +

Invitar un usuario

+
+ +
+ + Email + setEmail(event.target.value)} + placeholder="empleado@correo.com" + /> + + +
+ +
+
+ +

+ La invitación se envía por email y el usuario quedará vinculado como EMPLOYEE al + aceptar. +

+
+ ) : ( +
+ Solo un ADMIN puede invitar o desvincular usuarios. +
+ )} + + {successMessage && ( +

{successMessage}

+ )} + {errorMessage && ( +

+ + {errorMessage} +

+ )} + +
+
+

Miembros

+
+ {data.members.map((member) => ( +
+
+

{member.fullName}

+

{member.email}

+

+ Rol: {member.role} · Desde {formatDate(member.createdAt)} +

+
+ +
+ + + {canManageUsers && member.role === 'EMPLOYEE' && ( + + )} +
+
+ ))} +
+
+ +
+

Invitaciones pendientes

+ {data.invitations.length === 0 ? ( +

No hay invitaciones pendientes.

+ ) : ( +
+ {data.invitations.map((invitation) => ( +
+
+

{invitation.email}

+

+ Vence {formatDate(invitation.expiresAt)} +

+
+
+ + + Pendiente + + + {canManageUsers && ( +
+ + +
+ )} +
+
+ ))} +
+ )} +
+
+ + { + if (!open) { + setInvitationToCancel(null); + } + }} + > + + + Cancelar invitación + + Esta acción va a invalidar el link de invitación y la persona ya no podrá aceptar la + invitación. + + + +

+ {invitationToCancel + ? `Se cancelará la invitación enviada a ${invitationToCancel.email}.` + : 'Se cancelará la invitación seleccionada.'} +

+ +

+ Si querés volver a invitarlo, vas a poder generar una nueva invitación después. +

+ + + + + + + +
+
+
+ ); +} diff --git a/apps/frontend/src/features/layout/root-layout.tsx b/apps/frontend/src/features/layout/root-layout.tsx index 4b39a63..7bd98ec 100644 --- a/apps/frontend/src/features/layout/root-layout.tsx +++ b/apps/frontend/src/features/layout/root-layout.tsx @@ -1,4 +1,3 @@ -import { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'; import { Button } from '@/components/ui/button'; import { DropdownMenu, @@ -8,25 +7,49 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; +import { UserAvatar } from '@/components/user-avatar'; import { apiClient } from '@/lib/api-client'; import { useAuth } from '@/lib/auth'; +import { acceptStoredPendingInvite } from '@/lib/invitations'; import { useCurrentComplexStore } from '@/lib/stores/current-complex-store'; -import { useQuery } from '@tanstack/react-query'; +import { useQuery, useQueryClient } from '@tanstack/react-query'; import { Link, Outlet, useNavigate } from '@tanstack/react-router'; import { LogOut, Menu, UserRound } from 'lucide-react'; -import { useMemo } from 'react'; +import { useEffect, useMemo, useRef } from 'react'; import { ThemeSwitcher } from './theme-switcher'; export function RootLayout() { const navigate = useNavigate(); - const { isAuthenticated, displayName, initials, avatarUrl, signOut } = useAuth(); + const queryClient = useQueryClient(); + const { user, isAuthenticated, displayName, avatarUrl, signOut } = useAuth(); const { currentComplexSlug, setCurrentComplex } = useCurrentComplexStore(); + const processedInviteForUser = useRef(null); const myComplexesQuery = useQuery({ queryKey: ['my-complexes'], enabled: isAuthenticated, queryFn: () => apiClient.complexes.listMine(), }); + useEffect(() => { + if (!isAuthenticated) { + processedInviteForUser.current = null; + return; + } + + const userKey = user?.email ?? displayName ?? 'authenticated-user'; + + if (processedInviteForUser.current === userKey) { + return; + } + + processedInviteForUser.current = userKey; + + void (async () => { + await acceptStoredPendingInvite(apiClient.complexes.acceptPendingInvitations); + await queryClient.invalidateQueries({ queryKey: ['my-complexes'] }); + })(); + }, [displayName, isAuthenticated, queryClient, user?.email]); + const complexSlug = currentComplexSlug || myComplexesQuery.data?.[0]?.complexSlug; const currentComplexName = useMemo(() => { @@ -85,10 +108,12 @@ export function RootLayout() { type="button" className="hidden items-center gap-2 rounded-md px-2 py-1.5 transition-colors hover:bg-muted md:inline-flex" > - - - {initials} - + {displayName} diff --git a/apps/frontend/src/features/login/login-page.tsx b/apps/frontend/src/features/login/login-page.tsx index 41c0678..f2089e2 100644 --- a/apps/frontend/src/features/login/login-page.tsx +++ b/apps/frontend/src/features/login/login-page.tsx @@ -3,6 +3,7 @@ import { Field, FieldError, FieldLabel } from '@/components/ui/field'; import { Input } from '@/components/ui/input'; import { apiClient, authClient } from '@/lib/api-client'; import { useAuth } from '@/lib/auth'; +import { acceptStoredPendingInvite } from '@/lib/invitations'; import { zodResolver } from '@hookform/resolvers/zod'; import { Link, useNavigate } from '@tanstack/react-router'; import { useState } from 'react'; @@ -39,6 +40,7 @@ export function LoginPage({ redirectTo = '/' }: LoginPageProps) { }); async function handlePostLogin() { + await acceptStoredPendingInvite(apiClient.complexes.acceptPendingInvitations); const complexes = await apiClient.complexes.listMine(); if (complexes.length === 0) { diff --git a/apps/frontend/src/features/onboard/onboard-login-page.tsx b/apps/frontend/src/features/onboard/onboard-login-page.tsx index 5a23e0c..3ffdf5b 100644 --- a/apps/frontend/src/features/onboard/onboard-login-page.tsx +++ b/apps/frontend/src/features/onboard/onboard-login-page.tsx @@ -3,6 +3,7 @@ import { Field, FieldError, FieldLabel } from '@/components/ui/field'; import { Input } from '@/components/ui/input'; import { apiClient, authClient } from '@/lib/api-client'; import { useAuth } from '@/lib/auth'; +import { acceptStoredPendingInvite } from '@/lib/invitations'; import { zodResolver } from '@hookform/resolvers/zod'; import { useNavigate } from '@tanstack/react-router'; import { useState } from 'react'; @@ -29,26 +30,46 @@ const signupSchema = z type LoginForm = z.infer; type SignupForm = z.infer; -export function OnboardLoginPage() { +type OnboardLoginPageProps = { + variant?: 'onboard' | 'invite'; + inviteEmail?: string | null; +}; + +export function OnboardLoginPage({ + variant = 'onboard', + inviteEmail = null, +}: OnboardLoginPageProps) { const navigate = useNavigate(); const { signInWithPassword, signUp } = useAuth(); - const [mode, setMode] = useState<'login' | 'signup'>('login'); + const [mode, setMode] = useState<'login' | 'signup'>(variant === 'invite' ? 'signup' : 'login'); const [submitError, setSubmitError] = useState(null); const [isSubmitting, setIsSubmitting] = useState(false); const loginForm = useForm({ resolver: zodResolver(loginSchema), mode: 'onChange', - defaultValues: { email: '', password: '' }, + defaultValues: { email: inviteEmail ?? '', password: '' }, }); const signupForm = useForm({ resolver: zodResolver(signupSchema), mode: 'onChange', - defaultValues: { fullName: '', email: '', password: '', confirmPassword: '' }, + defaultValues: { + fullName: '', + email: inviteEmail ?? '', + password: '', + confirmPassword: '', + }, }); async function handlePostLogin() { + await acceptStoredPendingInvite(apiClient.complexes.acceptPendingInvitations); + + if (variant === 'invite') { + await navigate({ to: '/' }); + return; + } + const complexes = await apiClient.complexes.listMine(); if (complexes.length === 0) { @@ -93,7 +114,12 @@ export function OnboardLoginPage() { search: { email: values.email }, }); } else { - navigate({ to: '/onboard/create-complex' }); + if (variant === 'invite') { + await acceptStoredPendingInvite(apiClient.complexes.acceptPendingInvitations); + await navigate({ to: '/' }); + } else { + await handlePostLogin(); + } } } catch { setSubmitError('No pudimos crear la cuenta. Intenta nuevamente.'); @@ -108,7 +134,7 @@ export function OnboardLoginPage() { try { await authClient.signIn.social({ provider: 'google', - callbackURL: `${window.location.origin}/onboard/create-complex`, + callbackURL: `${window.location.origin}/auth-callback`, }); } catch { setSubmitError('No pudimos iniciar sesión con Google.'); @@ -123,8 +149,12 @@ export function OnboardLoginPage() {

{mode === 'login' - ? 'Ingresá con tu cuenta para continuar.' - : 'Creá tu cuenta para comenzar.'} + ? variant === 'invite' + ? 'Ingresá con tu cuenta para aceptar la invitación.' + : 'Ingresá con tu cuenta para continuar.' + : variant === 'invite' + ? 'Creá tu cuenta para aceptar la invitación.' + : 'Creá tu cuenta para comenzar.'}