main 0aa4212fb4b1 cached
349 files
3.1 MB
842.9k tokens
2916 symbols
1 requests
Download .txt
Showing preview only (3,378K chars total). Download the full file or copy to clipboard to get everything.
Repository: spring-petclinic/spring-petclinic-graphql
Branch: main
Commit: 0aa4212fb4b1
Files: 349
Total size: 3.1 MB

Directory structure:
gitextract_pbnw42or/

├── .gitattributes
├── .github/
│   └── workflows/
│       └── build-app.yml
├── .gitignore
├── .gitpod.Dockerfile
├── .gitpod.yml
├── .mvn/
│   └── wrapper/
│       ├── MavenWrapperDownloader.java
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── .run/
│   └── Frontend.run.xml
├── LICENCE
├── backend/
│   ├── .editorconfig
│   ├── .gitignore
│   ├── pom.xml
│   ├── sample-queries.graphql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       └── springframework/
│       │   │           └── samples/
│       │   │               └── petclinic/
│       │   │                   ├── FakeDataSqlCreator.java
│       │   │                   ├── PetClinicApplication.java
│       │   │                   ├── auth/
│       │   │                   │   ├── Role.java
│       │   │                   │   ├── User.java
│       │   │                   │   └── UserRepository.java
│       │   │                   ├── graphql/
│       │   │                   │   ├── AbstractOwnerInput.java
│       │   │                   │   ├── AbstractOwnerPayload.java
│       │   │                   │   ├── AbstractPetInput.java
│       │   │                   │   ├── AbstractPetPayload.java
│       │   │                   │   ├── AddOwnerInput.java
│       │   │                   │   ├── AddOwnerPayload.java
│       │   │                   │   ├── AddPetInput.java
│       │   │                   │   ├── AddPetPayload.java
│       │   │                   │   ├── AddSpecialtyPayload.java
│       │   │                   │   ├── AddVetErrorPayload.java
│       │   │                   │   ├── AddVetInput.java
│       │   │                   │   ├── AddVetPayload.java
│       │   │                   │   ├── AddVetSuccessPayload.java
│       │   │                   │   ├── AddVisitInput.java
│       │   │                   │   ├── AddVisitPayload.java
│       │   │                   │   ├── AuthController.java
│       │   │                   │   ├── OwnerController.java
│       │   │                   │   ├── PageInfo.java
│       │   │                   │   ├── PetController.java
│       │   │                   │   ├── PetTypeController.java
│       │   │                   │   ├── RemoveSpecialtyPayload.java
│       │   │                   │   ├── SpecialtyController.java
│       │   │                   │   ├── UpdateOwnerInput.java
│       │   │                   │   ├── UpdateOwnerPayload.java
│       │   │                   │   ├── UpdatePetInput.java
│       │   │                   │   ├── UpdatePetPayload.java
│       │   │                   │   ├── UpdateSpecialtyInput.java
│       │   │                   │   ├── UpdateSpecialtyPayload.java
│       │   │                   │   ├── VetController.java
│       │   │                   │   ├── VisitConnection.java
│       │   │                   │   ├── VisitController.java
│       │   │                   │   ├── VisitPublisher.java
│       │   │                   │   └── runtime/
│       │   │                   │       ├── DateCoercing.java
│       │   │                   │       ├── GraphiQlConfiguration.java
│       │   │                   │       └── PetClinicRuntimeWiringConfiguration.java
│       │   │                   ├── model/
│       │   │                   │   ├── BaseEntity.java
│       │   │                   │   ├── InvalidVetDataException.java
│       │   │                   │   ├── NamedEntity.java
│       │   │                   │   ├── OrderField.java
│       │   │                   │   ├── Owner.java
│       │   │                   │   ├── OwnerFilter.java
│       │   │                   │   ├── OwnerOrder.java
│       │   │                   │   ├── OwnerService.java
│       │   │                   │   ├── Person.java
│       │   │                   │   ├── Pet.java
│       │   │                   │   ├── PetService.java
│       │   │                   │   ├── PetType.java
│       │   │                   │   ├── PetValidator.java
│       │   │                   │   ├── Specialty.java
│       │   │                   │   ├── SpecialtyService.java
│       │   │                   │   ├── Vet.java
│       │   │                   │   ├── VetService.java
│       │   │                   │   ├── Vets.java
│       │   │                   │   ├── Visit.java
│       │   │                   │   ├── VisitCreatedEvent.java
│       │   │                   │   ├── VisitService.java
│       │   │                   │   └── package-info.java
│       │   │                   ├── repository/
│       │   │                   │   ├── OwnerRepository.java
│       │   │                   │   ├── PetRepository.java
│       │   │                   │   ├── PetTypeRepository.java
│       │   │                   │   ├── SpecialtyRepository.java
│       │   │                   │   ├── VetRepository.java
│       │   │                   │   └── VisitRepository.java
│       │   │                   ├── security/
│       │   │                   │   ├── JwtTokenService.java
│       │   │                   │   ├── LoginController.java
│       │   │                   │   ├── LoginRequest.java
│       │   │                   │   ├── LoginResponse.java
│       │   │                   │   ├── NeverExpiringTokenGenerator.java
│       │   │                   │   ├── RSAKeyProvider.java
│       │   │                   │   └── SecurityConfig.java
│       │   │                   └── util/
│       │   │                       └── EntityUtils.java
│       │   └── resources/
│       │       ├── application.properties
│       │       ├── db/
│       │       │   └── migration/
│       │       │       ├── V100_1__create_schema.sql
│       │       │       └── V100_2__fill_db.sql
│       │       ├── graphql/
│       │       │   └── petclinic.graphqls
│       │       ├── keys/
│       │       │   ├── private_key.pem
│       │       │   └── public_key.pem
│       │       ├── readme-graphiql.md
│       │       ├── testdata/
│       │       │   ├── owners.csv
│       │       │   ├── pets.csv
│       │       │   └── visits.csv
│       │       └── ui/
│       │           └── graphiql/
│       │               ├── assets/
│       │               │   ├── Range-52ddcb6a.js
│       │               │   ├── SchemaReference.es-0ccab37b.js
│       │               │   ├── brace-fold.es-f2e3735d.js
│       │               │   ├── closebrackets.es-e969742b.js
│       │               │   ├── codemirror.es-52e8b92d.js
│       │               │   ├── codemirror.es2-5884f31a.js
│       │               │   ├── comment.es-39699bae.js
│       │               │   ├── dialog.es-b2776d29.js
│       │               │   ├── foldgutter.es-b6cee46a.js
│       │               │   ├── forEachState.es-b2033c2b.js
│       │               │   ├── hint.es-1418191b.js
│       │               │   ├── hint.es2-598d3bfe.js
│       │               │   ├── index-27dc12ba.js
│       │               │   ├── index-928ba5be.css
│       │               │   ├── info-addon.es-c9b2027b.js
│       │               │   ├── info.es-3175bfab.js
│       │               │   ├── javascript.es-3c6957c5.js
│       │               │   ├── jump-to-line.es-3afd5e0a.js
│       │               │   ├── jump.es-7b275cf1.js
│       │               │   ├── lint.es-fe7166bb.js
│       │               │   ├── lint.es2-97c4a6f4.js
│       │               │   ├── lint.es3-bcaf3718.js
│       │               │   ├── matchbrackets.es-97d2e827.js
│       │               │   ├── matchbrackets.es2-f53f57e6.js
│       │               │   ├── mode-indent.es-057a4f6a.js
│       │               │   ├── mode.es-8c5bcfbd.js
│       │               │   ├── mode.es2-8a6e8f8c.js
│       │               │   ├── mode.es3-fa110728.js
│       │               │   ├── search.es-2e392dd0.js
│       │               │   ├── searchcursor.es-b1a352a2.js
│       │               │   ├── searchcursor.es2-cbfe7cae.js
│       │               │   ├── show-hint.es-b981493e.js
│       │               │   └── sublime.es-e2a3eb60.js
│       │               └── index.html
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── springframework/
│           │           └── samples/
│           │               └── petclinic/
│           │                   ├── PetClinicTestDbConfiguration.java
│           │                   ├── graphql/
│           │                   │   ├── AbstractClinicGraphqlTests.java
│           │                   │   ├── AuthControllerTests.java
│           │                   │   ├── GraphQlTokenProvider.java
│           │                   │   ├── OwnerControllerTests.java
│           │                   │   ├── PetControllerTests.java
│           │                   │   ├── PetTypeControllerTests.java
│           │                   │   ├── SpecialtyControllerTests.java
│           │                   │   ├── VetControllerTests.java
│           │                   │   ├── VisitControllerTests.java
│           │                   │   └── VisitSubscriptionTest.java
│           │                   ├── model/
│           │                   │   └── ValidatorTests.java
│           │                   └── repository/
│           │                       ├── ApplicationTestConfig.java
│           │                       └── ClinicRepositorySpringDataJpaTests.java
│           └── resources/
│               └── graphql-test/
│                   ├── addPetMutation.graphql
│                   ├── addVetMutation.graphql
│                   ├── addVisitMutation.graphql
│                   ├── addVisitMutationWithVariables.graphql
│                   ├── meQuery.graphql
│                   └── updatePetMutation.graphql
├── build-local.sh
├── docker-compose-petclinic.yml
├── docker-compose.yml
├── e2e-tests/
│   ├── .github/
│   │   └── workflows/
│   │       └── playwright.yml
│   ├── .gitignore
│   ├── .prettierrc
│   ├── package.json
│   ├── playwright.config.ts
│   ├── pom.xml
│   └── tests/
│       ├── graphiql.spec.ts
│       ├── owner-detail.spec.ts
│       ├── owner-search-page.spec.ts
│       ├── petclinic.fixtures.ts
│       └── vets.spec.ts
├── frontend/
│   ├── .eslintrc.cjs
│   ├── .gitignore
│   ├── .prettierignore
│   ├── Dockerfile
│   ├── README.md
│   ├── codegen.ts
│   ├── docker/
│   │   └── nginx.conf
│   ├── index.html
│   ├── package.json
│   ├── pom.xml
│   ├── postcss.config.js
│   ├── prettier.config.cjs
│   ├── src/
│   │   ├── App.css
│   │   ├── App.tsx
│   │   ├── NotFoundPage.tsx
│   │   ├── WelcomePage.tsx
│   │   ├── assets/
│   │   │   └── readme.md
│   │   ├── components/
│   │   │   ├── Button.tsx
│   │   │   ├── ButtonBar.tsx
│   │   │   ├── Card.tsx
│   │   │   ├── Heading.tsx
│   │   │   ├── Input.tsx
│   │   │   ├── Label.tsx
│   │   │   ├── Link.tsx
│   │   │   ├── Nav.tsx
│   │   │   ├── PageHeader.tsx
│   │   │   ├── PageLayout.tsx
│   │   │   ├── Section.tsx
│   │   │   ├── Select.tsx
│   │   │   └── Table.tsx
│   │   ├── create-graphql-client.ts
│   │   ├── fonts/
│   │   │   ├── README.txt
│   │   │   ├── generator_config.txt
│   │   │   ├── metropolis-bold-demo.html
│   │   │   ├── metropolis-extrabold-demo.html
│   │   │   ├── metropolis-regular-demo.html
│   │   │   └── specimen_files/
│   │   │       ├── grid_12-825-55-15.css
│   │   │       └── specimen_stylesheet.css
│   │   ├── fonts.css
│   │   ├── graphql-types.txt
│   │   ├── index.css
│   │   ├── login/
│   │   │   ├── AuthTokenProvider.tsx
│   │   │   ├── LoginPage.tsx
│   │   │   └── MeQuery.graphql
│   │   ├── main.tsx
│   │   ├── owners/
│   │   │   ├── AddVisit.graphql
│   │   │   ├── AllVetNames.graphql
│   │   │   ├── FindOwnerByLastName.graphql
│   │   │   ├── FindOwnerWithPetsAndVisits.graphql
│   │   │   ├── NewVisitForm.tsx
│   │   │   ├── NewVisitPanel.tsx
│   │   │   ├── OnNewVisit.graphql
│   │   │   ├── OwnerFields.graphql
│   │   │   ├── OwnerPage.tsx
│   │   │   ├── OwnerSearchPage.tsx
│   │   │   ├── Visit.fragment.graphql
│   │   │   └── VisitWithVet.fragment.graphql
│   │   ├── urls.ts
│   │   ├── use-current-user-fullname.tsx
│   │   ├── use-logout.ts
│   │   ├── utils.ts
│   │   ├── vets/
│   │   │   ├── AddVet.graphql
│   │   │   ├── AddVetForm.tsx
│   │   │   ├── AllSpecialties.graphql
│   │   │   ├── AllVets.graphql
│   │   │   ├── VetAndVisits.graphql
│   │   │   ├── VetsOverview.tsx
│   │   │   └── VetsPage.tsx
│   │   └── vite-env.d.ts
│   ├── tailwind.config.js
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   └── vite.config.ts
├── graphql.config.yml
├── login.http
├── mvnw
├── mvnw.cmd
├── petclinic-graphiql/
│   ├── .eslintrc.cjs
│   ├── .gitignore
│   ├── README.md
│   ├── index.html
│   ├── package.json
│   ├── pom.xml
│   ├── src/
│   │   ├── App.tsx
│   │   ├── LoginForm.tsx
│   │   ├── PetClinicGraphiql.tsx
│   │   ├── index.css
│   │   ├── main.tsx
│   │   ├── urls.ts
│   │   └── vite-env.d.ts
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   └── vite.config.ts
├── pom.xml
├── readme.md
└── talk/
    ├── curl-demo.sh
    ├── graphql-introduction.html
    ├── lib/
    │   ├── jquery-2.2.4.js
    │   └── js/
    │       └── line-numbers.js
    └── reveal.js/
        ├── .gitignore
        ├── .travis.yml
        ├── CONTRIBUTING.md
        ├── Gruntfile.js
        ├── LICENSE
        ├── README.md
        ├── bower.json
        ├── css/
        │   ├── print/
        │   │   ├── paper.css
        │   │   └── pdf.css
        │   ├── reveal.css
        │   ├── reveal.scss
        │   └── theme/
        │       ├── README.md
        │       ├── beige.css
        │       ├── black.css
        │       ├── blood.css
        │       ├── fonts/
        │       │   └── google-fonts.css
        │       ├── league.css
        │       ├── moon.css
        │       ├── night.css
        │       ├── serif.css
        │       ├── simple.css
        │       ├── sky.css
        │       ├── solarized.css
        │       ├── source/
        │       │   ├── beige.scss
        │       │   ├── black.scss
        │       │   ├── blood.scss
        │       │   ├── league.scss
        │       │   ├── moon.scss
        │       │   ├── night.scss
        │       │   ├── serif.scss
        │       │   ├── simple.scss
        │       │   ├── sky.scss
        │       │   ├── solarized.scss
        │       │   └── white.scss
        │       ├── template/
        │       │   ├── mixins.scss
        │       │   ├── settings.scss
        │       │   └── theme.scss
        │       └── white.css
        ├── index.html
        ├── js/
        │   └── reveal.js
        ├── lib/
        │   ├── css/
        │   │   └── zenburn.css
        │   ├── font/
        │   │   ├── league-gothic/
        │   │   │   ├── LICENSE
        │   │   │   └── league-gothic.css
        │   │   └── source-sans-pro/
        │   │       ├── LICENSE
        │   │       └── source-sans-pro.css
        │   └── js/
        │       ├── classList.js
        │       └── html5shiv.js
        ├── package.json
        ├── plugin/
        │   ├── highlight/
        │   │   └── highlight.js
        │   ├── markdown/
        │   │   ├── example.html
        │   │   ├── example.md
        │   │   ├── markdown.js
        │   │   └── marked.js
        │   ├── math/
        │   │   └── math.js
        │   ├── multiplex/
        │   │   ├── client.js
        │   │   ├── index.js
        │   │   └── master.js
        │   ├── notes/
        │   │   ├── notes.html
        │   │   └── notes.js
        │   ├── notes-server/
        │   │   ├── client.js
        │   │   ├── index.js
        │   │   └── notes.html
        │   ├── print-pdf/
        │   │   └── print-pdf.js
        │   ├── search/
        │   │   └── search.js
        │   └── zoom-js/
        │       └── zoom.js
        └── test/
            ├── examples/
            │   ├── barebones.html
            │   ├── embedded-media.html
            │   ├── math.html
            │   ├── slide-backgrounds.html
            │   └── slide-transitions.html
            ├── qunit-1.12.0.css
            ├── qunit-1.12.0.js
            ├── test-markdown-element-attributes.html
            ├── test-markdown-element-attributes.js
            ├── test-markdown-slide-attributes.html
            ├── test-markdown-slide-attributes.js
            ├── test-markdown.html
            ├── test-markdown.js
            ├── test-pdf.html
            ├── test-pdf.js
            ├── test.html
            └── test.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
*.ai binary
*.eps binary


================================================
FILE: .github/workflows/build-app.yml
================================================
on:
  - push

jobs:
  petclinic-graphiql:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./petclinic-graphiql

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18

      - uses: pnpm/action-setup@v2.0.1
        name: Install pnpm
        id: pnpm-install
        with:
          version: 8
          run_install: false

      - name: Install dependencies
        run: pnpm install
      - name: Build application
        run: pnpm build
      - name: Archive artifacts
        uses: actions/upload-artifact@v3
        with:
          name: graphiql-dist
          path: ./petclinic-graphiql/dist/**
          retention-days: 1

  backend:
    runs-on: ubuntu-latest
    needs: petclinic-graphiql
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Install Java 21
        uses: actions/setup-java@v3
        with:
          java-version: "21"
          distribution: "temurin"
          cache: maven
      - name: Clear embedded graphiql
        run: rm -rf backend/src/main/resources/ui/graphiql
      - name: Download graphiql
        uses: actions/download-artifact@v3
        with:
          name: graphiql-dist
          path: backend/src/main/resources/ui/graphiql
      - name: show graphiql artifact
        run: ls -lR backend/src/main/resources/ui/
      - name: Build with maven
        run: ./mvnw -pl backend spring-boot:build-image -Dspring-boot.build-image.imageName=spring-petclinic/petclinic-graphql-backend:0.0.1
      - name: Export docker image
        run:  docker save spring-petclinic/petclinic-graphql-backend:0.0.1|gzip>petclinic-graphql-backend.tar.gz
      - name: Archive artifacts
        uses: actions/upload-artifact@v3
        with:
          name: petclinic-backend-docker
          path: petclinic-graphql-backend.tar.gz
          retention-days: 1

  frontend:
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: ./frontend

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Install Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18

      - uses: pnpm/action-setup@v2.0.1
        name: Install pnpm
        id: pnpm-install
        with:
          version: 8
          run_install: false

      - name: Install dependencies
        run: pnpm install
      - name: Code checks
        run: pnpm run check
      - name: Build application
        run: pnpm build
      - name: Build frontend docker image
        run: docker build . --tag spring-petclinic/petclinic-graphql-frontend:0.0.1
      - name: Export frontend docker image
        run:  docker save spring-petclinic/petclinic-graphql-frontend:0.0.1|gzip>../petclinic-graphql-frontend.tar.gz
      - name: LS
        run: ls -lR ..
      - name: Archive artifacts
        uses: actions/upload-artifact@v3
        with:
          name: petclinic-frontend-docker
          path: petclinic-graphql-frontend.tar.gz
          retention-days: 1

  end-to-end-test:
    timeout-minutes: 60
    runs-on: ubuntu-latest
    needs: [petclinic-graphiql,backend,frontend]
    steps:
      - name: setup playwright
        uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 18
      - name: Download backend artifacts
        uses: actions/download-artifact@v3
        with:
          name: petclinic-backend-docker
          path: petclinic-backend-docker
      - name: Download frontend docker image
        uses: actions/download-artifact@v3
        with:
          name: petclinic-frontend-docker
          path: petclinic-frontend-docker
      - name: LS
        run: ls -lR
      - name: Import backend Docker image
        run: gunzip -c petclinic-backend-docker/petclinic-graphql-backend.tar.gz|docker load
      - name: Import frontend Docker image
        run: gunzip -c petclinic-frontend-docker/petclinic-graphql-frontend.tar.gz|docker load
      - name: run docker compose
        run: docker-compose -f docker-compose-petclinic.yml up -d
      - uses: pnpm/action-setup@v2.0.1
        name: Install pnpm
        id: pnpm-install
        with:
          version: 8
          run_install: false
      - name: Install dependencies
        working-directory: ./e2e-tests
        run: pnpm install
      - name: Install Playwright Browsers
        working-directory: ./e2e-tests
        run: pnpm exec playwright install --with-deps
      - name: wait for backend on port 3090
        uses: iFaxity/wait-on-action@v1.1.0
        with:
          resource: http-get://localhost:3090
      - name: wait for frontend on port 3091
        uses: iFaxity/wait-on-action@v1.1.0
        with:
          resource: http-get://localhost:3091
      - name: Run Playwright tests
        working-directory: ./e2e-tests
        run: pnpm test:docker-compose
      - name: Test Report
        uses: dorny/test-reporter@v1
        if: success() || failure()    # run this step even if previous step failed
        with:
         name: PlayWright Test            # Name of the check run which will be created
         path: e2e-tests/test-results.xml    # Path to test results
         reporter: java-junit        # Format of test results
      - uses: actions/upload-artifact@v3
        if: always()
        with:
          name: playwright-report
          path: ./e2e-tests/playwright-report/
          retention-days: 2


================================================
FILE: .gitignore
================================================
target/*
.settings/*
.classpath
.project
.idea
*.iml
/target
*/target/

generated/

# Easier branch switching
springboot-petclinic-client/
springboot-petclinic-server/

node_modules/
npm-debug.log
dist/

frontend/.eslintcache


================================================
FILE: .gitpod.Dockerfile
================================================
FROM gitpod/workspace-full

USER gitpod

RUN bash -c ". /home/gitpod/.sdkman/bin/sdkman-init.sh && \
 sdk install java 21-tem && \
 sdk default java 21-tem"

# Install custom tools, runtime, etc. using apt-get
# For example, the command below would install "bastet" - a command line tetris clone:
#
# RUN sudo apt-get -q update && \
#     sudo apt-get install -yq bastet && \
#     sudo rm -rf /var/lib/apt/lists/*
#
# More information: https://www.gitpod.io/docs/config-docker/


================================================
FILE: .gitpod.yml
================================================
image:
  file: .gitpod.Dockerfile
tasks:
  - name: Build
    init: |
      ./mvnw package -Dmaven.test.skip=true -pl backend
      gp sync-done build
  - name: "Run Petclinic Backend"
    init: |
      gp sync-await build
    command: |
      export SPRING_DOCKER_COMPOSE_FILE=/workspace/spring-petclinic-graphql/docker-compose.yml
      ./mvnw spring-boot:run -pl backend
  - name: "Frontend"
    init: |
      cd frontend
      corepack enable
      pnpm install
      pnpm build
    command: |
      gp ports await 9977
      cd $GITPOD_REPO_ROOT/frontend
      pnpm dev
ports:
  - port: 9977
    onOpen: open-browser
    visibility: public
  - port: 3080
    onOpen: open-browser
    visibility: public
vscode:
  extensions:
    - redhat.java
    - vscjava.vscode-java-debug
    - vscjava.vscode-java-test
    - pivotal.vscode-spring-boot
    - graphql.vscode-graphql
jetbrains:
  intellij:
    plugins:
      - com.intellij.lang.jsgraphql
    prebuilds:
      version: both


================================================
FILE: .mvn/wrapper/MavenWrapperDownloader.java
================================================
/*
 * Copyright 2007-present the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;

public class MavenWrapperDownloader {

    private static final String WRAPPER_VERSION = "0.5.6";
    /**
     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
     */
    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
        + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";

    /**
     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
     * use instead of the default one.
     */
    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
            ".mvn/wrapper/maven-wrapper.properties";

    /**
     * Path where the maven-wrapper.jar will be saved to.
     */
    private static final String MAVEN_WRAPPER_JAR_PATH =
            ".mvn/wrapper/maven-wrapper.jar";

    /**
     * Name of the property which should be used to override the default download url for the wrapper.
     */
    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";

    public static void main(String args[]) {
        System.out.println("- Downloader started");
        File baseDirectory = new File(args[0]);
        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());

        // If the maven-wrapper.properties exists, read it and check if it contains a custom
        // wrapperUrl parameter.
        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
        String url = DEFAULT_DOWNLOAD_URL;
        if(mavenWrapperPropertyFile.exists()) {
            FileInputStream mavenWrapperPropertyFileInputStream = null;
            try {
                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
                Properties mavenWrapperProperties = new Properties();
                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
            } catch (IOException e) {
                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
            } finally {
                try {
                    if(mavenWrapperPropertyFileInputStream != null) {
                        mavenWrapperPropertyFileInputStream.close();
                    }
                } catch (IOException e) {
                    // Ignore ...
                }
            }
        }
        System.out.println("- Downloading from: " + url);

        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
        if(!outputFile.getParentFile().exists()) {
            if(!outputFile.getParentFile().mkdirs()) {
                System.out.println(
                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
            }
        }
        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
        try {
            downloadFileFromURL(url, outputFile);
            System.out.println("Done");
            System.exit(0);
        } catch (Throwable e) {
            System.out.println("- Error downloading");
            e.printStackTrace();
            System.exit(1);
        }
    }

    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
            String username = System.getenv("MVNW_USERNAME");
            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
            Authenticator.setDefault(new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });
        }
        URL website = new URL(urlString);
        ReadableByteChannel rbc;
        rbc = Channels.newChannel(website.openStream());
        FileOutputStream fos = new FileOutputStream(destination);
        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        fos.close();
        rbc.close();
    }

}


================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar


================================================
FILE: .run/Frontend.run.xml
================================================
<component name="ProjectRunConfigurationManager">
  <configuration default="false" name="Frontend" type="js.build_tools.npm">
    <package-json value="$PROJECT_DIR$/frontend/package.json" />
    <command value="run" />
    <scripts>
      <script value="dev" />
    </scripts>
    <node-interpreter value="project" />
    <envs />
    <method v="2" />
  </configuration>
</component>

================================================
FILE: LICENCE
================================================
Copyright 2002-2020 the original author or authors.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.


================================================
FILE: backend/.editorconfig
================================================
# top-most EditorConfig file
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space

[*.{java,xml}]
indent_size = 4
trim_trailing_whitespace = true


================================================
FILE: backend/.gitignore
================================================
target/

================================================
FILE: backend/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>org.springframework.samples.petclinic-graphql</groupId>
    <artifactId>backend</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>backend</name>
    <description>Backend for Spring Petclinic GraphQL Example</description>
    <properties>
        <java.version>21</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-graphql</artifactId>
        </dependency>
        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-websocket</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-testcontainers</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.testcontainers</groupId>
            <artifactId>postgresql</artifactId>
            <version>1.17.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.projectreactor</groupId>
            <artifactId>reactor-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.graphql</groupId>
            <artifactId>spring-graphql-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-docker-compose</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>



================================================
FILE: backend/sample-queries.graphql
================================================
query {
    owners {
       owners {
           id
       }
    }
}







================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/FakeDataSqlCreator.java
================================================
package org.springframework.samples.petclinic;

import org.springframework.samples.petclinic.model.*;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Imports testdata into the database on application startup
 *
 * @author Nils Hartmann
 */
public class FakeDataSqlCreator {


    private CycleIterator<Integer> vets;
    private CycleIterator<Integer> petTypes;
    private CycleIterator<Integer> owners;
    private CycleIterator<Integer> pets;

    public static void main(String[] args) throws Exception {
        new FakeDataSqlCreator().importAll();
    }

    private void importAll() throws Exception {
        vets = new CycleIterator<Integer>(List.of(7,8,9,10));
        petTypes = new CycleIterator<Integer>(List.of(1,2,3,4,5,6));
        owners = new CycleIterator<Integer>(importOwners());
        pets = new CycleIterator<Integer>(importPets());
        importVisits();
    }

    private List<Integer> importPets() throws Exception {
        return readCsv("pets.csv", (index, parts) -> {
            var id = index + 13;

            var sql = System.out.printf("""
INSERT INTO pets VALUES (%s, '%s', '%s', %s, %s);
                """,
                id, parts[1], asLocalDate(parts[0]), petTypes.next(), owners.next()
                );

            return id;
        });
    }
//
    private void importVisits() throws Exception {
        pets.reset();
        vets.reset();
        AtomicInteger ix = new AtomicInteger();
        readCsv("visits.csv", (index, parts) -> {
            var id = index + 4;
            Visit visit = new Visit();

            System.out.printf("""
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (%s, %s, %s, '%s', '%s');
                """,
                id, pets.next(), vets.next(), asLocalDate(parts[0]), parts[1]
                );
            return visit;
        });
    }

    private List<Integer> importOwners() throws Exception {

        return readCsv("owners.csv", (lineNo, parts) -> {
            var ix = lineNo + 10;

            System.out.printf("""
INSERT INTO owners VALUES (%s, '%s', '%s', '%s', '%s', '%s');
                """, lineNo+10,parts[0], parts[1], parts[2], parts[3], parts[4] );
            return ix;
        });
    }

    private static LocalDate asLocalDate(String date) throws Exception {
        var format = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        return LocalDate.parse(date, format);
    }

    static class CycleIterator<E> {
        private int index = -1;
        private final List<E> elements;

        public CycleIterator(List<E> elements) {
            this.elements = elements;
        }

        void reset() {
            index = -1;
        }

        public E next() {
            index++;
            if (index >= elements.size()) {
                index = 0;
            }
            return elements.get(index);
        }
    }

    private <E> List<E> readCsv(String name, CsvLineConsumer<E> consumer) throws Exception {
        final List<E> result = new LinkedList<>();
        try (BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/testdata/" + name)))) {
            String line = null;
            int index = 0;
            while ((line = br.readLine()) != null) {
                if (index == 0) {
                    // ignore first line (header)
                    index++;
                    continue;
                }
                String[] parts = line.trim().split("\\,");
                E e = consumer.consume(index, parts);
                result.add(e);
                index++;
            }
        }
        return result;
    }

    @FunctionalInterface
    interface CsvLineConsumer<E> {
        E consume(int lineNo, String[] parts) throws Exception;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java
================================================
package org.springframework.samples.petclinic;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter;

@SpringBootApplication
public class PetClinicApplication {

	public static void main(String[] args) {
		SpringApplication.run(PetClinicApplication.class, args);
	}

    /**
     * Keeps the session open until the end of a request. Allows us to use
     * lazy-loading with Hibernate.
     */
    @Bean
    @ConditionalOnProperty(value="petclinic.open-session-in-view", havingValue="true", matchIfMissing = true)
    public OpenEntityManagerInViewFilter openEntityManagerInViewFilter() {
        return new OpenEntityManagerInViewFilter();
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/auth/Role.java
================================================
package org.springframework.samples.petclinic.auth;

import org.springframework.security.core.GrantedAuthority;

import jakarta.persistence.*;

/**
 * Taken from https://github.com/spring-petclinic/spring-petclinic-rest
 */
@Entity
@Table(name = "roles", uniqueConstraints = @UniqueConstraint(columnNames = {"username", "role"}))
public class Role implements GrantedAuthority {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public boolean isNew() {
        return this.id == null;
    }

    @ManyToOne
    @JoinColumn(name = "username")
    private User user;

    @Column(name = "role")
    private String name;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getAuthority() {
        return name;
    }

    public String toString() {
        return "Role, name='" + this.name + "'";
    }

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/auth/User.java
================================================
package org.springframework.samples.petclinic.auth;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import jakarta.persistence.*;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

/**
 * Based on User class from https://github.com/spring-petclinic/spring-petclinic-rest
 */
@Entity
@Table(name = "users")
public class User implements UserDetails {

    private static final Logger log = LoggerFactory.getLogger( User.class );

    @Id
    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @Column(name = "enabled")
    private Boolean enabled;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "user", fetch = FetchType.EAGER)
    private Set<Role> roles;

    @Column(name = "fullname")
    private String fullname;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Boolean getEnabled() {
        return enabled;
    }

    public void setEnabled(Boolean enabled) {
        this.enabled = enabled;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }

    @JsonIgnore
    public void addRole(String roleName) {
        if (this.roles == null) {
            this.roles = new HashSet<>();
        }
        Role role = new Role();
        role.setUser(this);
        role.setName(roleName);
        this.roles.add(role);
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return getRoles();
    }

    @Override
    public boolean isAccountNonExpired() {
        return enabled;
    }

    @Override
    public boolean isAccountNonLocked() {
        return enabled;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return enabled;
    }

    @Override
    public boolean isEnabled() {
        return enabled;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/auth/UserRepository.java
================================================
package org.springframework.samples.petclinic.auth;

import org.springframework.data.repository.Repository;

import java.util.Optional;

public interface UserRepository extends Repository<User, String>  {
    Optional<User> findByUsername(String username);
    void save(User user);
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractOwnerInput.java
================================================
package org.springframework.samples.petclinic.graphql;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class AbstractOwnerInput {
    private String firstName;
    private String lastName;
    private String address;
    private String city;
    private String telephone;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getTelephone() {
        return telephone;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    @Override
    public String toString() {
        return "AbstractOwnerInput{" +
            "firstName='" + firstName + '\'' +
            ", lastName='" + lastName + '\'' +
            ", address='" + address + '\'' +
            ", city='" + city + '\'' +
            ", telephone='" + telephone + '\'' +
            '}';
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractOwnerPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Owner;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class AbstractOwnerPayload {

    private final Owner owner;

    public Owner getOwner() {
        return owner;
    }

    public AbstractOwnerPayload(Owner owner) {
        this.owner = owner;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractPetInput.java
================================================
package org.springframework.samples.petclinic.graphql;

import java.time.LocalDate;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class AbstractPetInput {

    private Integer typeId;
    private String name;
    private LocalDate birthDate;

    public Integer getTypeId() {
        return typeId;
    }

    public void setTypeId(Integer typeId) {
        this.typeId = typeId;
    }

    public LocalDate getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(LocalDate birthDate) {
        this.birthDate = birthDate;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "AbstractPetInput{" +
            "typeId=" + typeId +
            ", name='" + name + '\'' +
            ", birthDate=" + birthDate +
            '}';
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractPetPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Pet;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class AbstractPetPayload {

    private final Pet pet;

    public AbstractPetPayload(Pet pet) {
        this.pet = pet;
    }

    public Pet getPet() {
        return pet;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddOwnerInput.java
================================================
package org.springframework.samples.petclinic.graphql;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class AddOwnerInput extends AbstractOwnerInput {

    @Override
    public String toString() {
        return "AddOwnerInput{} " + super.toString();
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddOwnerPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Owner;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class AddOwnerPayload extends AbstractOwnerPayload {

    public AddOwnerPayload(Owner owner) {
        super(owner);
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddPetInput.java
================================================
package org.springframework.samples.petclinic.graphql;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class AddPetInput extends AbstractPetInput {

    private Integer ownerId;

    public Integer getOwnerId() {
        return ownerId;
    }

    public void setOwnerId(Integer ownerId) {
        this.ownerId = ownerId;
    }

    @Override
    public String toString() {
        return "AddPetInput{" +
            "ownerId=" + ownerId +
            "} " + super.toString();
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddPetPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Pet;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public record AddPetPayload (Pet pet) {}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddSpecialtyPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Specialty;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public record AddSpecialtyPayload(Specialty specialty) {

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetErrorPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

public record AddVetErrorPayload(String error) implements AddVetPayload {
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetInput.java
================================================
package org.springframework.samples.petclinic.graphql;

import java.util.List;
import java.util.Map;

/**
 * @author Nils Hartmann
 */
public class AddVetInput {

    private String firstName;
    private String lastName;
    private List<Integer> specialtyIds;

    public static AddVetInput fromArgument(Map<String, Object> argument) {

        AddVetInput addVetInput = new AddVetInput();
        addVetInput.setFirstName((String) argument.get("firstName"));
        addVetInput.setLastName((String) argument.get("lastName"));
        addVetInput.setSpecialtyIds((List<Integer>) argument.get("specialtyIds"));

        return addVetInput;

    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public List<Integer> getSpecialtyIds() {
        return specialtyIds;
    }

    public void setSpecialtyIds(List<Integer> specialtyIds) {
        this.specialtyIds = specialtyIds;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

/**
 * @author Nils Hartmann
 */
public interface AddVetPayload {


}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetSuccessPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Vet;

/**
 * @author Nils Hartmann
 */
public record AddVetSuccessPayload(Vet vet) implements AddVetPayload {
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVisitInput.java
================================================
package org.springframework.samples.petclinic.graphql;

import java.time.LocalDate;
import java.util.Map;
import java.util.Optional;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class AddVisitInput {
    private int petId;
    private Optional<Integer> vetId = Optional.empty();
    private LocalDate date;
    private String description;

    public int getPetId() {
        return petId;
    }

    public void setPetId(int petId) {
        this.petId = petId;
    }

    public Optional<Integer> getVetId() {
        return vetId;
    }

    public void setVetId(Optional<Integer> vetId) {
        this.vetId = vetId;
    }

    public void setDate(LocalDate date) {
        this.date = date;
    }

    public LocalDate getDate() {
        return date;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVisitPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Visit;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public record AddVisitPayload(Visit visit) {
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AuthController.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.samples.petclinic.auth.User;
import org.springframework.samples.petclinic.auth.UserRepository;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.stereotype.Controller;

import java.security.Principal;

/**
 * EXAMPLE:
 * --------------------------
 *
 * - Access current principal in GraphQL handler functions by using the AuthenticationPrincipal annotation
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@Controller
public class AuthController {
    private static final Logger log = LoggerFactory.getLogger(AuthController.class);

    private final UserRepository userRepository;

    public AuthController(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @QueryMapping
    public User me(@AuthenticationPrincipal(errorOnInvalidType = true) Jwt jwt) {
        String username = jwt.getSubject();
        log.info("JWT subject (username): '{}'", username);
        return userRepository.findByUsername(username).orElseThrow();
    }

    @QueryMapping
    public String ping() { return "pong"; }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/OwnerController.java
================================================
package org.springframework.samples.petclinic.graphql;

import graphql.schema.DataFetchingEnvironment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.*;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.query.ScrollSubrange;
import org.springframework.samples.petclinic.model.Owner;
import org.springframework.samples.petclinic.model.OwnerFilter;
import org.springframework.samples.petclinic.model.OwnerOrder;
import org.springframework.samples.petclinic.model.OwnerService;
import org.springframework.samples.petclinic.repository.OwnerRepository;
import org.springframework.stereotype.Controller;

import java.util.List;
import java.util.Optional;

import static org.springframework.samples.petclinic.model.OwnerFilter.NO_FILTER;

/**
 * GraphQL handler functions for Ower type, Query and Mutation
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@Controller
public class OwnerController {

    private static final Logger log = LoggerFactory.getLogger(OwnerController.class);

    private final OwnerService ownerService;
    private final OwnerRepository ownerRepository;

    public OwnerController(OwnerService ownerService, OwnerRepository ownerRepository) {
        this.ownerService = ownerService;
        this.ownerRepository = ownerRepository;
    }

    @MutationMapping
    public AddOwnerPayload addOwner(@Argument AddOwnerInput input) {
        Owner owner = ownerService.addOwner(
            input.getFirstName(),
            input.getLastName(),
            input.getTelephone(),
            input.getAddress(),
            input.getCity()
        );

        return new AddOwnerPayload(owner);
    }

    @MutationMapping
    public UpdateOwnerPayload updateOwner(@Argument UpdateOwnerInput input) {
        Owner owner = ownerService.updateOwner(
            input.getOwnerId(),
            input.getFirstName(),
            input.getLastName(),
            input.getTelephone(),
            input.getAddress(),
            input.getCity()
        );
        return new UpdateOwnerPayload(owner);
    }

    @QueryMapping
    public Window<Owner> owners(ScrollSubrange subrange,
                                @Argument Optional<OwnerFilter> filter,
                                @Argument Optional<List<OwnerOrder>> order) {
        // Get position represented by this subrange or (if none yet)
        //   create a default Offset-based ScrollPosition
        var position = subrange.position().orElse(ScrollPosition.offset());

        // If user does not specify a count (with first or last), throw Exception
        //  note that it is currently not possible to express a union type-like thing
        //  (first OR last must be present) as input parameters
        var limit = subrange.count().orElseThrow(() -> new IllegalArgumentException("Please specify either 'first' or 'last'"));

        var orders = order.map(l -> l.stream().map(OwnerOrder::toSortOrder).toList()).orElse(List.of());
        var sort = Sort.by(orders.isEmpty() ? OwnerOrder.defaultOrder() : orders);

        // Note that the returned Window is automatically mapped
        //  to the according GraphQL types by Spring for GraphQL
        Window<Owner> owners = this.ownerRepository.findBy(filter.orElse(NO_FILTER), query -> query.
            limit(limit)
            .sortBy(sort)
            .scroll(position)
        );

        return owners;
    }

    @QueryMapping
    public Optional<Owner> owner(DataFetchingEnvironment env) {
        int id = env.getArgument("id");
        return ownerRepository.findById(id);
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/PageInfo.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.data.domain.Page;
import org.springframework.samples.petclinic.model.Owner;

public class PageInfo {
    private final Page<Owner> result;

    public PageInfo(Page<Owner> result) {
        this.result = result;
    }

    public int getPageNumber() {
        return result.getNumber();
    }

    public int getTotalPages() {
        return result.getTotalPages();
    }

    public long getTotalCount() {
        return result.getTotalElements();
    }

    public boolean getHasNext() {
        return result.hasNext();
    }

    public boolean getHasPrev() {
        return result.hasPrevious();
    }

    public Integer getNextPage() {
        if (result.hasNext()) {
            return result.getNumber() + 1;
        }

        return null;
    }

    public Integer getPrevPage() {
        if (result.hasPrevious()) {
            return result.getNumber() - 1;
        }

        return null;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/PetController.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.samples.petclinic.model.Pet;
import org.springframework.samples.petclinic.model.PetService;
import org.springframework.samples.petclinic.repository.PetRepository;
import org.springframework.samples.petclinic.repository.VisitRepository;
import org.springframework.stereotype.Controller;

import java.util.Optional;

/**
 * GraphQL handler functions for Pet GraphQL type, Query and Mutation
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@Controller
public class PetController {

    private final PetService petService;
    private final PetRepository petRepository;
    private final VisitRepository visitRepository;

    public PetController(PetService petService, PetRepository petRepository, VisitRepository visitRepository) {
        this.petService = petService;
        this.petRepository = petRepository;
        this.visitRepository = visitRepository;
    }

    @QueryMapping
    public Iterable<Pet> pets() {
        return petRepository.findAll();
    }

    @QueryMapping
    public Optional<Pet> pet(@Argument Integer id) {
        return petRepository.findById(id);
    }

    @SchemaMapping
    public VisitConnection visits(Pet pet) {
        var visits = visitRepository.findByPetIdOrderById(pet.getId());
        return new VisitConnection(visits);
    }

    @MutationMapping
    public AddPetPayload addPet(@Argument AddPetInput input) {
        Pet pet = petService.addPet(
            input.getOwnerId(),
            input.getTypeId(),
            input.getName(),
            input.getBirthDate()
        );

        return new AddPetPayload(pet);
    }

    @MutationMapping
    public UpdatePetPayload updatePet(@Argument UpdatePetInput input) {
        Pet pet = petService.updatePet(
            input.getPetId(),
            Optional.ofNullable(input.getTypeId()),
            input.getName(),
            input.getBirthDate()
        );

        return new UpdatePetPayload(pet);
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/PetTypeController.java
================================================
package org.springframework.samples.petclinic.graphql;

import graphql.schema.idl.RuntimeWiring;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.execution.RuntimeWiringConfigurer;
import org.springframework.samples.petclinic.model.PetType;
import org.springframework.samples.petclinic.repository.PetTypeRepository;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;

import java.util.List;

/**
 * Resolver for Pet Queries
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@Controller
public class PetTypeController {
    private final PetTypeRepository petTypeRepository;

    public PetTypeController(PetTypeRepository petTypeRepository) {
        this.petTypeRepository = petTypeRepository;
    }

    @QueryMapping
    public Iterable<PetType> pettypes() {
        return petTypeRepository.findAll();
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/RemoveSpecialtyPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Specialty;

import java.util.List;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public record RemoveSpecialtyPayload(List<Specialty> specialties) {

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/SpecialtyController.java
================================================
package org.springframework.samples.petclinic.graphql;

import graphql.schema.DataFetchingEnvironment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.samples.petclinic.model.Specialty;
import org.springframework.samples.petclinic.model.SpecialtyService;
import org.springframework.samples.petclinic.repository.SpecialtyRepository;
import org.springframework.stereotype.Controller;

import java.util.List;
import java.util.Map;

/**
 * GraphQL handler functions for "Specialty" GraphQL type, Query and Mutation
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@Controller
public class SpecialtyController {

    private static final Logger log = LoggerFactory.getLogger(SpecialtyController.class);

    private final SpecialtyService specialtyService;
    private final SpecialtyRepository specialtyRepository;

    public SpecialtyController(SpecialtyService specialtyService, SpecialtyRepository specialtyRepository) {
        this.specialtyService = specialtyService;
        this.specialtyRepository = specialtyRepository;
    }

    @QueryMapping
    public List<Specialty> specialties() {
      return  List.copyOf(specialtyRepository.findAll());
    }

    /**
     * EXAMPLE:
     * --------------------------
     *
     * - Annotated Controllers have access to DataFetchingEnvironment
     *  - Receive arguments using DataFetchingEnvironment
     */
    @MutationMapping
    public AddSpecialtyPayload addSpecialty(DataFetchingEnvironment env) {
        Map<String, String> input = env.getArgument("input");

        Specialty specialty = specialtyService.addSpecialty(input.get("name"));

        return new AddSpecialtyPayload(specialty);
    }

    @MutationMapping
    public UpdateSpecialtyPayload updateSpecialty(@Argument UpdateSpecialtyInput input) {
        Specialty specialty = specialtyService.updateSpecialty(
            input.getSpecialtyId(),
            input.getName()
        );

        return new UpdateSpecialtyPayload(specialty);
    }

    @MutationMapping
    public RemoveSpecialtyPayload removeSpecialty(DataFetchingEnvironment env) {
        Map<String, Integer> input = env.getArgument("input");

        specialtyService.deleteSpecialty(input.get("specialtyId"));

        return new RemoveSpecialtyPayload(List.copyOf(specialtyRepository.findAll()));
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateOwnerInput.java
================================================
package org.springframework.samples.petclinic.graphql;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class UpdateOwnerInput extends AbstractOwnerInput {

    private int ownerId;

    public int getOwnerId() {
        return ownerId;
    }

    public void setOwnerId(int ownerId) {
        this.ownerId = ownerId;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateOwnerPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Owner;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class UpdateOwnerPayload extends AbstractOwnerPayload {
    public UpdateOwnerPayload(Owner owner) {
        super(owner);
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdatePetInput.java
================================================
package org.springframework.samples.petclinic.graphql;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class UpdatePetInput extends AbstractPetInput {

    private int petId;

    public int getPetId() {
        return petId;
    }

    public void setPetId(int petId) {
        this.petId = petId;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdatePetPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Pet;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public record UpdatePetPayload (Pet pet) {}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateSpecialtyInput.java
================================================
package org.springframework.samples.petclinic.graphql;

import jakarta.validation.constraints.NotNull;

public class UpdateSpecialtyInput {
    @NotNull
    private Integer specialtyId;
    @NotNull
    private String name;

    public void setSpecialtyId(Integer specialtyId) {
        this.specialtyId = specialtyId;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getSpecialtyId() {
        return specialtyId;
    }

    public String getName() {
        return name;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateSpecialtyPayload.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Specialty;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public record UpdateSpecialtyPayload(Specialty specialty) {

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/VetController.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Limit;
import org.springframework.data.domain.ScrollPosition;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Window;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.graphql.data.query.ScrollSubrange;
import org.springframework.samples.petclinic.model.*;
import org.springframework.samples.petclinic.repository.VetRepository;
import org.springframework.samples.petclinic.repository.VisitRepository;
import org.springframework.stereotype.Controller;

import java.util.List;
import java.util.Optional;

import static org.springframework.samples.petclinic.model.OwnerFilter.NO_FILTER;

/**
 * GraphQL handler functions for Vet GraphQL type, Query and Mutation
 * <p>
 * Note that the addVet mutation is secured in the domain layer, so that only
 * users with SCOPE_MANAGER are allowed to create new vets
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@Controller
public class VetController {

    private static final Logger log = LoggerFactory.getLogger(VetController.class);

    private final VetService vetService;
    private final VetRepository vetRepository;
    private final VisitRepository visitRepository;

    public VetController(VetService vetService, VetRepository vetRepository, VisitRepository visitRepository) {
        this.vetService = vetService;
        this.vetRepository = vetRepository;
        this.visitRepository = visitRepository;
    }

    @QueryMapping
    public Window<Vet> vets(ScrollSubrange subrange) {
        var position = subrange.position().orElse(ScrollPosition.offset());
        var sort = Sort.by("lastName", "firstName");
        var limit = subrange.count().isPresent() ? Limit.of(subrange.count().getAsInt()) : Limit.unlimited();

        Window<Vet> vets = this.vetRepository.findBy(position, sort, limit);

        return vets;
    }

    @QueryMapping
    public Optional<Vet> vet(@Argument Integer id) {
        return vetRepository.findById(id);
    }

    @SchemaMapping
    public VisitConnection visits(Vet vet) {
        List<Visit> visitList = visitRepository.findByVetId(vet.getId());
        return new VisitConnection(visitList);
    }

    @MutationMapping
    public AddVetPayload addVet(@Argument AddVetInput input) {
        try {
            Vet newVet = vetService.createVet(
                input.getFirstName(),
                input.getLastName(),
                input.getSpecialtyIds());

            return new AddVetSuccessPayload(newVet);
        } catch (InvalidVetDataException ex) {
            return new AddVetErrorPayload(ex.getLocalizedMessage());
        }
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/VisitConnection.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.samples.petclinic.model.Visit;

import java.util.List;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class VisitConnection {

    private final List<Visit> visits;

    public VisitConnection(List<Visit> visits) {
        this.visits = visits;
    }

    public int getTotalCount() {
        return visits.size();
    }

    public List<Visit> getVisits() {
        return visits;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/VisitController.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.graphql.data.method.annotation.SubscriptionMapping;
import org.springframework.samples.petclinic.model.Vet;
import org.springframework.samples.petclinic.model.Visit;
import org.springframework.samples.petclinic.model.VisitService;
import org.springframework.samples.petclinic.repository.VetRepository;
import org.springframework.stereotype.Controller;
import reactor.core.publisher.Flux;

/**
 * GraphQL handler functions for "Vitis" GraphQL type, Query, Mutation and Subscription
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */

@Controller
public class VisitController {

    private final VisitService visitService;
    private final VisitPublisher visitPublisher;
    private final VetRepository vetRepository;


    public VisitController(VisitService visitService, VisitPublisher visitPublisher, VetRepository vetRepository) {
        this.visitService = visitService;
        this.visitPublisher = visitPublisher;
        this.vetRepository = vetRepository;
    }

    @SchemaMapping
    public Vet treatingVet(Visit visit) {
        if (!visit.hasVetId()) {
            return null;
        }
        return vetRepository.findById(visit.getVetId()).orElseThrow();
    }

    @MutationMapping
    public AddVisitPayload addVisit(@Argument AddVisitInput input) {
        Visit visit = visitService.addVisit(
            input.getPetId(),
            input.getDescription(),
            input.getDate(),
            input.getVetId()
        );

        return new AddVisitPayload(visit);
    }

    @SubscriptionMapping
    public Flux<Visit> onNewVisit() {
        return visitPublisher.getPublisher();
    }

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/VisitPublisher.java
================================================
package org.springframework.samples.petclinic.graphql;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.samples.petclinic.model.Visit;
import org.springframework.samples.petclinic.model.VisitCreatedEvent;
import org.springframework.samples.petclinic.repository.VisitRepository;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionalEventListener;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Sinks;
import reactor.util.concurrent.Queues;

/**
 * "Forwards" VisitCreatedEvents that are fired by Spring Boot in our domain layer
 * to a reactive publisher that is used by the GraphQL layer to publish events
 * for our GraphQL Subscriptions
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */

@Component
public class VisitPublisher {

    private static final Logger logger = LoggerFactory.getLogger(VisitPublisher.class);

    private final VisitRepository visitRepository;
    private final Sinks.Many<Visit> sink;

    public VisitPublisher(VisitRepository visitRepository) {
        this.visitRepository = visitRepository;
        this.sink = Sinks.many()
            .multicast()
            .onBackpressureBuffer(Queues.SMALL_BUFFER_SIZE, false);
    }

    @TransactionalEventListener
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void onNewVisit(VisitCreatedEvent event) {

        visitRepository.findById(event.getVisitId())
            .ifPresent(visit -> {
                this.sink.emitNext(visit, Sinks.EmitFailureHandler.FAIL_FAST);
            });
    }

    public Flux<Visit> getPublisher() {
        return this.sink.asFlux();
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/runtime/DateCoercing.java
================================================
package org.springframework.samples.petclinic.graphql.runtime;

import graphql.language.StringValue;
import graphql.schema.Coercing;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

import static java.lang.String.format;

/**
 * Implements own date format (yyyy/MM/dd) for our own "Date" scalar type
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
public class DateCoercing implements Coercing<LocalDate, String> {
    private static DateTimeFormatter createIsoDateFormat() {
        return DateTimeFormatter.ofPattern("yyyy/MM/dd");
    }

    @Override
    public String serialize(Object input) {
        if (input instanceof LocalDate) {
            return createIsoDateFormat().format((LocalDate) input);
        }
        return null;
    }

    @Override
    public LocalDate parseValue(Object input) {
        if (input instanceof LocalDate) {
            return (LocalDate) input;
        } else if (input instanceof String) {
            return fromString((String) input);
        }
        return null;
    }

    @Override
    public LocalDate parseLiteral(Object input) {
        if (input instanceof StringValue) {
            String value = ((StringValue) input).getValue();
            return fromString(value);
        }
        throw new UnsupportedOperationException("Unsupported input in DateScalarType: " + input);
    }

    private static LocalDate fromString(String input) {
        try {
            LocalDate date = LocalDate.parse(input, createIsoDateFormat());
            return date;
        } catch (Exception e) {
            throw new IllegalArgumentException(format("Could not parse date from String '%s': %s", input, e.getLocalizedMessage()), e);
        }
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/runtime/GraphiQlConfiguration.java
================================================
package org.springframework.samples.petclinic.graphql.runtime;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.graphql.GraphQlProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.core.io.ClassPathResource;
import org.springframework.graphql.server.webmvc.GraphiQlHandler;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.RouterFunctions;
import org.springframework.web.servlet.function.ServerResponse;

@Configuration
public class GraphiQlConfiguration implements WebMvcConfigurer {

    @Bean
    @Order(0)
    public RouterFunction<ServerResponse> graphiQlRouterFunction(@Autowired GraphQlProperties graphQlProperties) {
        RouterFunctions.Builder builder = RouterFunctions.route();
        ClassPathResource graphiQlPage = new ClassPathResource("/ui/graphiql/index.html");
        GraphiQlHandler graphiQLHandler = new GraphiQlHandler(
            graphQlProperties.getPath(),
            graphQlProperties.getWebsocket().getPath(),
            graphiQlPage
        );
        builder = builder.GET("/", graphiQLHandler::handleRequest);
        return builder.build();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/graphiql/**")
            .addResourceLocations("classpath:/ui/graphiql/");
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/runtime/PetClinicRuntimeWiringConfiguration.java
================================================
package org.springframework.samples.petclinic.graphql.runtime;

import graphql.schema.GraphQLScalarType;
import graphql.schema.idl.RuntimeWiring;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.execution.RuntimeWiringConfigurer;
import org.springframework.samples.petclinic.model.Vet;

/**
 * GraphQL Runtime Wiring Configuration
 *
 * RunimeWiring connects the schema with behviour. Most of it is done
 * aumatically by graphql-java, spring-graphql and Spring Boot starter for spring-graphql
 * but here we do our own customizations
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@Configuration
public class PetClinicRuntimeWiringConfiguration {

    @Bean
    RuntimeWiringConfigurer petclinicWiringConfigurer() {
        return builder -> {
            addDateCoercing(builder);
            addPersonTypeResolver(builder);
        };
    }

    private void addPersonTypeResolver(RuntimeWiring.Builder builder) {
        builder.type("Person", typeBuilder -> typeBuilder.typeResolver(env -> {
            Object javaObject = env.getObject();
            if (javaObject instanceof Vet) {
                return env.getSchema().getObjectType("Vet");
            }
            return env.getSchema().getObjectType("Owner");
        }));
    }

    private void addDateCoercing(RuntimeWiring.Builder builder) {
        builder.scalar(GraphQLScalarType.newScalar()
            .name("Date")
            .description("A Type representing a date (without time, only a day)")
            .coercing(new DateCoercing())
            .build());
    }


}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.MappedSuperclass;

import java.io.Serializable;

/**
 * Simple JavaBean domain object with an id property. Used as a base class for objects
 * needing this property.
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 */
@MappedSuperclass
public class BaseEntity implements Serializable {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Integer id;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public boolean isNew() {
		return this.id == null;
	}

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/InvalidVetDataException.java
================================================
package org.springframework.samples.petclinic.model;

public class InvalidVetDataException extends Exception {
    public InvalidVetDataException(String msg, Object... args) {
        super(String.format(msg, args));
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import jakarta.persistence.Column;
import jakarta.persistence.MappedSuperclass;

/**
 * Simple JavaBean domain object adds a name property to <code>BaseEntity</code>. Used as
 * a base class for objects needing these properties.
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 */
@MappedSuperclass
public class NamedEntity extends BaseEntity {

	@Column(name = "name")
	private String name;

	public String getName() {
		return this.name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return this.getName();
	}

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/OrderField.java
================================================
package org.springframework.samples.petclinic.model;


/**
 * @author Xiangbin HAN (hanxb2001@163.com)
 *
 */
public enum OrderField {
    id,
    firstName,
    lastName,
    address,
    city,
    telephone
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Owner.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import org.springframework.beans.support.MutableSortDefinition;
import org.springframework.beans.support.PropertyComparator;
import org.springframework.core.style.ToStringCreator;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import java.util.*;

/**
 * Simple JavaBean domain object representing an owner.
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @author Michael Isvy
 */
@Entity
@Table(name = "owners")
public class Owner extends Person {

	@Column(name = "address")
	@NotEmpty
	private String address;

	@Column(name = "city")
	@NotEmpty
	private String city;

	@Column(name = "telephone")
	@NotEmpty
	private String telephone;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch = FetchType.EAGER)
	private Set<Pet> pets;

	public String getAddress() {
		return this.address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getCity() {
		return this.city;
	}

	public void setCity(String city) {
		this.city = city;
	}

	public String getTelephone() {
		return this.telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	protected Set<Pet> getPetsInternal() {
		if (this.pets == null) {
			this.pets = new HashSet<>();
		}
		return this.pets;
	}

	protected void setPetsInternal(Set<Pet> pets) {
		this.pets = pets;
	}

	public List<Pet> getPets() {
		List<Pet> sortedPets = new ArrayList<>(getPetsInternal());
		PropertyComparator.sort(sortedPets, new MutableSortDefinition("name", true, true));
		return Collections.unmodifiableList(sortedPets);
	}

	public void addPet(Pet pet) {
		getPetsInternal().add(pet);
		pet.setOwner(this);
	}

	/**
	 * Return the Pet with the given name, or null if none found for this Owner.
	 * @param name to test
	 * @return true if pet name is already in use
	 */
	public Pet getPet(String name) {
		return getPet(name, false);
	}

	/**
	 * Return the Pet with the given name, or null if none found for this Owner.
	 * @param name to test
	 * @return true if pet name is already in use
	 */
	public Pet getPet(String name, boolean ignoreNew) {
		name = name.toLowerCase();
		for (Pet pet : getPetsInternal()) {
			if (!ignoreNew || !pet.isNew()) {
				String compName = pet.getName();
				compName = compName.toLowerCase();
				if (compName.equals(name)) {
					return pet;
				}
			}
		}
		return null;
	}

	@Override
	public String toString() {
		return new ToStringCreator(this)

				.append("id", this.getId()).append("new", this.isNew()).append("lastName", this.getLastName())
				.append("firstName", this.getFirstName()).append("address", this.address).append("city", this.city)
				.append("telephone", this.telephone).toString();
	}

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/OwnerFilter.java
================================================
package org.springframework.samples.petclinic.model;

import org.springframework.data.jpa.domain.Specification;

import jakarta.persistence.Query;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.CriteriaQuery;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;

import java.util.LinkedList;
import java.util.Map;
import java.util.Optional;

/**
 * @author Xiangbin HAN (hanxb2001@163.com)
 * @author Nils Hartmann
 */
public class OwnerFilter implements Specification<Owner> {

    public static OwnerFilter NO_FILTER = new OwnerFilter() {
        public Predicate toPredicate(Root<Owner> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
            return null;
        }
    };

    private String firstName;
    private String lastName;
    private String address;
    private String city;
    private String telephone;

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public void setTelephone(String telephone) {
        this.telephone = telephone;
    }

    @Override
    public Predicate toPredicate(Root<Owner> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
        var predicates = new LinkedList<Predicate>();

        if (isSet(firstName)) {
            predicates.add(criteriaBuilder.like(
                criteriaBuilder.lower(
                    root.get("firstName")), firstName.toLowerCase() + "%"));
        }

        if (isSet(lastName)) {
            predicates.add(criteriaBuilder.like(
                criteriaBuilder.lower(
                    root.get("lastName")), lastName.toLowerCase() + "%"));
        }

        if (isSet(address)) {
            predicates.add(criteriaBuilder.like(
                criteriaBuilder.lower(
                    root.get("address")), address.toLowerCase() + "%"));
        }

        if (isSet(city)) {
            predicates.add(criteriaBuilder.equal(root.get("city"), city));
        }

        if (isSet(telephone)) {
            predicates.add(criteriaBuilder.equal(root.get("telephone"), telephone));
        }

        if (predicates.isEmpty()) {
            return null;
        }
        return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
    }

    private boolean isSet(String s) {
        return s != null && !s.isBlank();
    }

    @Override
    public String toString() {
        return "OwnerFilter{" +
               "firstName='" + firstName + '\'' +
               ", lastName='" + lastName + '\'' +
               ", address='" + address + '\'' +
               ", city='" + city + '\'' +
               ", telephone='" + telephone + '\'' +
               '}';
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/OwnerOrder.java
================================================
package org.springframework.samples.petclinic.model;

import org.springframework.data.domain.Sort;

import java.util.List;

/**
 * @author Xiangbin HAN (hanxb2001@163.com)
 * @author Nils Hartmann
 */
public record OwnerOrder(OrderField field, Sort.Direction direction) {

    public static List<Sort.Order> defaultOrder() {
        return List.of(Sort.Order.asc("id"));
    }

    public Sort.Order toSortOrder() {
//        Sort.Direction direction = order == null ? Sort.DEFAULT_DIRECTION : order == OrderDirection.ASC ? Sort.Direction.ASC : Sort.Direction.DESC;
        return new Sort.Order(direction, field.name());
    }

    public Sort toSort() {
        return Sort.by(direction, field.name());
    }

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/OwnerService.java
================================================
package org.springframework.samples.petclinic.model;

import org.springframework.samples.petclinic.repository.OwnerRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import jakarta.validation.constraints.NotEmpty;
import java.util.function.Consumer;

@Service
@Validated
public class OwnerService {

    private final OwnerRepository ownerRepository;

    public OwnerService(OwnerRepository ownerRepository) {
        this.ownerRepository = ownerRepository;
    }

    @Transactional
    public Owner addOwner(@NotEmpty String firstName, @NotEmpty String lastName, @NotEmpty String telephone, @NotEmpty String address, @NotEmpty String city) {
        final Owner owner = new Owner();
        owner.setAddress(address);
        owner.setCity(city);
        owner.setTelephone(telephone);
        owner.setFirstName(firstName);
        owner.setLastName(lastName);

        ownerRepository.save(owner);

        return owner;
    }



    @Transactional
    public Owner updateOwner(@NotEmpty int ownerId, String firstName, String lastName, String telephone, String address, String city) {
        Owner owner = ownerRepository.findById(ownerId).orElseThrow();

        setIfGiven(address, owner::setAddress);
        setIfGiven(firstName, owner::setFirstName);
        setIfGiven(lastName, owner::setLastName);
        setIfGiven(telephone, owner::setTelephone);
        setIfGiven(address, owner::setAddress);
        setIfGiven(city, owner::setCity);

        ownerRepository.save(owner);

        return owner;
    }

    private void setIfGiven(String value, Consumer<String> s) {
        if (value != null) {
            s.accept(value);
        }
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Person.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import jakarta.persistence.Column;
import jakarta.persistence.MappedSuperclass;
import jakarta.validation.constraints.NotEmpty;

/**
 * Simple JavaBean domain object representing an person.
 *
 * @author Ken Krebs
 */
@MappedSuperclass
public class Person extends BaseEntity {

	@Column(name = "first_name")
	@NotEmpty
	private String firstName;

	@Column(name = "last_name")
	@NotEmpty
	private String lastName;

	public String getFirstName() {
		return this.firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return this.lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Pet.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import org.springframework.beans.support.MutableSortDefinition;
import org.springframework.beans.support.PropertyComparator;
import org.springframework.format.annotation.DateTimeFormat;

import jakarta.persistence.*;
import java.time.LocalDate;
import java.util.*;

/**
 * Simple business object representing a pet.
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 * @author Sam Brannen
 */
@Entity
@Table(name = "pets")
public class Pet extends NamedEntity {

	@Column(name = "birth_date")
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private LocalDate birthDate;

	@ManyToOne
	@JoinColumn(name = "type_id")
	private PetType type;

	@ManyToOne
	@JoinColumn(name = "owner_id")
	private Owner owner;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pet", fetch = FetchType.EAGER)
    private Set<Visit> visits;

	public void setBirthDate(LocalDate birthDate) {
		this.birthDate = birthDate;
	}

	public LocalDate getBirthDate() {
		return this.birthDate;
	}

	public PetType getType() {
		return this.type;
	}

	public void setType(PetType type) {
		this.type = type;
	}

	public Owner getOwner() {
		return this.owner;
	}

	public void setOwner(Owner owner) {
		this.owner = owner;
	}
    @JsonIgnore
	protected Set<Visit> getVisitsInternal() {
		if (this.visits == null) {
			this.visits = new HashSet<>();
		}
		return this.visits;
	}

    protected void setVisitsInternal(Set<Visit> visits) {
        this.visits = visits;
	}

	public List<Visit> getVisits() {
		List<Visit> sortedVisits = new ArrayList<>(getVisitsInternal());
		PropertyComparator.sort(sortedVisits, new MutableSortDefinition("date", false, false));
		return Collections.unmodifiableList(sortedVisits);
	}

	public void addVisit(Visit visit) {
		getVisitsInternal().add(visit);
		visit.setPet(this);
	}

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/PetService.java
================================================
package org.springframework.samples.petclinic.model;

import org.springframework.samples.petclinic.repository.OwnerRepository;
import org.springframework.samples.petclinic.repository.PetRepository;
import org.springframework.samples.petclinic.repository.PetTypeRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.Optional;
import java.util.function.Consumer;

@Service
@Validated
public class PetService {
    private final OwnerRepository ownerRepository;
    private final PetRepository petRepository;
    private final PetTypeRepository petTypeRepository;

    public PetService(OwnerRepository ownerRepository, PetRepository petRepository, PetTypeRepository petTypeRepository) {
        this.ownerRepository = ownerRepository;
        this.petRepository = petRepository;
        this.petTypeRepository = petTypeRepository;
    }

    @Transactional
    public Pet addPet(int ownerId, int petTypeId, @NotEmpty String petName, @NotNull LocalDate petBirthData) {
        final Owner owner = ownerRepository.findById(ownerId).orElseThrow();
        final PetType type = petTypeRepository.findById(petTypeId).orElseThrow();

        Pet pet = new Pet();
        pet.setName(petName);
        pet.setType(type);
        pet.setBirthDate(petBirthData);
        pet.setOwner(owner);

        petRepository.save(pet);

        return pet;
    }

    @Transactional
    public Pet updatePet(int petId, Optional<Integer> petTypeId, String petName, LocalDate petBirthData) {
        final Pet pet = petRepository.findById(petId).orElseThrow();

        setIfGiven(petBirthData, pet::setBirthDate);
        setIfGiven(petName, pet::setName);
        setIfGiven(petTypeId.flatMap(petTypeRepository::findById).orElse(null), pet::setType);

        petRepository.save(pet);

        return pet;
    }


    private <T> void setIfGiven(T value, Consumer<T> s) {
        if (value != null) {
            s.accept(value);
        }
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/PetType.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import jakarta.persistence.Entity;
import jakarta.persistence.Table;

/**
 * @author Juergen Hoeller Can be Cat, Dog, Hamster...
 */
@Entity
@Table(name = "types")
public class PetType extends NamedEntity {

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/PetValidator.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

/**
 * <code>Validator</code> for <code>Pet</code> forms.
 * <p>
 * We're not using Bean Validation annotations here because it is easier to define such
 * validation rule in Java.
 * </p>
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 */
public class PetValidator implements Validator {

	private static final String REQUIRED = "required";

	@Override
	public void validate(Object obj, Errors errors) {
		Pet pet = (Pet) obj;
		String name = pet.getName();
		// name validation
		if (!StringUtils.hasLength(name)) {
			errors.rejectValue("name", REQUIRED, REQUIRED);
		}

		// type validation
		if (pet.isNew() && pet.getType() == null) {
			errors.rejectValue("type", REQUIRED, REQUIRED);
		}

		// birth date validation
		if (pet.getBirthDate() == null) {
			errors.rejectValue("birthDate", REQUIRED, REQUIRED);
		}
	}

	/**
	 * This Validator validates *just* Pet instances
	 */
	@Override
	public boolean supports(Class<?> clazz) {
		return Pet.class.isAssignableFrom(clazz);
	}

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Specialty.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import java.io.Serializable;

/**
 * Models a {@link Vet Vet's} specialty (for example, dentistry).
 *
 * @author Juergen Hoeller
 */
@Entity
@Table(name = "specialties")
public class Specialty extends NamedEntity implements Serializable {

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/SpecialtyService.java
================================================
package org.springframework.samples.petclinic.model;

import org.springframework.samples.petclinic.repository.SpecialtyRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import jakarta.validation.constraints.NotEmpty;

@Service
@Validated
public class SpecialtyService {

    private final SpecialtyRepository specialtyRepository;


    public SpecialtyService(SpecialtyRepository specialtyRepository) {
        this.specialtyRepository = specialtyRepository;
    }

    @Transactional
    public Specialty addSpecialty(@NotEmpty  String name) {
        Specialty specialty = new Specialty();
        specialty.setName(name);
        specialtyRepository.save(specialty);
        return specialty;
    }

    @Transactional
    public Specialty updateSpecialty(int specialtyId, @NotEmpty String newName) {
        Specialty specialty = specialtyRepository.findById(specialtyId).orElseThrow();
        specialty.setName(newName);
        specialtyRepository.save(specialty);
        return specialty;
    }

    @Transactional
    public void deleteSpecialty(int specialtyId) {
        Specialty specialty = specialtyRepository.findById(specialtyId).orElseThrow();
        specialtyRepository.delete(specialty);
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Vet.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import org.springframework.beans.support.MutableSortDefinition;
import org.springframework.beans.support.PropertyComparator;

import jakarta.persistence.*;
import java.util.*;

/**
 * Simple JavaBean domain object representing a veterinarian.
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @author Arjen Poutsma
 */
@Entity
@Table(name = "vets")
public class Vet extends Person {

	@ManyToMany(fetch = FetchType.EAGER)
	@JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"),
			inverseJoinColumns = @JoinColumn(name = "specialty_id"))
	private Set<Specialty> specialties;

	protected Set<Specialty> getSpecialtiesInternal() {
		if (this.specialties == null) {
			this.specialties = new HashSet<>();
		}
		return this.specialties;
	}

	protected void setSpecialtiesInternal(Set<Specialty> specialties) {
		this.specialties = specialties;
	}

	public List<Specialty> getSpecialties() {
		List<Specialty> sortedSpecs = new ArrayList<>(getSpecialtiesInternal());
		PropertyComparator.sort(sortedSpecs, new MutableSortDefinition("name", true, true));
		return Collections.unmodifiableList(sortedSpecs);
	}

	public int getNrOfSpecialties() {
		return getSpecialtiesInternal().size();
	}

	public void addSpecialty(Specialty specialty) {
		getSpecialtiesInternal().add(specialty);
	}

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/VetService.java
================================================
package org.springframework.samples.petclinic.model;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.samples.petclinic.repository.SpecialtyRepository;
import org.springframework.samples.petclinic.repository.VetRepository;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class VetService {
    private static final Logger log = LoggerFactory.getLogger(VetService.class);

    private final VetRepository vetRepository;
    private final SpecialtyRepository specialtyRepository;

    public VetService(VetRepository vetRepository, SpecialtyRepository specialtyRepository) {
        this.vetRepository = vetRepository;
        this.specialtyRepository = specialtyRepository;
    }

    @Transactional
    @PreAuthorize("hasAuthority('SCOPE_MANAGER')")
    public Vet createVet(String firstName, String lastName, List<Integer> specialtyIds) throws InvalidVetDataException {
        Vet vet = new Vet();
        vet.setFirstName(firstName);
        vet.setLastName(lastName);
        for (Integer specialtyId : specialtyIds) {
            log.info("Specialty Id '{}'", specialtyId);
            Specialty specialty = specialtyRepository.findById(specialtyId)
                    .orElseThrow( () -> new InvalidVetDataException("Specialty with Id '%s' not found", specialtyId));
            log.info("Specialty '{}'", specialty);
            vet.addSpecialty(specialty);
        }

        vetRepository.save(vet);

        log.info("VET {}", vet);

        return vet;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Vets.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import java.util.ArrayList;
import java.util.List;

/**
 * Simple domain object representing a list of veterinarians. Mostly here to be used for
 * the 'vets' {@link org.springframework.web.servlet.view.xml.MarshallingView}.
 *
 * @author Arjen Poutsma
 */
public class Vets {

	private List<Vet> vets;

	public List<Vet> getVetList() {
		if (vets == null) {
			vets = new ArrayList<>();
		}
		return vets;
	}

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Visit.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.model;

import jakarta.persistence.*;
import jakarta.validation.constraints.NotEmpty;
import org.springframework.format.annotation.DateTimeFormat;

import java.time.LocalDate;

/**
 * Simple JavaBean domain object representing a visit.
 *
 * @author Ken Krebs
 * @author Dave Syer
 */
@Entity
@Table(name = "visits")
public class Visit extends BaseEntity {

	@Column(name = "visit_date")
	@DateTimeFormat(pattern = "yyyy-MM-dd")
	private LocalDate date;

	@NotEmpty
	@Column(name = "description")
	private String description;

    /**
     * Holds value of property pet.
     */
    @ManyToOne
    @JoinColumn(name = "pet_id")
    private Pet pet;

    @Column(name = "vet_id")
    private Integer vetId;

	/**
	 * Creates a new instance of Visit for the current date
	 */
	public Visit() {
		this.date = LocalDate.now();
	}

	public LocalDate getDate() {
		return this.date;
	}

	public void setDate(LocalDate date) {
		this.date = date;
	}

	public String getDescription() {
		return this.description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

    public Pet getPet() {
        return pet;
    }

    public void setPet(Pet pet) {
        this.pet = pet;
    }

    public Integer getVetId() {
        return vetId;
    }


    public void setVetId(Integer vetId) {
        this.vetId = vetId;
    }

    public boolean hasVetId() {
	    return this.vetId != null;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/VisitCreatedEvent.java
================================================
package org.springframework.samples.petclinic.model;

public class VisitCreatedEvent {

    private final Integer visitId;

    public VisitCreatedEvent(Integer visitId) {
        this.visitId = visitId;
    }

    public Integer getVisitId() {
        return visitId;
    }

    @Override
    public String toString() {
        return "VisitCreatedEvent{" +
            "visitId=" + visitId +
            '}';
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/VisitService.java
================================================
package org.springframework.samples.petclinic.model;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.samples.petclinic.repository.PetRepository;
import org.springframework.samples.petclinic.repository.VisitRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.Optional;

@Service
@Validated
public class VisitService {
    private final ApplicationEventPublisher applicationEventPublisher;
    private final PetRepository petRepository;
    private final VisitRepository visitRepository;

    public VisitService(ApplicationEventPublisher applicationEventPublisher, PetRepository petRepository, VisitRepository visitRepository) {
        this.applicationEventPublisher = applicationEventPublisher;
        this.petRepository = petRepository;
        this.visitRepository = visitRepository;
    }

    @Transactional
    public Visit addVisit(int petId, @NotEmpty String description, @NotNull LocalDate date, Optional<Integer> vetId) {
        Pet pet = petRepository.findById(petId).orElseThrow();

        Visit visit = new Visit();
        visit.setDescription(description);
        visit.setPet(pet);
        visit.setDate(date);
        vetId.ifPresent(visit::setVetId);

        visitRepository.save(visit);
        applicationEventPublisher.publishEvent(new VisitCreatedEvent(visit.getId()));

        return visit;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/model/package-info.java
================================================
/*
 * Copyright 2012-2019 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/**
 * The classes in this package represent utilities used by the domain.
 */
package org.springframework.samples.petclinic.model;


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java
================================================
/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.repository;

import java.util.Collection;
import java.util.Optional;

import org.springframework.data.domain.*;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.Repository;
import org.springframework.lang.Nullable;
import org.springframework.samples.petclinic.model.BaseEntity;
import org.springframework.samples.petclinic.model.Owner;

/**
 * Repository class for <code>Owner</code> domain objects
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @author Michael Isvy
 * @author Vitaliy Fedoriv
 * @author Nils Hartmann
 */
public interface OwnerRepository extends Repository<Owner, Integer>, JpaSpecificationExecutor<Owner> {

    /**
     * Retrieve an <code>Owner</code> from the data store by id.
     *
     * @param id the id to search for
     * @return the <code>Owner</code> if found
     */
    Optional<Owner> findById(Integer id);


    /**
     * Save an <code>Owner</code> to the data store, either inserting or updating it.
     *
     * @param owner the <code>Owner</code> to save
     * @see BaseEntity#isNew
     */
    void save(Owner owner);

    /**
     * Retrieve <code>Owner</code>s from the data store, returning all owners
     *
     * @return a <code>Collection</code> of <code>Owner</code>s (or an empty <code>Collection</code> if none
     * found)
     */
	Collection<Owner> findAll();

    /**
     * Delete an <code>Owner</code> to the data store by <code>Owner</code>.
     *
     * @param owner the <code>Owner</code> to delete
     *
     */
	void delete(Owner owner);

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java
================================================
/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.repository;

import java.util.Collection;
import java.util.List;
import java.util.Optional;

import org.springframework.dao.DataAccessException;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.samples.petclinic.model.BaseEntity;
import org.springframework.samples.petclinic.model.Pet;
import org.springframework.samples.petclinic.model.PetType;

/**
 * Repository class for <code>Pet</code> domain objects
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @author Michael Isvy
 * @author Vitaliy Fedoriv
 * @author Nils Hartmann
 */
public interface PetRepository extends Repository<Pet, Integer> {

    /**
     * Retrieve all <code>PetType</code>s from the data store.
     *
     * @return a <code>Collection</code> of <code>PetType</code>s
     */
    @Query("SELECT ptype FROM PetType ptype ORDER BY ptype.name")
    List<PetType> findPetTypes();

    /**
     * Retrieve a <code>Pet</code> from the data store by id.
     *
     * @param id the id to search for
     * @return the <code>Pet</code> if found
     * @throws org.springframework.dao.DataRetrievalFailureException if not found
     */
    Optional<Pet> findById(Integer id);

    /**
     * Save a <code>Pet</code> to the data store, either inserting or updating it.
     *
     * @param pet the <code>Pet</code> to save
     * @see BaseEntity#isNew
     */
    void save(Pet pet);

    /**
     * Retrieve <code>Pet</code>s from the data store, returning all owners
     *
     * @return a <code>Collection</code> of <code>Pet</code>s (or an empty <code>Collection</code> if none
     * found)
     */
	Collection<Pet> findAll();

    /**
     * Delete an <code>Pet</code> to the data store by <code>Pet</code>.
     *
     * @param pet the <code>Pet</code> to delete
     *
     */
	void delete(Pet pet);

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/PetTypeRepository.java
================================================
/*
 * Copyright 2016-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.samples.petclinic.repository;

import java.util.Collection;
import java.util.Optional;

import org.springframework.dao.DataAccessException;
import org.springframework.data.repository.Repository;
import org.springframework.samples.petclinic.model.PetType;

/**
 * @author Vitaliy Fedoriv
 * @author Nils Hartmann
 *
 */

public interface PetTypeRepository extends Repository<PetType, Integer> {

	Optional<PetType> findById(Integer id) ;

	Collection<PetType> findAll();

	void save(PetType petType);
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/SpecialtyRepository.java
================================================
/*
 * Copyright 2016-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.samples.petclinic.repository;

import java.util.Collection;
import java.util.Optional;

import org.springframework.dao.DataAccessException;
import org.springframework.data.repository.Repository;
import org.springframework.samples.petclinic.model.Specialty;

/**
 * @author Vitaliy Fedoriv
 * @author Nils Hartmann
 *
 */

public interface SpecialtyRepository extends Repository<Specialty, Integer> {

	Optional<Specialty> findById(Integer id);

	Collection<Specialty> findAll();

	void save(Specialty specialty);

	void delete(Specialty specialty);

}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/VetRepository.java
================================================
/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.repository;

import java.util.Collection;
import java.util.Optional;

import org.springframework.dao.DataAccessException;
import org.springframework.data.domain.Limit;
import org.springframework.data.domain.ScrollPosition;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Window;
import org.springframework.data.repository.Repository;
import org.springframework.samples.petclinic.model.Vet;

/**
 * Repository class for <code>Vet</code> domain objects
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @author Michael Isvy
 * @author Vitaliy Fedoriv
 * @author Nils Hartmann
 */
public interface VetRepository extends Repository<Vet, Integer> {

	Optional<Vet> findById(Integer id);

	Vet save(Vet vet);

	void delete(Vet vet);

    Window<Vet> findBy(ScrollPosition position, Sort sort, Limit limit);


}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/VisitRepository.java
================================================
/*
 * Copyright 2002-2017 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.springframework.samples.petclinic.repository;

import java.util.Collection;
import java.util.List;
import java.util.Optional;

import org.springframework.dao.DataAccessException;
import org.springframework.data.repository.Repository;
import org.springframework.samples.petclinic.model.BaseEntity;
import org.springframework.samples.petclinic.model.Visit;

/**
 * Repository class for <code>Visit</code> domain objects
 *
 * @author Ken Krebs
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @author Michael Isvy
 * @author Vitaliy Fedoriv
 * @author Nils Hartmann
 */
public interface VisitRepository extends Repository<Visit, Integer> {

    /**
     * Save a <code>Visit</code> to the data store, either inserting or updating it.
     *
     * @param visit the <code>Visit</code> to save
     * @see BaseEntity#isNew
     */
    void save(Visit visit);

    List<Visit> findByPetIdOrderById(Integer petId);

	Optional<Visit> findById(Integer id);

	Collection<Visit> findAll();

	void delete(Visit visit);

    List<Visit> findByVetId(Integer id);
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/security/JwtTokenService.java
================================================
package org.springframework.samples.petclinic.security;

import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.oauth2.jwt.JwtClaimsSet;
import org.springframework.security.oauth2.jwt.JwtEncoder;
import org.springframework.security.oauth2.jwt.JwtEncoderParameters;
import org.springframework.stereotype.Service;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Collection;
import java.util.stream.Collectors;

/**
 * Based con code taken from Dan Vega https://github.com/danvega/jwt-username-password/blob/master/src/main/java/dev/danvega/jwt/service/TokenService.java
 */
@Service
public class JwtTokenService {

    private final JwtEncoder encoder;

    public JwtTokenService(JwtEncoder encoder) {
        this.encoder = encoder;
    }

    public String generateToken(Authentication authentication) {
        return generateToken(authentication.getName(),
            authentication.getAuthorities(),
            Instant.now().plus(1, ChronoUnit.HOURS)
        );
    }

    public String generateToken(String name, Collection<? extends GrantedAuthority> authorities, Instant expiresAt) {
        String scope = authorities.stream()
            .map(GrantedAuthority::getAuthority)
            .collect(Collectors.joining(" "));

        JwtClaimsSet claims = JwtClaimsSet.builder()
            .issuer("self")
            .issuedAt(Instant.now())
            .expiresAt(expiresAt)
            .subject(name)
            .claim("scope", scope)
            .build();

        return this.encoder.encode(JwtEncoderParameters.from(claims)).getTokenValue();
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/security/LoginController.java
================================================
package org.springframework.samples.petclinic.security;

import jakarta.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * Login via Username/Password via HTTP POST endpoint.
 * <p>
 * - The /graphql endpoints requires a valid token. This token can be requests by invoking
 * HTTP "POST /api/login with" sending username and password.
 * <p>
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@RestController
public class LoginController {

    private static final Logger log = LoggerFactory.getLogger(LoginController.class);

    private final JwtTokenService tokenService;
    private final AuthenticationManager authenticationManager;

    public LoginController(JwtTokenService tokenService, AuthenticationManager authenticationManager) {
        this.tokenService = tokenService;
        this.authenticationManager = authenticationManager;
    }

    @PostMapping("/api/login")
    public ResponseEntity<LoginResponse> login(@RequestBody @Valid LoginRequest request) {
        log.info("Authorizing '{}'", request.getUsername());
        try {
            Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())
            );

            String token = tokenService.generateToken(authentication);

            return ResponseEntity.ok(new LoginResponse(token));

        } catch (Exception ex) {
            log.error("could not authenticate: " + ex, ex);
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
    }

    @GetMapping("/ping")
    public String ping() {
        return "pong";
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/security/LoginRequest.java
================================================
package org.springframework.samples.petclinic.security;

public class LoginRequest {

    private String username;
    private String password;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/security/LoginResponse.java
================================================
package org.springframework.samples.petclinic.security;

public class LoginResponse {
    private final String token;

    public LoginResponse(String token) {
        this.token = token;
    }

    public String getToken() {
        return token;
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/security/NeverExpiringTokenGenerator.java
================================================
package org.springframework.samples.petclinic.security;

import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.samples.petclinic.auth.UserRepository;
import org.springframework.stereotype.Component;

import java.time.Instant;
import java.time.temporal.ChronoUnit;


/**
 * Generates a non-expiring token for testing.
 *
 * 👮  👮  👮 YOU SHOULD NEVER DO THIS IN PRODUCTION 👮  👮  👮
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@Component
class NeverExpiringTokenGenerator {

    private static final Logger log = LoggerFactory.getLogger(NeverExpiringTokenGenerator.class);

    private final UserRepository userRepository;
    private final JwtTokenService tokenService;

    NeverExpiringTokenGenerator(UserRepository userRepository, JwtTokenService tokenService) {
        this.userRepository = userRepository;
        this.tokenService = tokenService;
    }

    /**
     * Creates a token that will never expire and will be stable accross re-starts
     * as longs as the RSAKey does not change (keys from publicKey and privateKey application properties)
     * <p>
     * This token can be used for easier testing using command line tools etc.
     * 👮  👮  👮 YOU SHOULD NEVER DO THIS IN 'REAL' PRODUCTION APPS 👮  👮  👮
     */
    @PostConstruct
    void createNonExpiringTokens() {
        var somewhen = Instant.now().plus(10 * 365, ChronoUnit.DAYS);

        var susi = userRepository.findByUsername("susi").orElseThrow();
        var neverExpiringManagerToken = tokenService.generateToken(susi.getUsername(), susi.getRoles(), somewhen);

        var joe = userRepository.findByUsername("joe").orElseThrow();
        var neverExpiringUserToken = tokenService.generateToken(joe.getUsername(), joe.getRoles(), somewhen);
        log.info("""

                ===============================================================
                🚨 🚨 🚨 NEVER EXPIRING JWT TOKENS 🚨 🚨 🚨
                ===============================================================
                SCOPE_MANAGER
                login: '{}'

                {"Authorization": "Bearer {}"}

                SCOPE_USER
                login: '{}'

                {"Authorization": "Bearer {}"}

                ===============================================================
                """,
            susi.getUsername(),
            neverExpiringManagerToken,
            joe.getUsername(),
            neverExpiringUserToken);
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/security/RSAKeyProvider.java
================================================
package org.springframework.samples.petclinic.security;

import com.nimbusds.jose.jwk.RSAKey;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;

import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.UUID;

/**
 * @author Nils Hartmann (nils@nilshartmann.net)
 * <p>
 * Based on Code from Dan Vega: https://github.com/danvega/jwt-username-password/blob/master/src/main/java/dev/danvega/jwt/security/Jwks.java
 * <p>
 * GENERATE KEYS WITH OPENSSL:
 * <p>
 * Private Key:  openssl genpkey -out private_key.pem -algorithm RSA -pkeyopt rsa_keygen_bits:4096
 * Public Key :  openssl rsa -pubout -outform pem -in private_key.pem -out public_key.pem
 */
@Component
public class RSAKeyProvider {
    private static final Logger log = LoggerFactory.getLogger(RSAKeyProvider.class);

    private final Resource publicKeyResource;
    private final Resource privateKeyResource;

    private RSAKey rsaKey;

    public RSAKeyProvider(@Value("${publicKey}") Resource publicKeyResource, @Value("${privateKey}") Resource privateKeyResource) {
        this.publicKeyResource = publicKeyResource;
        this.privateKeyResource = privateKeyResource;
    }

    public RSAKey getRsaKey() {
        return rsaKey;
    }

    @PostConstruct
    private void generateRsaKey() throws Exception {

        var publicKeyString = publicKeyResource.getInputStream().readAllBytes();
        var privateKeyString = privateKeyResource.getInputStream().readAllBytes();

        log.info("Creating RSA KEY......");
        KeyFactory kf = KeyFactory.getInstance("RSA");

        RSAPublicKey publicKey = getPublicKey();
        RSAPrivateKey privateKey = getPrivateKey();

        this.rsaKey = new RSAKey.Builder(publicKey)
            .privateKey(privateKey)
            .keyID(UUID.randomUUID().toString())
            .build();
    }

    private RSAPublicKey getPublicKey() throws Exception {
        log.debug("Public key {}", publicKeyResource.getURI());
        byte[] keyBytes = publicKeyResource.getInputStream().readAllBytes();
        String publicKeyPem = new String(keyBytes)
            .replace("-----BEGIN PUBLIC KEY-----", "")
            .replace("-----END PUBLIC KEY-----", "")
            .replaceAll("\\s+", "");
        byte[] decoded = Base64.getDecoder().decode(publicKeyPem.trim());

        X509EncodedKeySpec spec = new X509EncodedKeySpec(decoded);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return (RSAPublicKey) keyFactory.generatePublic(spec);
    }

    private RSAPrivateKey getPrivateKey() throws Exception {
        log.debug("Private key {}", privateKeyResource.getURI());
        byte[] keyBytes = privateKeyResource.getInputStream().readAllBytes();
        String privateKeyPEM = new String(keyBytes)
            .replace("-----BEGIN PRIVATE KEY-----", "")
            .replace("-----END PRIVATE KEY-----", "")
            .replaceAll("\\s+", "");

        byte[] decoded = Base64.getDecoder().decode(privateKeyPEM);
        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(decoded);
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        return (RSAPrivateKey) keyFactory.generatePrivate(spec);
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/security/SecurityConfig.java
================================================
package org.springframework.samples.petclinic.security;

import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jose.jwk.RSAKey;
import com.nimbusds.jose.jwk.source.JWKSource;
import com.nimbusds.jose.proc.SecurityContext;
import jakarta.servlet.DispatcherType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpHeaders;
import org.springframework.samples.petclinic.auth.UserRepository;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
import org.springframework.security.config.annotation.web.configurers.CsrfConfigurer;
import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.JwtEncoder;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
import org.springframework.security.oauth2.jwt.NimbusJwtEncoder;
import org.springframework.security.oauth2.server.resource.web.BearerTokenResolver;
import org.springframework.security.oauth2.server.resource.web.DefaultBearerTokenResolver;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import java.util.Arrays;

/**
 * Configures security for PetClinic. Ensures that all requests to /graphql are secured.
 *
 * @author Nils Hartmann (nils@nilshartmann.net)
 */
@Configuration
@EnableMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig {
    private static final Logger log = LoggerFactory.getLogger(SecurityConfig.class);

    private final RSAKey rsaKey;

    public SecurityConfig(RSAKeyProvider RSAKeyProvider) {
        this.rsaKey = RSAKeyProvider.getRsaKey();
    }

    @Bean
    public AuthenticationManager authManager(UserDetailsService userDetailsService) {
        var authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService);
        return new ProviderManager(authProvider);
    }

    @Bean
    public UserDetailsService userDetailsService(UserRepository userRepository) {
        return username -> userRepository
            .findByUsername(username)
            .orElseThrow(
                () -> new UsernameNotFoundException(
                    username
                )
            );
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.csrf(AbstractHttpConfigurer::disable);

        http.sessionManagement(c -> c.sessionCreationPolicy(SessionCreationPolicy.STATELESS));

        http.authorizeHttpRequests(authorizeHttpRequests ->
            authorizeHttpRequests
                .dispatcherTypeMatchers(DispatcherType.ERROR).permitAll()
                // allow login
                .requestMatchers("/api/login/**").permitAll()
//                // allow access to graphiql
                .requestMatchers("/").permitAll()
                .requestMatchers("/favicon.ico").permitAll()
                .requestMatchers("/index.html").permitAll()
                .requestMatchers("/graphiql/**").permitAll()
                // ...while all other endpoints (INCLUDING /graphql !) should be authenticated
                //    fine granular, Role-based, access checks are done in the resolver
                .anyRequest().authenticated()
        );

        http.oauth2ResourceServer(c -> c.jwt(Customizer.withDefaults()));

        return http.build();
    }

    @Bean
    BearerTokenResolver bearerTokenResolver() {
        DefaultBearerTokenResolver bearerTokenResolver = new DefaultBearerTokenResolver();
        bearerTokenResolver.setAllowUriQueryParameter(true);
        return bearerTokenResolver;
    }

    @Bean
    public JWKSource<SecurityContext> jwkSource(RSAKeyProvider RSAKeyProvider) {
        JWKSet jwkSet = new JWKSet(rsaKey);
        return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
    }

    @Bean
    JwtEncoder jwtEncoder(JWKSource<SecurityContext> jwks) {
        return new NimbusJwtEncoder(jwks);
    }

    @Bean
    JwtDecoder jwtDecoder() throws JOSEException {
        return NimbusJwtDecoder.withPublicKey(rsaKey.toRSAPublicKey()).build();
    }
}


================================================
FILE: backend/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java
================================================
/*
 * Copyright 2002-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.samples.petclinic.util;

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Collection;
import java.util.Date;

import org.springframework.orm.ObjectRetrievalFailureException;
import org.springframework.samples.petclinic.model.BaseEntity;

/**
 * Utility methods for handling entities. Separate from the BaseEntity class mainly because of dependency on the
 * ORM-associated ObjectRetrievalFailureException.
 *
 * @author Juergen Hoeller
 * @author Sam Brannen
 * @see BaseEntity
 * @since 29.10.2003
 */
public abstract class EntityUtils {

    /**
     * Look up the entity of the given class with the given id in the given collection.
     *
     * @param entities    the collection to search
     * @param entityClass the entity class to look up
     * @param entityId    the entity id to look up
     * @return the found entity
     * @throws ObjectRetrievalFailureException if the entity was not found
     */
    public static <T extends BaseEntity> T getById(Collection<T> entities, Class<T> entityClass, int entityId)
        throws ObjectRetrievalFailureException {
        for (T entity : entities) {
            if (entity.getId() == entityId && entityClass.isInstance(entity)) {
                return entity;
            }
        }
        throw new ObjectRetrievalFailureException(entityClass, entityId);
    }

    public static LocalDate asDateTime(Date date) {
        return LocalDate.ofInstant(new Date(date.getTime()).toInstant(), ZoneId.systemDefault());

    }

}


================================================
FILE: backend/src/main/resources/application.properties
================================================
# DataSource configuration omitted,
# as Spring Boot 3.1+ uses configuration from
# docker-compose/TestContainer automatically
spring.jpa.hibernate.ddl-auto=validate

logging.level.org.springframework.security=TRACE
logging.level.org.springframework.graphql=TRACE
logging.level.graphql=INFO



#----------------------------------------------------------------
# Server Configuration
#----------------------------------------------------------------
server.port=9977

#----------------------------------------------------------------
# Logging
#----------------------------------------------------------------
logging.level.org.springframework=INFO

#----------------------------------------------------------------
# Spring Security
#----------------------------------------------------------------
spring.security.filter.dispatcher-types=request,error
# Note that in real life:
# your would NEVER CHECK IN KEYS TO GIT (esp. no private keys)
# This is only to make the demo easier:
#  - no need to generate the keys yourself
#  - ability to provide stable, long living tokens for easier (live) demos
# NEVER check in your keys

publicKey=classpath:keys/public_key.pem
privateKey=classpath:keys/private_key.pem

#----------------------------------------------------------------
# spring-graphql config
#----------------------------------------------------------------
# Note that we DO NOT use the embedded GraphiQL UI from
# spring-graphql yet, because we use our own version
# that contains a login form
# Maybe we can switch to cookie-based authentication
# later
spring.graphql.graphiql.enabled=true

# !!! For CORS configuration see SecurityConfig class !!!

# GraphQL endpoints for Web and WebSocket requests
# Note that this endpoints are accessible only with a
# valid JWT token.
# You can find a valid token after login with GraphiQL
# or in the server log file after starting the server
# (search for "Never Expiring JWT Token")
spring.graphql.path=/graphql
spring.graphql.websocket.path=/graphqlws



================================================
FILE: backend/src/main/resources/db/migration/V100_1__create_schema.sql
================================================
DROP TABLE IF EXISTS visits CASCADE;
DROP TABLE IF EXISTS specialties CASCADE;
DROP TABLE IF EXISTS vet_specialties CASCADE;
DROP TABLE IF EXISTS vets CASCADE;
DROP TABLE IF EXISTS pets CASCADE;
DROP TABLE IF EXISTS types CASCADE;
DROP TABLE IF EXISTS owners CASCADE;
DROP TABLE IF EXISTS roles CASCADE;
DROP TABLE IF EXISTS users CASCADE;

CREATE TABLE users
(
    username VARCHAR(20)          NOT NULL,
    password VARCHAR(20)          NOT NULL,
    enabled  BOOLEAN DEFAULT TRUE NOT NULL,
    fullname VARCHAR(256)         NOT NULL,
    PRIMARY KEY (username)
);

CREATE TABLE roles
(
    id       integer generated by default as identity,
    username VARCHAR(20) NOT NULL REFERENCES users (username),
    role     VARCHAR(20) NOT NULL,
    primary key (id)
);
CREATE INDEX fk_username_idx ON roles (username);


CREATE TABLE vets
(
    id       integer generated by default as identity,
    first_name VARCHAR(30),
    last_name  VARCHAR(30),
    primary key (id)
);
CREATE INDEX vets_last_name ON vets (last_name);

CREATE TABLE specialties
(
    id       integer generated by default as identity,
    name VARCHAR(80),
    primary key (id)
);
CREATE INDEX specialties_name ON specialties (name);

CREATE TABLE vet_specialties
(
    vet_id       INTEGER NOT NULL,
    specialty_id INTEGER NOT NULL
);

alter table vet_specialties
    add constraint vet_specialties_to_vet_fk
        foreign key (vet_id)
            references vets;

alter table vet_specialties
    add constraint vet_specialties_to_specialties_fk
        foreign key (specialty_id)
            references specialties;

CREATE TABLE types
(
    id       integer generated by default as identity,
    name VARCHAR(80),
    primary key (id)
);
CREATE INDEX types_name ON types (name);

CREATE TABLE owners
(
    id       integer generated by default as identity,
    first_name VARCHAR(30),
    last_name  VARCHAR(30),
    address    VARCHAR(255),
    city       VARCHAR(255),
    telephone  VARCHAR(128),
    primary key (id)
);
CREATE INDEX owners_last_name ON owners (lower(last_name));

CREATE TABLE pets
(
    id       integer generated by default as identity,
    name       VARCHAR(30),
    birth_date DATE,
    type_id    INTEGER NOT NULL REFERENCES types (id),
    owner_id   INTEGER NOT NULL REFERENCES owners (id),
    primary key (id)
);
CREATE INDEX pets_name ON pets (name);

CREATE TABLE visits
(
    id       integer generated by default as identity,
    pet_id      INTEGER NOT NULL REFERENCES pets (id),
    vet_id      INTEGER REFERENCES vets (id),
    visit_date  DATE,
    description VARCHAR(255),
    primary key (id)
);
CREATE INDEX visits_pet_id ON visits (pet_id);


================================================
FILE: backend/src/main/resources/db/migration/V100_2__fill_db.sql
================================================
INSERT INTO users (USERNAME, PASSWORD, ENABLED, FULLNAME) VALUES ('joe', '{noop}joe', true, 'Joe Hill');
INSERT INTO users (USERNAME, PASSWORD, ENABLED, FULLNAME) VALUES ('susi', '{noop}susi', true, 'Susi Smith');

INSERT INTO roles (ID, USERNAME, ROLE) VALUES (0, 'susi', 'MANAGER');
INSERT INTO roles (ID, USERNAME, ROLE) VALUES (1, 'joe', 'USER');

INSERT INTO vets VALUES (1, 'James', 'Carter');
INSERT INTO vets VALUES (2, 'Helen', 'Leary');
INSERT INTO vets VALUES (3, 'Linda', 'Douglas');
INSERT INTO vets VALUES (4, 'Rafael', 'Ortega');
INSERT INTO vets VALUES (5, 'Henry', 'Stevens');
INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins');
INSERT INTO vets VALUES (7, 'John', 'Smith');
INSERT INTO vets VALUES (8, 'Sophie', 'Dubois');
INSERT INTO vets VALUES (9, 'Akira', 'Tanaka');
INSERT INTO vets VALUES (10, 'Elena', 'Petrova');

INSERT INTO specialties VALUES (1, 'radiology');
INSERT INTO specialties VALUES (2, 'surgery');
INSERT INTO specialties VALUES (3, 'dentistry');

INSERT INTO vet_specialties VALUES (2, 1);
INSERT INTO vet_specialties VALUES (3, 2);
INSERT INTO vet_specialties VALUES (3, 3);
INSERT INTO vet_specialties VALUES (4, 2);
INSERT INTO vet_specialties VALUES (5, 1);

INSERT INTO types VALUES (1, 'Cat');
INSERT INTO types VALUES (2, 'Dog');
INSERT INTO types VALUES (3, 'Lizard');
INSERT INTO types VALUES (4, 'Snake');
INSERT INTO types VALUES (5, 'Bird');
INSERT INTO types VALUES (6, 'Hamster');

INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023');
INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749');
INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763');
INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198');
INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765');
INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654');
INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387');
INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683');
INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435');
INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487');
INSERT INTO owners VALUES (11, 'John', 'Smith', '123 Main Street', 'New York', '+1 (555) 123-4567');
INSERT INTO owners VALUES (12, 'Sophie', 'Dubois', '456 Rue de la Paix', 'Paris', '+33 6 12 34 56 78');
INSERT INTO owners VALUES (13, 'Akira', 'Tanaka', '789 Sakura Avenue', 'Tokyo', '+81 90 1234 5678');
INSERT INTO owners VALUES (14, 'Carlos', 'Rodriguez', '202 Avenida de Mayo', 'Buenos Aires', '+54 9 11 2345-6789');
INSERT INTO owners VALUES (15, 'Anita', 'Müller', '303 Hauptstraße', 'Berlin', '+49 30 12345678');
INSERT INTO owners VALUES (16, 'Ravi', 'Patel', '404 MG Road', 'Mumbai', '+91 98765 43210');
INSERT INTO owners VALUES (17, 'Maria', 'da Silva', '505 Rua Augusta', 'São Paulo', '+55 11 98765-4321');
INSERT INTO owners VALUES (18, 'Hans', 'Johansson', '606 Drottninggatan', 'Stockholm', '+46 70 123 45 67');
INSERT INTO owners VALUES (19, 'Xi', 'Chen', '707 Nanjing Road', 'Shanghai', '+86 136 1234 5678');
INSERT INTO owners VALUES (20, 'Alice', 'Johnson', '808 Park Avenue', 'Los Angeles', '+1 (555) 234-5678');
INSERT INTO owners VALUES (21, 'François', 'Dupont', '909 Champs-Élysées', 'Paris', '+33 6 23 45 67 89');
INSERT INTO owners VALUES (22, 'Yuki', 'Kato', '101 Ueno Park', 'Tokyo', '+81 90 2345 6789');
INSERT INTO owners VALUES (23, 'Isabella', 'Gomez', '303 Tango Street', 'Buenos Aires', '+54 9 11 3456-7890');
INSERT INTO owners VALUES (24, 'Lukas', 'Schmidt', '404 Brandenburger Tor', 'Berlin', '+49 30 23456789');
INSERT INTO owners VALUES (25, 'Aarav', 'Sharma', '505 Bollywood Lane', 'Mumbai', '+91 98765 54321');
INSERT INTO owners VALUES (26, 'Camila', 'Santos', '606 Copacabana Beach', 'Rio de Janeiro', '+55 21 98765-4321');
INSERT INTO owners VALUES (27, 'Elsa', 'Larsson', '707 Abba Street', 'Stockholm', '+46 70 234 56 78');
INSERT INTO owners VALUES (28, 'Lei', 'Wang', '808 Forbidden City', 'Beijing', '+86 136 2345 6789');
INSERT INTO owners VALUES (29, 'Olivia', 'Miller', '909 Ocean Drive', 'Miami', '+1 (555) 345-6789');
INSERT INTO owners VALUES (30, 'Antoine', 'Dufresne', '101 Montmartre Avenue', 'Paris', '+33 6 34 56 78 90');
INSERT INTO owners VALUES (31, 'Takashi', 'Yamamoto', '202 Ginza Street', 'Tokyo', '+81 90 3456 7890');
INSERT INTO owners VALUES (32, 'Sofia', 'Ivanova', '303 Nevsky Prospect', 'St. Petersburg', '+7 495 345-67-89');
INSERT INTO owners VALUES (33, 'Diego', 'Lopez', '404 Tango Avenue', 'Buenos Aires', '+54 9 11 4567-8901');
INSERT INTO owners VALUES (34, 'Lena', 'Müller', '505 Oktoberfest Platz', 'Munich', '+49 30 34567890');
INSERT INTO owners VALUES (35, 'Amit', 'Kumar', '606 Bollywood Boulevard', 'Mumbai', '+91 98765 65432');
INSERT INTO owners VALUES (36, 'Giovanna', 'Silva', '707 Samba Street', 'Rio de Janeiro', '+55 21 98765-5432');
INSERT INTO owners VALUES (37, 'Emil', 'Eriksson', '808 Viking Road', 'Gothenburg', '+46 70 345 67 89');
INSERT INTO owners VALUES (38, 'Wei', 'Zhang', '909 Great Wall Street', 'Beijing', '+86 136 3456 7890');
INSERT INTO owners VALUES (39, 'Emma', 'Williams', '101 Broadway', 'New York', '+1 (555) 456-7890');
INSERT INTO owners VALUES (40, 'Lucien', 'Martin', '202 Louvre Lane', 'Paris', '+33 6 45 67 89 01');
INSERT INTO owners VALUES (41, 'Aiko', 'Takahashi', '303 Mt. Fuji View', 'Tokyo', '+81 90 4567 8901');
INSERT INTO owners VALUES (42, 'Mateo', 'Garcia', '505 Tango Terrace', 'Buenos Aires', '+54 9 11 5678-9012');
INSERT INTO owners VALUES (43, 'Lotte', 'Schneider', '606 Black Forest Street', 'Freiburg', '+49 30 45678901');
INSERT INTO owners VALUES (44, 'Arjun', 'Singh', '707 Bollywood Drive', 'Mumbai', '+91 98765 76543');
INSERT INTO owners VALUES (45, 'Juliana', 'Rodrigues', '808 Ipanema Beach', 'Rio de Janeiro', '+55 21 98765-6543');
INSERT INTO owners VALUES (46, 'Oskar', 'Lindgren', '909 Fika Lane', 'Stockholm', '+46 70 456 78 90');
INSERT INTO owners VALUES (47, 'Jing', 'Li', '101 Forbidden Palace Avenue', 'Beijing', '+86 136 4567 8901');
INSERT INTO owners VALUES (48, 'Liam', 'Anderson', '202 Golden Gate Street', 'San Francisco', '+1 (555) 567-8901');
INSERT INTO owners VALUES (49, 'Isabelle', 'Leclerc', '303 Seine River View', 'Paris', '+33 6 56 78 90 12');
INSERT INTO owners VALUES (50, 'Yoshiro', 'Suzuki', '404 Asakusa Street', 'Tokyo', '+81 90 5678 9012');
INSERT INTO owners VALUES (51, 'Polina', 'Petrovich', '505 Hermitage Plaza', 'St. Petersburg', '+7 495 567-89-01');
INSERT INTO owners VALUES (52, 'Mariana', 'Fernandez', '606 Tango Square', 'Buenos Aires', '+54 9 11 6789-0123');
INSERT INTO owners VALUES (53, 'Matteo', 'Weber', '707 Alpine Avenue', 'Munich', '+49 30 56789012');
INSERT INTO owners VALUES (54, 'Anaya', 'Singh', '808 Gateway Street', 'Mumbai', '+91 98765 87654');
INSERT INTO owners VALUES (55, 'Luca', 'Carvalho', '909 Carnival Road', 'Rio de Janeiro', '+55 21 98765-7654');
INSERT INTO owners VALUES (56, 'Hugo', 'Nordström', '101 Ice Hotel Lane', 'Kiruna', '+46 70 567 89 01');
INSERT INTO owners VALUES (57, 'Mei', 'Liu', '202 Great Wall Lane', 'Beijing', '+86 136 5678 9012');

INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1);
INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2);
INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3);
INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3);
INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4);
INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5);
INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6);
INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6);
INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7);
INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8);
INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9);
INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10);
INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10);
INSERT INTO pets VALUES (14, 'Bella', '1992-06-20', 1, 11);
INSERT INTO pets VALUES (15, 'Luna', '2002-10-29', 2, 12);
INSERT INTO pets VALUES (16, 'Charlie', '2017-08-13', 3, 13);
INSERT INTO pets VALUES (17, 'Lucy', '2016-09-29', 4, 14);
INSERT INTO pets VALUES (18, 'Cooper', '1984-02-27', 5, 15);
INSERT INTO pets VALUES (19, 'Max', '1975-01-25', 6, 16);
INSERT INTO pets VALUES (20, 'Bailey', '2007-10-03', 1, 17);
INSERT INTO pets VALUES (21, 'Daisy', '1993-01-16', 2, 18);
INSERT INTO pets VALUES (22, 'Sadie', '2020-08-05', 3, 19);
INSERT INTO pets VALUES (23, 'Lola', '2017-08-03', 4, 20);
INSERT INTO pets VALUES (24, 'Buddy', '2015-06-21', 5, 21);
INSERT INTO pets VALUES (25, 'Molly', '2001-03-10', 6, 22);
INSERT INTO pets VALUES (26, 'Stella', '2008-03-27', 1, 23);
INSERT INTO pets VALUES (27, 'Tucker', '2009-11-22', 2, 24);
INSERT INTO pets VALUES (28, 'Bear', '1973-01-02', 3, 25);
INSERT INTO pets VALUES (29, 'Zoey', '2015-10-04', 4, 26);
INSERT INTO pets VALUES (30, 'Duke', '1993-06-25', 5, 27);
INSERT INTO pets VALUES (31, 'Harley', '1991-09-28', 6, 28);
INSERT INTO pets VALUES (32, 'Maggie', '2001-09-25', 1, 29);
INSERT INTO pets VALUES (33, 'Jax', '1980-08-18', 2, 30);
INSERT INTO pets VALUES (34, 'Bentley', '1993-02-01', 3, 31);
INSERT INTO pets VALUES (35, 'Milo', '1990-07-21', 4, 32);
INSERT INTO pets VALUES (36, 'Oliver', '1992-11-21', 5, 33);
INSERT INTO pets VALUES (37, 'Riley', '2013-03-09', 6, 34);
INSERT INTO pets VALUES (38, 'Rocky', '1978-07-27', 1, 35);
INSERT INTO pets VALUES (39, 'Penny', '1998-02-05', 2, 36);
INSERT INTO pets VALUES (40, 'Sophie', '1995-03-15', 3, 37);
INSERT INTO pets VALUES (41, 'Chloe', '2003-07-11', 4, 38);
INSERT INTO pets VALUES (42, 'Jack', '2006-03-22', 5, 39);
INSERT INTO pets VALUES (43, 'Lily', '2002-01-30', 6, 40);
INSERT INTO pets VALUES (44, 'Nala', '1983-02-13', 1, 41);
INSERT INTO pets VALUES (45, 'Piper', '2017-09-04', 2, 42);
INSERT INTO pets VALUES (46, 'Zeus', '1974-03-01', 3, 43);
INSERT INTO pets VALUES (47, 'Ellie', '2000-04-21', 4, 44);
INSERT INTO pets VALUES (48, 'Winston', '2007-02-06', 5, 45);
INSERT INTO pets VALUES (49, 'Toby', '2008-12-11', 6, 46);
INSERT INTO pets VALUES (50, 'Loki', '2011-01-22', 1, 47);
INSERT INTO pets VALUES (51, 'Murphy', '1992-06-12', 2, 48);
INSERT INTO pets VALUES (52, 'Roxy', '1985-01-15', 3, 49);
INSERT INTO pets VALUES (53, 'Coco', '1977-06-20', 4, 50);
INSERT INTO pets VALUES (54, 'Rosie', '2004-09-30', 5, 51);
INSERT INTO pets VALUES (55, 'Teddy', '2017-03-11', 6, 52);
INSERT INTO pets VALUES (56, 'Ruby', '2001-02-14', 1, 53);
INSERT INTO pets VALUES (57, 'Gracie', '1993-02-20', 2, 54);
INSERT INTO pets VALUES (58, 'Leo', '1987-02-03', 3, 55);
INSERT INTO pets VALUES (59, 'Finn', '2005-03-07', 4, 56);
INSERT INTO pets VALUES (60, 'Scout', '1975-10-19', 5, 57);
INSERT INTO pets VALUES (61, 'Dexter', '1983-04-25', 6, 11);
INSERT INTO pets VALUES (62, 'Ollie', '1997-10-20', 1, 12);
INSERT INTO pets VALUES (63, 'Koda', '1993-01-24', 2, 13);
INSERT INTO pets VALUES (64, 'Diesel', '1993-04-19', 3, 14);
INSERT INTO pets VALUES (65, 'Moose', '2012-10-14', 4, 15);
INSERT INTO pets VALUES (66, 'Mia', '2016-11-24', 5, 16);
INSERT INTO pets VALUES (67, 'Marley', '1978-02-18', 6, 17);
INSERT INTO pets VALUES (68, 'Gus', '2001-06-30', 1, 18);
INSERT INTO pets VALUES (69, 'Hank', '2015-10-14', 2, 19);
INSERT INTO pets VALUES (70, 'Willow', '2006-09-02', 3, 20);


INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (1, 7, 4, '2013-01-01', 'rabies shot');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (2, 8, NULL, '2013-01-02', 'rabies shot');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (3, 8, 4, '2013-01-03', 'neutered');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (4, 7, NULL, '2013-01-04', 'spayed');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (5, 14, 7, '2022-01-15', 'Vaccination Checkup');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (6, 15, 8, '2022-03-27', 'Teeth Cleaning');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (7, 16, 9, '2022-05-10', 'Orthopedic X-rays');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (8, 17, 10, '2022-07-18', 'Blood Tests');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (9, 18, 7, '2022-09-05', 'Abdominal Ultrasound');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (10, 19, 8, '2022-11-11', 'Heartworm Test');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (11, 20, 9, '2023-01-02', 'Dental Checkup');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (12, 21, 10, '2023-03-14', 'Eye Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (13, 22, 7, '2023-05-26', 'Fecal Analysis');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (14, 23, 8, '2023-08-01', 'Skin Biopsy');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (15, 24, 9, '2023-10-09', 'Spaying/Neutering');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (16, 25, 10, '2023-12-20', 'Microchipping');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (17, 26, 7, '2024-02-01', 'Allergy Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (18, 27, 8, '2024-04-12', 'Joint Aspiration');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (19, 28, 9, '2024-06-25', 'Ear Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (20, 29, 10, '2024-08-08', 'Blood Pressure Measurement');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (21, 30, 7, '2024-10-19', 'Cancer Screening');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (22, 31, 8, '2024-12-03', 'Glaucoma Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (23, 32, 9, '2022-02-18', 'Flea and Tick Prevention');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (24, 33, 10, '2022-04-30', 'Deworming');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (25, 34, 7, '2022-06-15', 'CT Scan');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (26, 35, 8, '2022-08-23', 'MRI');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (27, 36, 9, '2022-10-05', 'EKG');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (28, 37, 10, '2022-12-11', 'Nutritional Counseling');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (29, 38, 7, '2023-02-22', 'Joint Aspiration');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (30, 39, 8, '2023-04-06', 'Cancer Screening');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (31, 40, 9, '2023-06-18', 'Glaucoma Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (32, 41, 10, '2023-08-30', 'Blood Clotting Profile');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (33, 42, 7, '2023-11-06', 'Orthopedic Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (34, 43, 8, '2024-01-19', 'Fecal Analysis');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (35, 44, 9, '2024-03-02', 'Heartworm Test');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (36, 45, 10, '2024-05-15', 'Skin Biopsy');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (37, 46, 7, '2024-07-27', 'Spaying/Neutering');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (38, 47, 8, '2024-10-02', 'Orthopedic Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (39, 48, 9, '2024-12-14', 'Dental Checkup');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (40, 49, 10, '2022-01-27', 'Ear Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (41, 50, 7, '2022-04-09', 'Blood Pressure Measurement');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (42, 51, 8, '2022-06-22', 'Allergy Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (43, 52, 9, '2022-08-05', 'CT Scan');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (44, 53, 10, '2022-10-17', 'MRI');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (45, 54, 7, '2022-12-28', 'EKG');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (46, 55, 8, '2023-03-10', 'Nutritional Counseling');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (47, 56, 9, '2023-05-23', 'Joint Aspiration');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (48, 57, 10, '2023-08-01', 'Cancer Screening');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (49, 58, 7, '2023-10-13', 'Glaucoma Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (50, 59, 8, '2023-12-24', 'Blood Clotting Profile');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (51, 60, 9, '2024-02-03', 'Orthopedic Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (52, 61, 10, '2024-04-16', 'Fecal Analysis');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (53, 62, 7, '2024-06-29', 'Heartworm Test');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (54, 63, 8, '2024-09-11', 'Skin Biopsy');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (55, 64, 9, '2024-11-23', 'Spaying/Neutering');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (56, 65, 10, '2022-02-21', 'Microchipping');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (57, 66, 7, '2022-05-06', 'Allergy Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (58, 67, 8, '2022-07-18', 'Joint Aspiration');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (59, 68, 9, '2022-09-29', 'Ear Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (60, 69, 10, '2022-12-11', 'Blood Pressure Measurement');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (61, 70, 7, '2023-02-01', 'CT Scan');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (62, 14, 8, '2023-04-15', 'MRI');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (63, 15, 9, '2023-06-27', 'EKG');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (64, 16, 10, '2023-09-10', 'Nutritional Counseling');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (65, 17, 7, '2023-11-22', 'Joint Aspiration');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (66, 18, 8, '2024-02-06', 'Cancer Screening');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (67, 19, 9, '2024-05-19', 'Glaucoma Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (68, 20, 10, '2024-07-31', 'Blood Clotting Profile');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (69, 21, 7, '2024-10-11', 'Orthopedic Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (70, 22, 8, '2022-02-27', 'Dental Checkup');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (71, 23, 9, '2022-05-11', 'Fecal Analysis');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (72, 24, 10, '2022-07-24', 'Heartworm Test');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (73, 25, 7, '2022-10-05', 'Skin Biopsy');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (74, 26, 8, '2022-12-16', 'Spaying/Neutering');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (75, 27, 9, '2023-02-26', 'Ear Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (76, 28, 10, '2023-05-09', 'Blood Pressure Measurement');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (77, 29, 7, '2023-07-22', 'Allergy Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (78, 30, 8, '2023-10-03', 'CT Scan');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (79, 31, 9, '2023-12-15', 'MRI');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (80, 32, 10, '2024-02-26', 'EKG');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (81, 33, 7, '2024-05-09', 'Nutritional Counseling');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (82, 34, 8, '2024-07-22', 'Joint Aspiration');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (83, 35, 9, '2024-10-03', 'Cancer Screening');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (84, 36, 10, '2024-12-15', 'Glaucoma Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (85, 37, 7, '2022-04-02', 'Blood Clotting Profile');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (86, 38, 8, '2022-06-15', 'Orthopedic Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (87, 39, 9, '2022-08-28', 'Dental Checkup');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (88, 40, 10, '2022-11-09', 'Fecal Analysis');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (89, 41, 7, '2023-01-21', 'Heartworm Test');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (90, 42, 8, '2023-04-05', 'Skin Biopsy');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (91, 43, 9, '2023-06-17', 'Spaying/Neutering');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (92, 44, 10, '2023-08-30', 'Ear Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (93, 45, 7, '2023-11-11', 'Blood Pressure Measurement');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (94, 46, 8, '2024-02-03', 'Allergy Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (95, 47, 9, '2024-04-18', 'CT Scan');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (96, 48, 10, '2024-07-01', 'MRI');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (97, 49, 7, '2024-09-14', 'EKG');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (98, 50, 8, '2024-11-26', 'Nutritional Counseling');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (99, 51, 9, '2022-01-30', 'Joint Aspiration');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (100, 52, 10, '2022-04-14', 'Cancer Screening');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (101, 53, 7, '2022-06-26', 'Glaucoma Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (102, 54, 8, '2022-09-08', 'Blood Clotting Profile');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (103, 55, 9, '2022-11-21', 'Orthopedic Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (104, 56, 10, '2023-02-02', 'Dental Checkup');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (105, 57, 7, '2023-04-16', 'Fecal Analysis');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (106, 58, 8, '2023-06-29', 'Heartworm Test');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (107, 59, 9, '2023-09-10', 'Skin Biopsy');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (108, 60, 10, '2023-11-23', 'Spaying/Neutering');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (109, 61, 7, '2024-02-05', 'Ear Examination');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (110, 62, 8, '2024-04-18', 'Blood Pressure Measurement');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (111, 63, 9, '2024-06-29', 'Allergy Testing');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (112, 64, 10, '2024-09-11', 'CT Scan');
INSERT INTO visits (id, pet_id, vet_id, visit_date, description) VALUES (113, 65, 7, '2024-11-23', 'MRI');


ALTER SEQUENCE roles_id_seq RESTART WITH 200;
ALTER SEQUENCE vets_id_seq RESTART WITH 200;
ALTER SEQUENCE specialties_id_seq RESTART WITH 200;
ALTER SEQUENCE types_id_seq RESTART WITH 200;
ALTER SEQUENCE owners_id_seq RESTART WITH 200;
ALTER SEQUENCE pets_id_seq RESTART WITH 200;
ALTER SEQUENCE visits_id_seq RESTART WITH 200;


================================================
FILE: backend/src/main/resources/graphql/petclinic.graphqls
================================================
# This file was generated. Do not edit manually.

schema {
    query: Query
    mutation: Mutation
    subscription: Subscription
}

"Interface that describes a Person, i.e. a Vet or an Owner"
interface Person {
    firstName: String!
    id: Int!
    lastName: String!
}

union AddVetPayload = AddVetErrorPayload | AddVetSuccessPayload

type AddOwnerPayload {
    owner: Owner!
}

type AddPetPayload {
    pet: Pet!
}

"Return Value of the addSpecialty Mutation"
type AddSpecialtyPayload {
    "The new Specialty including the assigned Id"
    specialty: Specialty!
}

type AddVetErrorPayload {
    error: String!
}

type AddVetSuccessPayload {
    vet: Vet
}

type AddVisitPayload {
    visit: Visit!
}

"""
For motivation of how the Mutation look see:
https://dev-blog.apollodata.com/designing-graphql-mutations-e09de826ed97
"""
type Mutation {
    " Add a new Owner"
    addOwner(input: AddOwnerInput!): AddOwnerPayload!
    " Add a new Pet"
    addPet(input: AddPetInput!): AddPetPayload!
    " Add a Specialty"
    addSpecialty(input: AddSpecialtyInput!): AddSpecialtyPayload!
    " Add a new Veterinary (only allowed for users having Role ROLE_MANAGER)"
    addVet(input: AddVetInput!): AddVetPayload!
    " Add a Visit"
    addVisit(input: AddVisitInput!): AddVisitPayload!
    removeSpecialty(input: RemoveSpecialtyInput!): RemoveSpecialtyPayload!
    " Change an existing owner"
    updateOwner(input: UpdateOwnerInput!): UpdateOwnerPayload!
    updatePet(input: UpdatePetInput!): UpdatePetPayload!
    " Update (rename) a Specialty"
    updateSpecialty(input: UpdateSpecialtyInput!): UpdateSpecialtyPayload!
}

" An Owner is someone who owns a Pet"
type Owner implements Person {
    address: String!
    city: String!
    firstName: String!
    id: Int!
    lastName: String!
    " A list of Pets this Owner owns"
    pets: [Pet!]!
    telephone: String!
}

"""
A pet that might or might not have been seen in this petclinic for
one or more visits
"""
type Pet {
    birthDate: Date!
    id: Int!
    name: String!
    owner: Owner!
    type: PetType!
    " All visits to our PetClinic of this Pet"
    visits: VisitConnection!
}

" The type (species) of a Pet"
type PetType {
    id: Int!
    name: String!
}

type OwnerConnection {
    edges: [OwnerEdge]!
    pageInfo: PageInfo!
}

type OwnerEdge {
    node: Owner!
    cursor: String!
}

type VetConnection {
    edges: [VetEdge]!
    pageInfo: PageInfo!
}

type VetEdge {
    node: Vet!
    cursor: String!
}

type PageInfo {
    hasPreviousPage: Boolean!
    hasNextPage: Boolean!
    startCursor: String
    endCursor: String
}

" The Query type provides all entry points to the PetClinic GraphQL schema"
type Query {
    me: User!
    " Return the Owner with the specified id"
    owner(id: Int!): Owner!

    # Note: OwnerConnection and all required types (Edge and PageInfo) could be
    #       added by Spring for GraphQL at runtime to the schema.
    #       Disadvantage is, that tooling has problems (Code Generator, IntelliJ plug-in)
    #       so I deceided to hand code the types instead.
    #       Nevertheless there is no need forJava classes for the Connection and dependent types,
    #       because Spring for GraphQL does the mapping for us.
    #
    # Note: first, after, last and before are automatically processed by Spring for GraphQL
    #       and are passed with a ScrollSubrange object to the QueryMapping function
    #
    #
    """
    Find a list of owners according to the specified position, filter and order

    Note that you either have to specify first _or_ last
    """
    owners(first:Int, after:String, last:Int, before:String,
        "Use a filter to narrow your search results"
        filter: OwnerFilter,
        order: [OwnerOrder!]): OwnerConnection!

    # owners(filter: OwnerFilter, orders: [OwnerOrder!], page: Int, size: Int): OwnerSearchResult!
    " Return the Pet with the specified id"
    pet(id: Int!): Pet
    " Return a List of all pets that have been registered in the PetClinic"
    pets: [Pet!]!
    " Return all known PetTypes"
    pettypes: [PetType!]!
    " Returns 'pong', can be used to verify GraphQL API is working"
    ping: String!
    specialties: [Specialty!]!
    " Return the specified Vet or null if undefined"
    vet(id: Int!): Vet
    " Return all known veterinaries"
    vets(first:Int, after:String, last:Int, before:String): VetConnection!
}

type RemoveSpecialtyPayload {
    specialties: [Specialty!]!
}

" Specialty of a Vetenarian"
type Specialty {
    id: Int!
    name: String!
}

type Subscription {
    onNewVisit: Visit!
}

type UpdateOwnerPayload {
    owner: Owner!
}

type UpdatePetPayload {
    pet: Pet!
}

" Return value of the UpdateSpecialty Mutation"
type UpdateSpecialtyPayload {
    " The updated Specialty"
    specialty: Specialty!
}

type User {
    fullname: String!
    username: String!
}

" A Vetenerian"
type Vet implements Person {
    " The Vetenarian's first name"
    firstName: String!
    id: Int!
    " The Vetenarian's last name"
    lastName: String!
    " What is this Vet specialized in?"
    specialties: [Specialty!]!
    " All of this Vet's visits"
    visits: VisitConnection!
}

" A Visit of a Pet in our PetClinic"
type Visit {
    " When did this Visit happen?"
    date: Date!
    " What did the Vet do during the Visit?"
    description: String!
    id: Int!
    pet: Pet!
    " Optional: which veterinary has done this treatment?"
    treatingVet: Vet
}

type VisitConnection {
    " total number of visits this VisitConnection represents"
    totalCount: Int!
    " the actual visits (might be an empty list)"
    visits: [Visit!]!
}

" The input for types of query orders"
enum OrderField {
    address
    city
    firstName
    id
    lastName
    telephone
}

" The input for types of query orders"
enum OrderDirection {
    ASC
    DESC
}

"A Type representing a date (without time, only a day)"
scalar Date

input AddOwnerInput {
    address: String!
    city: String!
    firstName: String!
    lastName: String!
    telephone: String!
}

" The Input for AddPet mutation"
input AddPetInput {
    birthDate: Date!
    name: String!
    ownerId: Int!
    typeId: Int!
}

" The input value for the addSpecialty Mutation"
input AddSpecialtyInput {
    name: String!
}

input AddVetInput {
    firstName: String!
    lastName: String!
    specialtyIds: [Int!]!
}

input AddVisitInput {
    date: Date!
    description: String!
    petId: Int!
    " Optional: specifiy the vet that should lead this visit"
    vetId: Int
}

" The input for owners query by a filter"
input OwnerFilter {
    address: String
    city: String
    firstName: String
    lastName: String
    telephone: String
}

" The input for owners query by order"
input OwnerOrder {
    field: OrderField!
    direction: OrderDirection = ASC
}

input RemoveSpecialtyInput {
    specialtyId: Int!
}

input UpdateOwnerInput {
    address: String
    city: String
    firstName: String
    lastName: String
    ownerId: Int!
    telephone: String
}

input UpdatePetInput {
    birthDate: Date
    name: String
    petId: Int!
    typeId: Int
}

"""

The input value for the updateSpecialty Mutation
Takes the id of the specialty that should be updated and it's new Name
"""
input UpdateSpecialtyInput {
    " The new name of the Specialty"
    name: String!
    " The id of the specialty that should be updated"
    specialtyId: Int!
}


================================================
FILE: backend/src/main/resources/keys/private_key.pem
================================================
-----BEGIN PRIVATE KEY-----
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCml29+AGtlMg4w
Ml4egtS3lmYpNn8ClK4gEdTPT5UkEqKTCwxPdQi+AwwU0NWbmumdr0rJc9ky+TRX
wl73BOesDDkhOOPVZR67thKcoYADNdqCkf9j0PYUA32hkrrEUYosEZSwmzcmR5LR
GlHbPCRl1rDCih69YfGhOJPdApILymW5olCZB+L3eEncJeCZIcCqxERW9JTGEnJZ
ZroY0iZphJXvLjGs6l9tXaJvERcrT7ZntKQslieuoHrg9zgI20GKtYs3v1wv/Ljc
1LoM75qQn6KFz61Ea5vrOuzG3QiemqvqZevNlhJmKtWy319RkXdXgFPTpzxDSVUh
vzctcfkoXtRQD2u6E5n53OsOJKnoEzodle4ymDXDcn06yWOgU7an3jxiOqA+Hva2
hb4U3gX2OAsB2567zwwo22lx3RS9FosuUCyV35D3AJHjy6XX9qkudqV5Ly/gJg0f
03uQvBzLPQu+JRCYfVY0yGxxM35XmTSgTEKg5W7QSDrzr0UDobPp0Er2ywFQ3z5l
bk8Z4Qw5nXJ7CUmZaZXz+cyPwJyHebGqBwXF+PBdcAD11ohkUS5/6om7J+icmjvu
f/dQdOy4MTHsE81dmh9/D5/o64zXjLam+OtWRkoRFrbscWoclbYzZ0Pb0J3lcvUt
14lQNDBtcOb8D6nGy6egD/YQde9cAwIDAQABAoICAE6pGLL1PcCVpw9o6PodKpXZ
RTnWiphMXf+0i7iryi8zQWKPB+wIxez6gVze0s3bks2q9HQ06GziMK3zkGWxAjdB
ukQOmb2sNpvJt/YPZ+OcLSYUC/Q0uczvbQW6w8do/QYb8wqE78B6cT+c3uPW/RS9
D8976lHgCnjmvyLPUOiSVAAYPVhU2f2h5bY2iFumDVRUwjQQ3qK8GRRPpjWMHSkb
urQqKriMHi0E1mr9NeR0ihtjt1V6PRh+nCbXdLTx2nvFhwv2pm/eM+fJ5mOvS1tY
lSP70MOK0B99PkoUGjrRq7VNFM+JOfzV4vvH7zkTp7dAV9SLla/r02/Q2xvxQgTj
wwLenhjEPgyRp2R9y9XNYuxOEBgi9PBFeSyGe7hv+oImFCIZP5A0FNLPqJZ6Yjr3
yt4uS9RFCf9De+1khwl6RfRBv88vZDmS5SDiRpkJTTrRgm9wche85KCSR6hS8Qdl
Ny5KvOVIM6S0B9qT5vr+3HkY9SmAe++kT58bIQAyvBMwzIkz0x6zFPGM5fYTTveX
UvtmxIiTVs0KJqQyil19p2lcoOxpBLXZ82M73U3Xm3x69QCZGTuguw/sEtw1CJrc
VjJHPMMqK65wIwJgwuv8UF+uQ+J5yGAllgq985APWuOFwDDsnSmmTjAZTiVFxT8m
CkAzR0HMeHZ5Li9JPE25AoIBAQDWJvFI4KiyzfrtKdnzabAvOoNuhSKn407nLB15
fisPBua8CLIf3cFM+2JO/vzY35uj0yjTqLpqkyJag4GuaUmayUXV02M3GCjH8rsl
mX+P8y7yBy1doNGV+CFGEnmN3VpRmXM2LiSCbwX5/8JAqHlWK1wTmJdFtLWAiIUA
ViwAui2DaphbSKE3pC0mAFTRBcYda32i+cBxxpJRhWyjOhENT0fBo2lnFrUjKDzy
klwlXXG0UUXRK8ViEPLMz/5mkXTowdy62Z4HjT2btfldmDnaguaZ/RpZHxrTpjm7
Qu4CW9r2gDQqPBDz+O67GZOYQ+9Lff3vJmLi1LeA3wR0Zkz3AoIBAQDHJUDp/gGV
KBTP56vBu0l1yHErwBLEgk+pMb6IvH37Y/d/SNLDoC9fr3GpK/ZEfyJMoJB6UKMN
HEK5n3BdW4cx3rnY0HdvnkPK2mj1I9IecCRgETi1pGYnnF2bYZtkAmsmzpALV1z/
YzNGvRsf/eBD4mjmLK9poL1FbqZ8K6kput8hLH6hhUqic5KY56AdQuBIxNfgZs0y
a1pFKjAeNyvLeNYBoMuwjsHQ7Vx3HtPFuFG9D+8SRhqzUYl8N1NyYCDJPm07MdtU
AX6D8VPMFvETOuyIoPoi1ZZ9Hyw0gAf1iMPMgMn7wZF9wQkA1ipBtqmmbbKonvI2
DlccTN+veSJVAoIBAEQTMwZIrDfStJ5pfGgdQ61vu1IJrl+SKYXhBymUytlHB1fk
p8LrekQfcTvNYNEMG+yy9jp6W2//f58oSLQJsiUrMDDtto9P9b7B0W39Yoh+9IBp
ealWsukqbGFbBBrtr4Va8z3Y4zA3XL4A6F4ncBLNS8LK8eNts3i9bRITUn+Ur10k
KHR0HROT8+otlsivPjAh+FkzbVJ9ngueD0+/6KXDevr6GEp19HTNmLo/fl0+XCPG
5hu8/0zSOGyU/bjbKj/HSIR5IvwhkOELss5m0pU8oVN4GsUT1zJKl/WILCLB0lQj
ovF+EKGNk04Urk9r4Qitb2hzWmHi3sZvnnnl/zcCggEAE/R4r7nDINYWV8roHA6P
St0d8ftaJhTEtLiGVh9FJHac60U50V5wwM7Mvd3o3G482p7QO2FvJTYqvXzrfn9Y
abfeuYoSHb4nHuGJ2N6RBHnKO1Iec50Ym2mAu7wpHPldEVNrfadwayrejX0PhcIj
wcmjJ0VdAmGX9agjyJd7aPIPv7w8qCS6GNMp4mZ7VdNItCH9W8ARWbcGIZ4bmjt/
CPF/yEP7hSKY6z2NoWYWZF6W2jIJi7Q4orVN6IOGuhRF1MSLn33cc2t+6Ou6sN2v
pHSoFPzEc88hOEJyZIRbx8+/hvN0yeRYlthL9aiALXuHPmUJnPnoXWBMfEp7s5KY
zQKCAQEAuBqP0rJ4bdaCdnR9adJDe7ifjiq1EVo40rMfwm4HP91JoCqQJqZIiRnU
zc8GTLvXyYH12TOyNfLXfA5pl310Obk3ytJSCh6UDiQRFEzMstR5J0CAiUo5DZzR
0PDSzVl2JHM+kIYoc27t/f7z44m+E5k9Gp74PHkn1zf32VTsAuReF0I1wRIkJe86
T0Q4H7UyPIAfM/pvw01rVoIbQrFG/54bj0s2kQu4IOeKqo39MCmwc8taUvU/LuvL
NEAE2WsJyrVom6jJeee7fke+QrVgoM16vZG98ObTptqUkLeeGocpclJFJqbFSVL0
KyiIFYXpGT1XeTyWb9yDdzUUc0gXsQ==
-----END PRIVATE KEY-----


================================================
FILE: backend/src/main/resources/keys/public_key.pem
================================================
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAppdvfgBrZTIOMDJeHoLU
t5ZmKTZ/ApSuIBHUz0+VJBKikwsMT3UIvgMMFNDVm5rpna9KyXPZMvk0V8Je9wTn
rAw5ITjj1WUeu7YSnKGAAzXagpH/Y9D2FAN9oZK6xFGKLBGUsJs3JkeS0RpR2zwk
ZdawwooevWHxoTiT3QKSC8pluaJQmQfi93hJ3CXgmSHAqsREVvSUxhJyWWa6GNIm
aYSV7y4xrOpfbV2ibxEXK0+2Z7SkLJYnrqB64Pc4CNtBirWLN79cL/y43NS6DO+a
kJ+ihc+tRGub6zrsxt0Inpqr6mXrzZYSZirVst9fUZF3V4BT06c8Q0lVIb83LXH5
KF7UUA9ruhOZ+dzrDiSp6BM6HZXuMpg1w3J9OsljoFO2p948YjqgPh72toW+FN4F
9jgLAdueu88MKNtpcd0UvRaLLlAsld+Q9wCR48ul1/apLnaleS8v4CYNH9N7kLwc
yz0LviUQmH1WNMhscTN+V5k0oExCoOVu0Eg6869FA6Gz6dBK9ssBUN8+ZW5PGeEM
OZ1yewlJmWmV8/nMj8Cch3mxqgcFxfjwXXAA9daIZFEuf+qJuyfonJo77n/3UHTs
uDEx7BPNXZoffw+f6OuM14y2pvjrVkZKERa27HFqHJW2M2dD29Cd5XL1LdeJUDQw
bXDm/A+pxsunoA/2EHXvXAMCAwEAAQ==
-----END PUBLIC KEY-----


================================================
FILE: backend/src/main/resources/readme-graphiql.md
================================================
# Custom GraphiQL build

Inside `graphiql` is a custom graphiql build that is built from `petclinic-graphiql` and then copied
into `graphiql/`.

In a real project you maybe would not add the built version to source control but to add it to `classes/...` during
the build process.

Here I added the built graphiql code to Git because I don't want to force every to setup the JavaScript-based build for the
GraphiQL frontend. If you don't care about the JavaScript-parts of this example project (frontend/graphiql) you can just
run the backend and use(the customized) GraphiQL anyway.


================================================
FILE: backend/src/main/resources/testdata/owners.csv
================================================
FirstName,LastName,Street,City,PhoneNumber
John,Smith,123 Main Street,New York,+1 (555) 123-4567
Sophie,Dubois,456 Rue de la Paix,Paris,+33 6 12 34 56 78
Akira,Tanaka,789 Sakura Avenue,Tokyo,+81 90 1234 5678
Carlos,Rodriguez,202 Avenida de Mayo,Buenos Aires,+54 9 11 2345-6789
Anita,Müller,303 Hauptstraße,Berlin,+49 30 12345678
Ravi,Patel,404 MG Road,Mumbai,+91 98765 43210
Maria,da Silva,505 Rua Augusta,São Paulo,+55 11 98765-4321
Hans,Johansson,606 Drottninggatan,Stockholm,+46 70 123 45 67
Xi,Chen,707 Nanjing Road,Shanghai,+86 136 1234 5678
Alice,Johnson,808 Park Avenue,Los Angeles,+1 (555) 234-5678
François,Dupont,909 Champs-Élysées,Paris,+33 6 23 45 67 89
Yuki,Kato,101 Ueno Park,Tokyo,+81 90 2345 6789
Isabella,Gomez,303 Tango Street,Buenos Aires,+54 9 11 3456-7890
Lukas,Schmidt,404 Brandenburger Tor,Berlin,+49 30 23456789
Aarav,Sharma,505 Bollywood Lane,Mumbai,+91 98765 54321
Camila,Santos,606 Copacabana Beach,Rio de Janeiro,+55 21 98765-4321
Elsa,Larsson,707 Abba Street,Stockholm,+46 70 234 56 78
Lei,Wang,808 Forbidden City,Beijing,+86 136 2345 6789
Olivia,Miller,909 Ocean Drive,Miami,+1 (555) 345-6789
Antoine,Dufresne,101 Montmartre Avenue,Paris,+33 6 34 56 78 90
Takashi,Yamamoto,202 Ginza Street,Tokyo,+81 90 3456 7890
Sofia,Ivanova,303 Nevsky Prospect,St. Petersburg,+7 495 345-67-89
Diego,Lopez,404 Tango Avenue,Buenos Aires,+54 9 11 4567-8901
Lena,Müller,505 Oktoberfest Platz,Munich,+49 30 34567890
Amit,Kumar,606 Bollywood Boulevard,Mumbai,+91 98765 65432
Giovanna,Silva,707 Samba Street,Rio de Janeiro,+55 21 98765-5432
Emil,Eriksson,808 Viking Road,Gothenburg,+46 70 345 67 89
Wei,Zhang,909 Great Wall Street,Beijing,+86 136 3456 7890
Emma,Williams,101 Broadway,New York,+1 (555) 456-7890
Lucien,Martin,202 Louvre Lane,Paris,+33 6 45 67 89 01
Aiko,Takahashi,303 Mt. Fuji View,Tokyo,+81 90 4567 8901
Mateo,Garcia,505 Tango Terrace,Buenos Aires,+54 9 11 5678-9012
Lotte,Schneider,606 Black Forest Street,Freiburg,+49 30 45678901
Arjun,Singh,707 Bollywood Drive,Mumbai,+91 98765 76543
Juliana,Rodrigues,808 Ipanema Beach,Rio de Janeiro,+55 21 98765-6543
Oskar,Lindgren,909 Fika Lane,Stockholm,+46 70 456 78 90
Jing,Li,101 Forbidden Palace Avenue,Beijing,+86 136 4567 8901
Liam,Anderson,202 Golden Gate Street,San Francisco,+1 (555) 567-8901
Isabelle,Leclerc,303 Seine River View,Paris,+33 6 56 78 90 12
Yoshiro,Suzuki,404 Asakusa Street,Tokyo,+81 90 5678 9012
Polina,Petrovich,505 Hermitage Plaza,St. Petersburg,+7 495 567-89-01
Mariana,Fernandez,606 Tango Square,Buenos Aires,+54 9 11 6789-0123
Matteo,Weber,707 Alpine Avenue,Munich,+49 30 56789012
Anaya,Singh,808 Gateway Street,Mumbai,+91 98765 87654
Luca,Carvalho,909 Carnival Road,Rio de Janeiro,+55 21 98765-7654
Hugo,Nordström,101 Ice Hotel Lane,Kiruna,+46 70 567 89 01
Mei,Liu,202 Great Wall Lane,Beijing,+86 136 5678 9012


================================================
FILE: backend/src/main/resources/testdata/pets.csv
================================================
birthdate,name
1992-06-20,Bella
2002-10-29,Luna
2017-08-13,Charlie
2016-09-29,Lucy
1984-02-27,Cooper
1975-01-25,Max
2007-10-03,Bailey
1993-01-16,Daisy
2020-08-05,Sadie
2017-08-03,Lola
2015-06-21,Buddy
2001-03-10,Molly
2008-03-27,Stella
2009-11-22,Tucker
1973-01-02,Bear
2015-10-04,Zoey
1993-06-25,Duke
1991-09-28,Harley
2001-09-25,Maggie
1980-08-18,Jax
1993-02-01,Bentley
1990-07-21,Milo
1992-11-21,Oliver
2013-03-09,Riley
1978-07-27,Rocky
1998-02-05,Penny
1995-03-15,Sophie
2003-07-11,Chloe
2006-03-22,Jack
2002-01-30,Lily
1983-02-13,Nala
2017-09-04,Piper
1974-03-01,Zeus
2000-04-21,Ellie
2007-02-06,Winston
2008-12-11,Toby
2011-01-22,Loki
1992-06-12,Murphy
1985-01-15,Roxy
1977-06-20,Coco
2004-09-30,Rosie
2017-03-11,Teddy
2001-02-14,Ruby
1993-02-20,Gracie
1987-02-03,Leo
2005-03-07,Finn
1975-10-19,Scout
1983-04-25,Dexter
1997-10-20,Ollie
1993-01-24,Koda
1993-04-19,Diesel
2012-10-14,Moose
2016-11-24,Mia
1978-02-18,Marley
2001-06-30,Gus
2015-10-14,Hank
2006-09-02,Willow


================================================
FILE: backend/src/main/resources/testdata/visits.csv
================================================
Date,Treatment
2022-01-15,Vaccination Checkup
2022-03-27,Teeth Cleaning
2022-05-10,Orthopedic X-rays
2022-07-18,Blood Tests
2022-09-05,Abdominal Ultrasound
2022-11-11,Heartworm Test
2023-01-02,Dental Checkup
2023-03-14,Eye Examination
2023-05-26,Fecal Analysis
2023-08-01,Skin Biopsy
2023-10-09,Spaying/Neutering
2023-12-20,Microchipping
2024-02-01,Allergy Testing
2024-04-12,Joint Aspiration
2024-06-25,Ear Examination
2024-08-08,Blood Pressure Measurement
2024-10-19,Cancer Screening
2024-12-03,Glaucoma Testing
2022-02-18,Flea and Tick Prevention
2022-04-30,Deworming
2022-06-15,CT Scan
2022-08-23,MRI
2022-10-05,EKG
2022-12-11,Nutritional Counseling
2023-02-22,Joint Aspiration
2023-04-06,Cancer Screening
2023-06-18,Glaucoma Testing
2023-08-30,Blood Clotting Profile
2023-11-06,Orthopedic Examination
2024-01-19,Fecal Analysis
2024-03-02,Heartworm Test
2024-05-15,Skin Biopsy
2024-07-27,Spaying/Neutering
2024-10-02,Orthopedic Examination
2024-12-14,Dental Checkup
2022-01-27,Ear Examination
2022-04-09,Blood Pressure Measurement
2022-06-22,Allergy Testing
2022-08-05,CT Scan
2022-10-17,MRI
2022-12-28,EKG
2023-03-10,Nutritional Counseling
2023-05-23,Joint Aspiration
2023-08-01,Cancer Screening
2023-10-13,Glaucoma Testing
2023-12-24,Blood Clotting Profile
2024-02-03,Orthopedic Examination
2024-04-16,Fecal Analysis
2024-06-29,Heartworm Test
2024-09-11,Skin Biopsy
2024-11-23,Spaying/Neutering
2022-02-21,Microchipping
2022-05-06,Allergy Testing
2022-07-18,Joint Aspiration
2022-09-29,Ear Examination
2022-12-11,Blood Pressure Measurement
2023-02-01,CT Scan
2023-04-15,MRI
2023-06-27,EKG
2023-09-10,Nutritional Counseling
2023-11-22,Joint Aspiration
2024-02-06,Cancer Screening
2024-05-19,Glaucoma Testing
2024-07-31,Blood Clotting Profile
2024-10-11,Orthopedic Examination
2022-02-27,Dental Checkup
2022-05-11,Fecal Analysis
2022-07-24,Heartworm Test
2022-10-05,Skin Biopsy
2022-12-16,Spaying/Neutering
2023-02-26,Ear Examination
2023-05-09,Blood Pressure Measurement
2023-07-22,Allergy Testing
2023-10-03,CT Scan
2023-12-15,MRI
2024-02-26,EKG
2024-05-09,Nutritional Counseling
2024-07-22,Joint Aspiration
2024-10-03,Cancer Screening
2024-12-15,Glaucoma Testing
2022-04-02,Blood Clotting Profile
2022-06-15,Orthopedic Examination
2022-08-28,Dental Checkup
2022-11-09,Fecal Analysis
2023-01-21,Heartworm Test
2023-04-05,Skin Biopsy
2023-06-17,Spaying/Neutering
2023-08-30,Ear Examination
2023-11-11,Blood Pressure Measurement
2024-02-03,Allergy Testing
2024-04-18,CT Scan
2024-07-01,MRI
2024-09-14,EKG
2024-11-26,Nutritional Counseling
2022-01-30,Joint Aspiration
2022-04-14,Cancer Screening
2022-06-26,Glaucoma Testing
2022-09-08,Blood Clotting Profile
2022-11-21,Orthopedic Examination
2023-02-02,Dental Checkup
2023-04-16,Fecal Analysis
2023-06-29,Heartworm Test
2023-09-10,Skin Biopsy
2023-11-23,Spaying/Neutering
2024-02-05,Ear Examination
2024-04-18,Blood Pressure Measurement
2024-06-29,Allergy Testing
2024-09-11,CT Scan
2024-11-23,MRI


================================================
FILE: backend/src/main/resources/ui/graphiql/assets/Range-52ddcb6a.js
================================================
class h{constructor(t,r){this.containsPosition=e=>this.start.line===e.line?this.start.character<=e.character:this.end.line===e.line?this.end.character>=e.character:this.start.line<=e.line&&this.end.line>=e.line,this.start=t,this.end=r}setStart(t,r){this.start=new s(t,r)}setEnd(t,r){this.end=new s(t,r)}}class s{constructor(t,r){this.lessThanOrEqualTo=e=>this.line<e.line||this.line===e.line&&this.character<=e.character,this.line=t,this.character=r}setLine(t){this.line=t}setCharacter(t){this.character=t}}export{s as P,h as R};


================================================
FILE: backend/src/main/resources/ui/graphiql/assets/SchemaReference.es-0ccab37b.js
================================================
import{s as b}from"./forEachState.es-b2033c2b.js";import{l,X as k,F,W as h,Y as S,Z as g,_ as D,$ as T,c as Q}from"./index-27dc12ba.js";var j=Object.defineProperty,r=(t,n)=>j(t,"name",{value:n,configurable:!0});function V(t,n){const e={schema:t,type:null,parentType:null,inputType:null,directiveDef:null,fieldDef:null,argDef:null,argDefs:null,objectFieldDefs:null};return b(n,a=>{var u,p;switch(a.kind){case"Query":case"ShortQuery":e.type=t.getQueryType();break;case"Mutation":e.type=t.getMutationType();break;case"Subscription":e.type=t.getSubscriptionType();break;case"InlineFragment":case"FragmentDefinition":a.type&&(e.type=t.getType(a.type));break;case"Field":case"AliasedField":e.fieldDef=e.type&&a.name?c(t,e.parentType,a.name):null,e.type=(u=e.fieldDef)===null||u===void 0?void 0:u.type;break;case"SelectionSet":e.parentType=e.type?l(e.type):null;break;case"Directive":e.directiveDef=a.name?t.getDirective(a.name):null;break;case"Arguments":const s=a.prevState?a.prevState.kind==="Field"?e.fieldDef:a.prevState.kind==="Directive"?e.directiveDef:a.prevState.kind==="AliasedField"?a.prevState.name&&c(t,e.parentType,a.prevState.name):null:null;e.argDefs=s?s.args:null;break;case"Argument":if(e.argDef=null,e.argDefs){for(let i=0;i<e.argDefs.length;i++)if(e.argDefs[i].name===a.name){e.argDef=e.argDefs[i];break}}e.inputType=(p=e.argDef)===null||p===void 0?void 0:p.type;break;case"EnumValue":const y=e.inputType?l(e.inputType):null;e.enumValue=y instanceof S?v(y.getValues(),i=>i.value===a.name):null;break;case"ListValue":const d=e.inputType?F(e.inputType):null;e.inputType=d instanceof h?d.ofType:null;break;case"ObjectValue":const m=e.inputType?l(e.inputType):null;e.objectFieldDefs=m instanceof k?m.getFields():null;break;case"ObjectField":const o=a.name&&e.objectFieldDefs?e.objectFieldDefs[a.name]:null;e.inputType=o==null?void 0:o.type;break;case"NamedType":e.type=a.name?t.getType(a.name):null;break}}),e}r(V,"getTypeInfo");function c(t,n,e){if(e===g.name&&t.getQueryType()===n)return g;if(e===D.name&&t.getQueryType()===n)return D;if(e===T.name&&Q(n))return T;if(n&&n.getFields)return n.getFields()[e]}r(c,"getFieldDef");function v(t,n){for(let e=0;e<t.length;e++)if(n(t[e]))return t[e]}r(v,"find");function A(t){return{kind:"Field",schema:t.schema,field:t.fieldDef,type:f(t.fieldDef)?null:t.parentType}}r(A,"getFieldReference");function L(t){return{kind:"Directive",schema:t.schema,directive:t.directiveDef}}r(L,"getDirectiveReference");function M(t){return t.directiveDef?{kind:"Argument",schema:t.schema,argument:t.argDef,directive:t.directiveDef}:{kind:"Argument",schema:t.schema,argument:t.argDef,field:t.fieldDef,type:f(t.fieldDef)?null:t.parentType}}r(M,"getArgumentReference");function R(t){return{kind:"EnumValue",value:t.enumValue||void 0,type:t.inputType?l(t.inputType):void 0}}r(R,"getEnumValueReference");function E(t,n){return{kind:"Type",schema:t.schema,type:n||t.type}}r(E,"getTypeReference");function f(t){return t.name.slice(0,2)==="__"}r(f,"isMetaField");export{V as E,R as G,A as L,E as O,L as R,M as _};


================================================
FILE: backend/src/main/resources/ui/graphiql/assets/brace-fold.es-f2e3735d.js
================================================
import{c as I,h as L}from"./codemirror.es2-5884f31a.js";var S=Object.defineProperty,b=(k,T)=>S(k,"name",{value:T,configurable:!0});function A(k,T){for(var r=0;r<T.length;r++){const s=T[r];if(typeof s!="string"&&!Array.isArray(s)){for(const e in s)if(e!=="default"&&!(e in k)){const i=Object.getOwnPropertyDescriptor(s,e);i&&Object.defineProperty(k,e,i.get?i:{enumerable:!0,get:()=>s[e]})}}}return Object.freeze(Object.defineProperty(k,Symbol.toStringTag,{value:"Module"}))}b(A,"_mergeNamespaces");var w={exports:{}};(function(k,T){(function(r){r(I())})(function(r){function s(e){return function(i,o){var t=o.line,u=i.getLine(t);function c(a){for(var l,p=o.ch,v=0;;){var h=p<=0?-1:u.lastIndexOf(a[0],p-1);if(h==-1){if(v==1)break;v=1,p=u.length;continue}if(v==1&&h<o.ch)break;if(l=i.getTokenTypeAt(r.Pos(t,h+1)),!/^(comment|string)/.test(l))return{ch:h+1,tokenType:l,pair:a};p=h-1}}b(c,"findOpening");function d(a){var l=1,p=i.lastLine(),v,h=a.ch,_;r:for(var P=t;P<=p;++P)for(var O=i.getLine(P),m=P==t?h:0;;){var x=O.indexOf(a.pair[0],m),j=O.indexOf(a.pair[1],m);if(x<0&&(x=O.length),j<0&&(j=O.length),m=Math.min(x,j),m==O.length)break;if(i.getTokenTypeAt(r.Pos(P,m+1))==a.tokenType){if(m==x)++l;else if(!--l){v=P,_=m;break r}}++m}return v==null||t==v?null:{from:r.Pos(t,h),to:r.Pos(v,_)}}b(d,"findRange");for(var f=[],n=0;n<e.length;n++){var g=c(e[n]);g&&f.push(g)}f.sort(function(a,l){return a.ch-l.ch});for(var n=0;n<f.length;n++){var y=d(f[n]);if(y)return y}return null}}b(s,"bracketFolding"),r.registerHelper("fold","brace",s([["{","}"],["[","]"]])),r.registerHelper("fold","brace-paren",s([["{","}"],["[","]"],["(",")"]])),r.registerHelper("fold","import",function(e,i){function o(n){if(n<e.firstLine()||n>e.lastLine())return null;var g=e.getTokenAt(r.Pos(n,1));if(/\S/.test(g.string)||(g=e.getTokenAt(r.Pos(n,g.end+1))),g.type!="keyword"||g.string!="import")return null;for(var y=n,a=Math.min(e.lastLine(),n+10);y<=a;++y){var l=e.getLine(y),p=l.indexOf(";");if(p!=-1)return{startCh:g.end,end:r.Pos(y,p)}}}b(o,"hasImport");var t=i.line,u=o(t),c;if(!u||o(t-1)||(c=o(t-2))&&c.end.line==t-1)return null;for(var d=u.end;;){var f=o(d.line+1);if(f==null)break;d=f.end}return{from:e.clipPos(r.Pos(t,u.startCh+1)),to:d}}),r.registerHelper("fold","include",function(e,i){function o(f){if(f<e.firstLine()||f>e.lastLine())return null;var n=e.getTokenAt(r.Pos(f,1));if(/\S/.test(n.string)||(n=e.getTokenAt(r.Pos(f,n.end+1))),n.type=="meta"&&n.string.slice(0,8)=="#include")return n.start+8}b(o,"hasInclude");var t=i.line,u=o(t);if(u==null||o(t-1)!=null)return null;for(var c=t;;){var d=o(c+1);if(d==null)break;++c}return{from:r.Pos(t,u+1),to:e.clipPos(r.Pos(c))}})})})();var H=w.exports;const M=L(H),D=A({__proto__:null,default:M},[H]);export{D as b};


================================================
FILE: backend/src/main/resources/ui/graphiql/assets/closebrackets.es-e969742b.js
================================================
import{c as N,h as q}from"./codemirror.es2-5884f31a.js";var F=Object.defineProperty,f=(P,k)=>F(P,"name",{value:k,configurable:!0});function z(P,k){for(var t=0;t<k.length;t++){const v=k[t];if(typeof v!="string"&&!Array.isArray(v)){for(const o in v)if(o!=="default"&&!(o in P)){const h=Object.getOwnPropertyDescriptor(v,o);h&&Object.defineProperty(P,o,h.get?h:{enumerable:!0,get:()=>v[o]})}}}return Object.freeze(Object.defineProperty(P,Symbol.toStringTag,{value:"Module"}))}f(z,"_mergeNamespaces");var J={exports:{}};(function(P,k){(function(t){t(N())})(function(t){var v={pairs:`()[]{}''""`,closeBefore:`)]}'":;>`,triples:"",explode:"[]{}"},o=t.Pos;t.defineOption("autoCloseBrackets",!1,function(e,n,r){r&&r!=t.Init&&(e.removeKeyMap(B),e.state.closeBrackets=null),n&&(T(h(n,"pairs")),e.state.closeBrackets=n,e.addKeyMap(B))});function h(e,n){return n=="pairs"&&typeof e=="string"?e:typeof e=="object"&&e[n]!=null?e[n]:v[n]}f(h,"getOption");var B={Backspace:E,Enter:M};function T(e){for(var n=0;n<e.length;n++){var r=e.charAt(n),a="'"+r+"'";B[a]||(B[a]=w(r))}}f(T,"ensureBound"),T(v.pairs+"`");function w(e){return function(n){return I(n,e)}}f(w,"handler");function A(e){var n=e.state.closeBrackets;if(!n||n.override)return n;var r=e.getModeAt(e.getCursor());return r.closeBrackets||n}f(A,"getConfig");function E(e){var n=A(e);if(!n||e.getOption("disableInput"))return t.Pass;for(var r=h(n,"pairs"),a=e.listSelections(),i=0;i<a.length;i++){if(!a[i].empty())return t.Pass;var l=x(e,a[i].head);if(!l||r.indexOf(l)%2!=0)return t.Pass}for(var i=a.length-1;i>=0;i--){var c=a[i].head;e.replaceRange("",o(c.line,c.ch-1),o(c.line,c.ch+1),"+delete")}}f(E,"handleBackspace");function M(e){var n=A(e),r=n&&h(n,"explode");if(!r||e.getOption("disableInput"))return t.Pass;for(var a=e.listSelections(),i=0;i<a.length;i++){if(!a[i].empty())return t.Pass;var l=x(e,a[i].head);if(!l||r.indexOf(l)%2!=0)return t.Pass}e.operation(function(){var c=e.lineSeparator()||`
`;e.replaceSelection(c+c,null),S(e,-1),a=e.listSelections();for(var u=0;u<a.length;u++){var b=a[u].head.line;e.indentLine(b,null,!0),e.indentLine(b+1,null,!0)}})}f(M,"handleEnter");function S(e,n){for(var r=[],a=e.listSelections(),i=0,l=0;l<a.length;l++){var c=a[l];c.head==e.getCursor()&&(i=l);var u=c.head.ch||n>0?{line:c.head.line,ch:c.head.ch+n}:{line:c.head.line-1};r.push({anchor:u,head:u})}e.setSelections(r,i)}f(S,"moveSel");function R(e){var n=t.cmpPos(e.anchor,e.head)>0;return{anchor:new o(e.anchor.line,e.anchor.ch+(n?-1:1)),head:new o(e.head.line,e.head.ch+(n?1:-1))}}f(R,"contractSelection");function I(e,n){var r=A(e);if(!r||e.getOption("disableInput"))return t.Pass;var a=h(r,"pairs"),i=a.indexOf(n);if(i==-1)return t.Pass;for(var l=h(r,"closeBefore"),c=h(r,"triples"),u=a.charAt(i+1)==n,b=e.listSelections(),C=i%2==0,y,_=0;_<b.length;_++){var L=b[_],s=L.head,d,m=e.getRange(s,o(s.line,s.ch+1));if(C&&!L.empty())d="surround";else if((u||!C)&&m==n)u&&K(e,s)?d="both":c.indexOf(n)>=0&&e.getRange(s,o(s.line,s.ch+3))==n+n+n?d="skipThree":d="skip";else if(u&&s.ch>1&&c.indexOf(n)>=0&&e.getRange(o(s.line,s.ch-2),s)==n+n){if(s.ch>2&&/\bstring/.test(e.getTokenTypeAt(o(s.line,s.ch-2))))return t.Pass;d="addFour"}else if(u){var W=s.ch==0?" ":e.getRange(o(s.line,s.ch-1),s);if(!t.isWordChar(m)&&W!=n&&!t.isWordChar(W))d="both";else return t.Pass}else if(C&&(m.length===0||/\s/.test(m)||l.indexOf(m)>-1))d="both";else return t.Pass;if(!y)y=d;else if(y!=d)return t.Pass}var O=i%2?a.charAt(i-1):n,j=i%2?n:a.charAt(i+1);e.operation(function(){if(y=="skip")S(e,1);else if(y=="skipThree")S(e,3);else if(y=="surround"){for(var p=e.getSelections(),g=0;g<p.length;g++)p[g]=O+p[g]+j;e.replaceSelections(p,"around"),p=e.listSelections().slice();for(var g=0;g<p.length;g++)p[g]=R(p[g]);e.setSelections(p)}else y=="both"?(e.replaceSelection(O+j,null),e.triggerElectric(O+j),S(e,-1)):y=="addFo
Download .txt
gitextract_pbnw42or/

├── .gitattributes
├── .github/
│   └── workflows/
│       └── build-app.yml
├── .gitignore
├── .gitpod.Dockerfile
├── .gitpod.yml
├── .mvn/
│   └── wrapper/
│       ├── MavenWrapperDownloader.java
│       ├── maven-wrapper.jar
│       └── maven-wrapper.properties
├── .run/
│   └── Frontend.run.xml
├── LICENCE
├── backend/
│   ├── .editorconfig
│   ├── .gitignore
│   ├── pom.xml
│   ├── sample-queries.graphql
│   └── src/
│       ├── main/
│       │   ├── java/
│       │   │   └── org/
│       │   │       └── springframework/
│       │   │           └── samples/
│       │   │               └── petclinic/
│       │   │                   ├── FakeDataSqlCreator.java
│       │   │                   ├── PetClinicApplication.java
│       │   │                   ├── auth/
│       │   │                   │   ├── Role.java
│       │   │                   │   ├── User.java
│       │   │                   │   └── UserRepository.java
│       │   │                   ├── graphql/
│       │   │                   │   ├── AbstractOwnerInput.java
│       │   │                   │   ├── AbstractOwnerPayload.java
│       │   │                   │   ├── AbstractPetInput.java
│       │   │                   │   ├── AbstractPetPayload.java
│       │   │                   │   ├── AddOwnerInput.java
│       │   │                   │   ├── AddOwnerPayload.java
│       │   │                   │   ├── AddPetInput.java
│       │   │                   │   ├── AddPetPayload.java
│       │   │                   │   ├── AddSpecialtyPayload.java
│       │   │                   │   ├── AddVetErrorPayload.java
│       │   │                   │   ├── AddVetInput.java
│       │   │                   │   ├── AddVetPayload.java
│       │   │                   │   ├── AddVetSuccessPayload.java
│       │   │                   │   ├── AddVisitInput.java
│       │   │                   │   ├── AddVisitPayload.java
│       │   │                   │   ├── AuthController.java
│       │   │                   │   ├── OwnerController.java
│       │   │                   │   ├── PageInfo.java
│       │   │                   │   ├── PetController.java
│       │   │                   │   ├── PetTypeController.java
│       │   │                   │   ├── RemoveSpecialtyPayload.java
│       │   │                   │   ├── SpecialtyController.java
│       │   │                   │   ├── UpdateOwnerInput.java
│       │   │                   │   ├── UpdateOwnerPayload.java
│       │   │                   │   ├── UpdatePetInput.java
│       │   │                   │   ├── UpdatePetPayload.java
│       │   │                   │   ├── UpdateSpecialtyInput.java
│       │   │                   │   ├── UpdateSpecialtyPayload.java
│       │   │                   │   ├── VetController.java
│       │   │                   │   ├── VisitConnection.java
│       │   │                   │   ├── VisitController.java
│       │   │                   │   ├── VisitPublisher.java
│       │   │                   │   └── runtime/
│       │   │                   │       ├── DateCoercing.java
│       │   │                   │       ├── GraphiQlConfiguration.java
│       │   │                   │       └── PetClinicRuntimeWiringConfiguration.java
│       │   │                   ├── model/
│       │   │                   │   ├── BaseEntity.java
│       │   │                   │   ├── InvalidVetDataException.java
│       │   │                   │   ├── NamedEntity.java
│       │   │                   │   ├── OrderField.java
│       │   │                   │   ├── Owner.java
│       │   │                   │   ├── OwnerFilter.java
│       │   │                   │   ├── OwnerOrder.java
│       │   │                   │   ├── OwnerService.java
│       │   │                   │   ├── Person.java
│       │   │                   │   ├── Pet.java
│       │   │                   │   ├── PetService.java
│       │   │                   │   ├── PetType.java
│       │   │                   │   ├── PetValidator.java
│       │   │                   │   ├── Specialty.java
│       │   │                   │   ├── SpecialtyService.java
│       │   │                   │   ├── Vet.java
│       │   │                   │   ├── VetService.java
│       │   │                   │   ├── Vets.java
│       │   │                   │   ├── Visit.java
│       │   │                   │   ├── VisitCreatedEvent.java
│       │   │                   │   ├── VisitService.java
│       │   │                   │   └── package-info.java
│       │   │                   ├── repository/
│       │   │                   │   ├── OwnerRepository.java
│       │   │                   │   ├── PetRepository.java
│       │   │                   │   ├── PetTypeRepository.java
│       │   │                   │   ├── SpecialtyRepository.java
│       │   │                   │   ├── VetRepository.java
│       │   │                   │   └── VisitRepository.java
│       │   │                   ├── security/
│       │   │                   │   ├── JwtTokenService.java
│       │   │                   │   ├── LoginController.java
│       │   │                   │   ├── LoginRequest.java
│       │   │                   │   ├── LoginResponse.java
│       │   │                   │   ├── NeverExpiringTokenGenerator.java
│       │   │                   │   ├── RSAKeyProvider.java
│       │   │                   │   └── SecurityConfig.java
│       │   │                   └── util/
│       │   │                       └── EntityUtils.java
│       │   └── resources/
│       │       ├── application.properties
│       │       ├── db/
│       │       │   └── migration/
│       │       │       ├── V100_1__create_schema.sql
│       │       │       └── V100_2__fill_db.sql
│       │       ├── graphql/
│       │       │   └── petclinic.graphqls
│       │       ├── keys/
│       │       │   ├── private_key.pem
│       │       │   └── public_key.pem
│       │       ├── readme-graphiql.md
│       │       ├── testdata/
│       │       │   ├── owners.csv
│       │       │   ├── pets.csv
│       │       │   └── visits.csv
│       │       └── ui/
│       │           └── graphiql/
│       │               ├── assets/
│       │               │   ├── Range-52ddcb6a.js
│       │               │   ├── SchemaReference.es-0ccab37b.js
│       │               │   ├── brace-fold.es-f2e3735d.js
│       │               │   ├── closebrackets.es-e969742b.js
│       │               │   ├── codemirror.es-52e8b92d.js
│       │               │   ├── codemirror.es2-5884f31a.js
│       │               │   ├── comment.es-39699bae.js
│       │               │   ├── dialog.es-b2776d29.js
│       │               │   ├── foldgutter.es-b6cee46a.js
│       │               │   ├── forEachState.es-b2033c2b.js
│       │               │   ├── hint.es-1418191b.js
│       │               │   ├── hint.es2-598d3bfe.js
│       │               │   ├── index-27dc12ba.js
│       │               │   ├── index-928ba5be.css
│       │               │   ├── info-addon.es-c9b2027b.js
│       │               │   ├── info.es-3175bfab.js
│       │               │   ├── javascript.es-3c6957c5.js
│       │               │   ├── jump-to-line.es-3afd5e0a.js
│       │               │   ├── jump.es-7b275cf1.js
│       │               │   ├── lint.es-fe7166bb.js
│       │               │   ├── lint.es2-97c4a6f4.js
│       │               │   ├── lint.es3-bcaf3718.js
│       │               │   ├── matchbrackets.es-97d2e827.js
│       │               │   ├── matchbrackets.es2-f53f57e6.js
│       │               │   ├── mode-indent.es-057a4f6a.js
│       │               │   ├── mode.es-8c5bcfbd.js
│       │               │   ├── mode.es2-8a6e8f8c.js
│       │               │   ├── mode.es3-fa110728.js
│       │               │   ├── search.es-2e392dd0.js
│       │               │   ├── searchcursor.es-b1a352a2.js
│       │               │   ├── searchcursor.es2-cbfe7cae.js
│       │               │   ├── show-hint.es-b981493e.js
│       │               │   └── sublime.es-e2a3eb60.js
│       │               └── index.html
│       └── test/
│           ├── java/
│           │   └── org/
│           │       └── springframework/
│           │           └── samples/
│           │               └── petclinic/
│           │                   ├── PetClinicTestDbConfiguration.java
│           │                   ├── graphql/
│           │                   │   ├── AbstractClinicGraphqlTests.java
│           │                   │   ├── AuthControllerTests.java
│           │                   │   ├── GraphQlTokenProvider.java
│           │                   │   ├── OwnerControllerTests.java
│           │                   │   ├── PetControllerTests.java
│           │                   │   ├── PetTypeControllerTests.java
│           │                   │   ├── SpecialtyControllerTests.java
│           │                   │   ├── VetControllerTests.java
│           │                   │   ├── VisitControllerTests.java
│           │                   │   └── VisitSubscriptionTest.java
│           │                   ├── model/
│           │                   │   └── ValidatorTests.java
│           │                   └── repository/
│           │                       ├── ApplicationTestConfig.java
│           │                       └── ClinicRepositorySpringDataJpaTests.java
│           └── resources/
│               └── graphql-test/
│                   ├── addPetMutation.graphql
│                   ├── addVetMutation.graphql
│                   ├── addVisitMutation.graphql
│                   ├── addVisitMutationWithVariables.graphql
│                   ├── meQuery.graphql
│                   └── updatePetMutation.graphql
├── build-local.sh
├── docker-compose-petclinic.yml
├── docker-compose.yml
├── e2e-tests/
│   ├── .github/
│   │   └── workflows/
│   │       └── playwright.yml
│   ├── .gitignore
│   ├── .prettierrc
│   ├── package.json
│   ├── playwright.config.ts
│   ├── pom.xml
│   └── tests/
│       ├── graphiql.spec.ts
│       ├── owner-detail.spec.ts
│       ├── owner-search-page.spec.ts
│       ├── petclinic.fixtures.ts
│       └── vets.spec.ts
├── frontend/
│   ├── .eslintrc.cjs
│   ├── .gitignore
│   ├── .prettierignore
│   ├── Dockerfile
│   ├── README.md
│   ├── codegen.ts
│   ├── docker/
│   │   └── nginx.conf
│   ├── index.html
│   ├── package.json
│   ├── pom.xml
│   ├── postcss.config.js
│   ├── prettier.config.cjs
│   ├── src/
│   │   ├── App.css
│   │   ├── App.tsx
│   │   ├── NotFoundPage.tsx
│   │   ├── WelcomePage.tsx
│   │   ├── assets/
│   │   │   └── readme.md
│   │   ├── components/
│   │   │   ├── Button.tsx
│   │   │   ├── ButtonBar.tsx
│   │   │   ├── Card.tsx
│   │   │   ├── Heading.tsx
│   │   │   ├── Input.tsx
│   │   │   ├── Label.tsx
│   │   │   ├── Link.tsx
│   │   │   ├── Nav.tsx
│   │   │   ├── PageHeader.tsx
│   │   │   ├── PageLayout.tsx
│   │   │   ├── Section.tsx
│   │   │   ├── Select.tsx
│   │   │   └── Table.tsx
│   │   ├── create-graphql-client.ts
│   │   ├── fonts/
│   │   │   ├── README.txt
│   │   │   ├── generator_config.txt
│   │   │   ├── metropolis-bold-demo.html
│   │   │   ├── metropolis-extrabold-demo.html
│   │   │   ├── metropolis-regular-demo.html
│   │   │   └── specimen_files/
│   │   │       ├── grid_12-825-55-15.css
│   │   │       └── specimen_stylesheet.css
│   │   ├── fonts.css
│   │   ├── graphql-types.txt
│   │   ├── index.css
│   │   ├── login/
│   │   │   ├── AuthTokenProvider.tsx
│   │   │   ├── LoginPage.tsx
│   │   │   └── MeQuery.graphql
│   │   ├── main.tsx
│   │   ├── owners/
│   │   │   ├── AddVisit.graphql
│   │   │   ├── AllVetNames.graphql
│   │   │   ├── FindOwnerByLastName.graphql
│   │   │   ├── FindOwnerWithPetsAndVisits.graphql
│   │   │   ├── NewVisitForm.tsx
│   │   │   ├── NewVisitPanel.tsx
│   │   │   ├── OnNewVisit.graphql
│   │   │   ├── OwnerFields.graphql
│   │   │   ├── OwnerPage.tsx
│   │   │   ├── OwnerSearchPage.tsx
│   │   │   ├── Visit.fragment.graphql
│   │   │   └── VisitWithVet.fragment.graphql
│   │   ├── urls.ts
│   │   ├── use-current-user-fullname.tsx
│   │   ├── use-logout.ts
│   │   ├── utils.ts
│   │   ├── vets/
│   │   │   ├── AddVet.graphql
│   │   │   ├── AddVetForm.tsx
│   │   │   ├── AllSpecialties.graphql
│   │   │   ├── AllVets.graphql
│   │   │   ├── VetAndVisits.graphql
│   │   │   ├── VetsOverview.tsx
│   │   │   └── VetsPage.tsx
│   │   └── vite-env.d.ts
│   ├── tailwind.config.js
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   └── vite.config.ts
├── graphql.config.yml
├── login.http
├── mvnw
├── mvnw.cmd
├── petclinic-graphiql/
│   ├── .eslintrc.cjs
│   ├── .gitignore
│   ├── README.md
│   ├── index.html
│   ├── package.json
│   ├── pom.xml
│   ├── src/
│   │   ├── App.tsx
│   │   ├── LoginForm.tsx
│   │   ├── PetClinicGraphiql.tsx
│   │   ├── index.css
│   │   ├── main.tsx
│   │   ├── urls.ts
│   │   └── vite-env.d.ts
│   ├── tsconfig.json
│   ├── tsconfig.node.json
│   └── vite.config.ts
├── pom.xml
├── readme.md
└── talk/
    ├── curl-demo.sh
    ├── graphql-introduction.html
    ├── lib/
    │   ├── jquery-2.2.4.js
    │   └── js/
    │       └── line-numbers.js
    └── reveal.js/
        ├── .gitignore
        ├── .travis.yml
        ├── CONTRIBUTING.md
        ├── Gruntfile.js
        ├── LICENSE
        ├── README.md
        ├── bower.json
        ├── css/
        │   ├── print/
        │   │   ├── paper.css
        │   │   └── pdf.css
        │   ├── reveal.css
        │   ├── reveal.scss
        │   └── theme/
        │       ├── README.md
        │       ├── beige.css
        │       ├── black.css
        │       ├── blood.css
        │       ├── fonts/
        │       │   └── google-fonts.css
        │       ├── league.css
        │       ├── moon.css
        │       ├── night.css
        │       ├── serif.css
        │       ├── simple.css
        │       ├── sky.css
        │       ├── solarized.css
        │       ├── source/
        │       │   ├── beige.scss
        │       │   ├── black.scss
        │       │   ├── blood.scss
        │       │   ├── league.scss
        │       │   ├── moon.scss
        │       │   ├── night.scss
        │       │   ├── serif.scss
        │       │   ├── simple.scss
        │       │   ├── sky.scss
        │       │   ├── solarized.scss
        │       │   └── white.scss
        │       ├── template/
        │       │   ├── mixins.scss
        │       │   ├── settings.scss
        │       │   └── theme.scss
        │       └── white.css
        ├── index.html
        ├── js/
        │   └── reveal.js
        ├── lib/
        │   ├── css/
        │   │   └── zenburn.css
        │   ├── font/
        │   │   ├── league-gothic/
        │   │   │   ├── LICENSE
        │   │   │   └── league-gothic.css
        │   │   └── source-sans-pro/
        │   │       ├── LICENSE
        │   │       └── source-sans-pro.css
        │   └── js/
        │       ├── classList.js
        │       └── html5shiv.js
        ├── package.json
        ├── plugin/
        │   ├── highlight/
        │   │   └── highlight.js
        │   ├── markdown/
        │   │   ├── example.html
        │   │   ├── example.md
        │   │   ├── markdown.js
        │   │   └── marked.js
        │   ├── math/
        │   │   └── math.js
        │   ├── multiplex/
        │   │   ├── client.js
        │   │   ├── index.js
        │   │   └── master.js
        │   ├── notes/
        │   │   ├── notes.html
        │   │   └── notes.js
        │   ├── notes-server/
        │   │   ├── client.js
        │   │   ├── index.js
        │   │   └── notes.html
        │   ├── print-pdf/
        │   │   └── print-pdf.js
        │   ├── search/
        │   │   └── search.js
        │   └── zoom-js/
        │       └── zoom.js
        └── test/
            ├── examples/
            │   ├── barebones.html
            │   ├── embedded-media.html
            │   ├── math.html
            │   ├── slide-backgrounds.html
            │   └── slide-transitions.html
            ├── qunit-1.12.0.css
            ├── qunit-1.12.0.js
            ├── test-markdown-element-attributes.html
            ├── test-markdown-element-attributes.js
            ├── test-markdown-slide-attributes.html
            ├── test-markdown-slide-attributes.js
            ├── test-markdown.html
            ├── test-markdown.js
            ├── test-pdf.html
            ├── test-pdf.js
            ├── test.html
            └── test.js
Download .txt
Showing preview only (270K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2916 symbols across 161 files)

FILE: .mvn/wrapper/MavenWrapperDownloader.java
  class MavenWrapperDownloader (line 21) | public class MavenWrapperDownloader {
    method main (line 48) | public static void main(String args[]) {
    method downloadFileFromURL (line 97) | private static void downloadFileFromURL(String urlString, File destina...

FILE: backend/src/main/java/org/springframework/samples/petclinic/FakeDataSqlCreator.java
  class FakeDataSqlCreator (line 18) | public class FakeDataSqlCreator {
    method main (line 26) | public static void main(String[] args) throws Exception {
    method importAll (line 30) | private void importAll() throws Exception {
    method importPets (line 38) | private List<Integer> importPets() throws Exception {
    method importVisits (line 52) | private void importVisits() throws Exception {
    method importOwners (line 69) | private List<Integer> importOwners() throws Exception {
    method asLocalDate (line 81) | private static LocalDate asLocalDate(String date) throws Exception {
    class CycleIterator (line 86) | static class CycleIterator<E> {
      method CycleIterator (line 90) | public CycleIterator(List<E> elements) {
      method reset (line 94) | void reset() {
      method next (line 98) | public E next() {
    method readCsv (line 107) | private <E> List<E> readCsv(String name, CsvLineConsumer<E> consumer) ...
    type CsvLineConsumer (line 127) | @FunctionalInterface
      method consume (line 129) | E consume(int lineNo, String[] parts) throws Exception;

FILE: backend/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java
  class PetClinicApplication (line 9) | @SpringBootApplication
    method main (line 12) | public static void main(String[] args) {
    method openEntityManagerInViewFilter (line 20) | @Bean

FILE: backend/src/main/java/org/springframework/samples/petclinic/auth/Role.java
  class Role (line 10) | @Entity
    method getId (line 18) | public Integer getId() {
    method setId (line 22) | public void setId(Integer id) {
    method isNew (line 26) | public boolean isNew() {
    method getUser (line 37) | public User getUser() {
    method setUser (line 41) | public void setUser(User user) {
    method getName (line 45) | public String getName() {
    method setName (line 49) | public void setName(String name) {
    method getAuthority (line 53) | @Override
    method toString (line 58) | public String toString() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/auth/User.java
  class User (line 17) | @Entity
    method getUsername (line 39) | public String getUsername() {
    method setUsername (line 43) | public void setUsername(String username) {
    method getPassword (line 47) | public String getPassword() {
    method setPassword (line 51) | public void setPassword(String password) {
    method getEnabled (line 55) | public Boolean getEnabled() {
    method setEnabled (line 59) | public void setEnabled(Boolean enabled) {
    method getRoles (line 63) | public Set<Role> getRoles() {
    method setRoles (line 67) | public void setRoles(Set<Role> roles) {
    method addRole (line 71) | @JsonIgnore
    method getFullname (line 82) | public String getFullname() {
    method setFullname (line 86) | public void setFullname(String fullname) {
    method getAuthorities (line 90) | @Override
    method isAccountNonExpired (line 95) | @Override
    method isAccountNonLocked (line 100) | @Override
    method isCredentialsNonExpired (line 105) | @Override
    method isEnabled (line 110) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/auth/UserRepository.java
  type UserRepository (line 7) | public interface UserRepository extends Repository<User, String>  {
    method findByUsername (line 8) | Optional<User> findByUsername(String username);
    method save (line 9) | void save(User user);

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractOwnerInput.java
  class AbstractOwnerInput (line 6) | public class AbstractOwnerInput {
    method getFirstName (line 13) | public String getFirstName() {
    method setFirstName (line 17) | public void setFirstName(String firstName) {
    method getLastName (line 21) | public String getLastName() {
    method setLastName (line 25) | public void setLastName(String lastName) {
    method getAddress (line 29) | public String getAddress() {
    method setAddress (line 33) | public void setAddress(String address) {
    method getCity (line 37) | public String getCity() {
    method setCity (line 41) | public void setCity(String city) {
    method getTelephone (line 45) | public String getTelephone() {
    method setTelephone (line 49) | public void setTelephone(String telephone) {
    method toString (line 53) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractOwnerPayload.java
  class AbstractOwnerPayload (line 8) | public class AbstractOwnerPayload {
    method getOwner (line 12) | public Owner getOwner() {
    method AbstractOwnerPayload (line 16) | public AbstractOwnerPayload(Owner owner) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractPetInput.java
  class AbstractPetInput (line 8) | public class AbstractPetInput {
    method getTypeId (line 14) | public Integer getTypeId() {
    method setTypeId (line 18) | public void setTypeId(Integer typeId) {
    method getBirthDate (line 22) | public LocalDate getBirthDate() {
    method setBirthDate (line 26) | public void setBirthDate(LocalDate birthDate) {
    method getName (line 30) | public String getName() {
    method setName (line 34) | public void setName(String name) {
    method toString (line 38) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractPetPayload.java
  class AbstractPetPayload (line 8) | public class AbstractPetPayload {
    method AbstractPetPayload (line 12) | public AbstractPetPayload(Pet pet) {
    method getPet (line 16) | public Pet getPet() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddOwnerInput.java
  class AddOwnerInput (line 6) | public class AddOwnerInput extends AbstractOwnerInput {
    method toString (line 8) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddOwnerPayload.java
  class AddOwnerPayload (line 8) | public class AddOwnerPayload extends AbstractOwnerPayload {
    method AddOwnerPayload (line 10) | public AddOwnerPayload(Owner owner) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddPetInput.java
  class AddPetInput (line 6) | public class AddPetInput extends AbstractPetInput {
    method getOwnerId (line 10) | public Integer getOwnerId() {
    method setOwnerId (line 14) | public void setOwnerId(Integer ownerId) {
    method toString (line 18) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetInput.java
  class AddVetInput (line 9) | public class AddVetInput {
    method fromArgument (line 15) | public static AddVetInput fromArgument(Map<String, Object> argument) {
    method getFirstName (line 26) | public String getFirstName() {
    method setFirstName (line 30) | public void setFirstName(String firstName) {
    method getLastName (line 34) | public String getLastName() {
    method setLastName (line 38) | public void setLastName(String lastName) {
    method getSpecialtyIds (line 42) | public List<Integer> getSpecialtyIds() {
    method setSpecialtyIds (line 46) | public void setSpecialtyIds(List<Integer> specialtyIds) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetPayload.java
  type AddVetPayload (line 6) | public interface AddVetPayload {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVisitInput.java
  class AddVisitInput (line 10) | public class AddVisitInput {
    method getPetId (line 16) | public int getPetId() {
    method setPetId (line 20) | public void setPetId(int petId) {
    method getVetId (line 24) | public Optional<Integer> getVetId() {
    method setVetId (line 28) | public void setVetId(Optional<Integer> vetId) {
    method setDate (line 32) | public void setDate(LocalDate date) {
    method getDate (line 36) | public LocalDate getDate() {
    method getDescription (line 40) | public String getDescription() {
    method setDescription (line 44) | public void setDescription(String description) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/AuthController.java
  class AuthController (line 23) | @Controller
    method AuthController (line 29) | public AuthController(UserRepository userRepository) {
    method me (line 33) | @QueryMapping
    method ping (line 40) | @QueryMapping

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/OwnerController.java
  class OwnerController (line 28) | @Controller
    method OwnerController (line 36) | public OwnerController(OwnerService ownerService, OwnerRepository owne...
    method addOwner (line 41) | @MutationMapping
    method updateOwner (line 54) | @MutationMapping
    method owners (line 67) | @QueryMapping
    method owner (line 94) | @QueryMapping

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/PageInfo.java
  class PageInfo (line 6) | public class PageInfo {
    method PageInfo (line 9) | public PageInfo(Page<Owner> result) {
    method getPageNumber (line 13) | public int getPageNumber() {
    method getTotalPages (line 17) | public int getTotalPages() {
    method getTotalCount (line 21) | public long getTotalCount() {
    method getHasNext (line 25) | public boolean getHasNext() {
    method getHasPrev (line 29) | public boolean getHasPrev() {
    method getNextPage (line 33) | public Integer getNextPage() {
    method getPrevPage (line 41) | public Integer getPrevPage() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/PetController.java
  class PetController (line 20) | @Controller
    method PetController (line 27) | public PetController(PetService petService, PetRepository petRepositor...
    method pets (line 33) | @QueryMapping
    method pet (line 38) | @QueryMapping
    method visits (line 43) | @SchemaMapping
    method addPet (line 49) | @MutationMapping
    method updatePet (line 61) | @MutationMapping

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/PetTypeController.java
  class PetTypeController (line 18) | @Controller
    method PetTypeController (line 22) | public PetTypeController(PetTypeRepository petTypeRepository) {
    method pettypes (line 26) | @QueryMapping

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/SpecialtyController.java
  class SpecialtyController (line 22) | @Controller
    method SpecialtyController (line 30) | public SpecialtyController(SpecialtyService specialtyService, Specialt...
    method specialties (line 35) | @QueryMapping
    method addSpecialty (line 47) | @MutationMapping
    method updateSpecialty (line 56) | @MutationMapping
    method removeSpecialty (line 66) | @MutationMapping

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateOwnerInput.java
  class UpdateOwnerInput (line 6) | public class UpdateOwnerInput extends AbstractOwnerInput {
    method getOwnerId (line 10) | public int getOwnerId() {
    method setOwnerId (line 14) | public void setOwnerId(int ownerId) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateOwnerPayload.java
  class UpdateOwnerPayload (line 8) | public class UpdateOwnerPayload extends AbstractOwnerPayload {
    method UpdateOwnerPayload (line 9) | public UpdateOwnerPayload(Owner owner) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdatePetInput.java
  class UpdatePetInput (line 6) | public class UpdatePetInput extends AbstractPetInput {
    method getPetId (line 10) | public int getPetId() {
    method setPetId (line 14) | public void setPetId(int petId) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateSpecialtyInput.java
  class UpdateSpecialtyInput (line 5) | public class UpdateSpecialtyInput {
    method setSpecialtyId (line 11) | public void setSpecialtyId(Integer specialtyId) {
    method setName (line 15) | public void setName(String name) {
    method getSpecialtyId (line 19) | public Integer getSpecialtyId() {
    method getName (line 23) | public String getName() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/VetController.java
  class VetController (line 32) | @Controller
    method VetController (line 41) | public VetController(VetService vetService, VetRepository vetRepositor...
    method vets (line 47) | @QueryMapping
    method vet (line 58) | @QueryMapping
    method visits (line 63) | @SchemaMapping
    method addVet (line 69) | @MutationMapping

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/VisitConnection.java
  class VisitConnection (line 10) | public class VisitConnection {
    method VisitConnection (line 14) | public VisitConnection(List<Visit> visits) {
    method getTotalCount (line 18) | public int getTotalCount() {
    method getVisits (line 22) | public List<Visit> getVisits() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/VisitController.java
  class VisitController (line 20) | @Controller
    method VisitController (line 28) | public VisitController(VisitService visitService, VisitPublisher visit...
    method treatingVet (line 34) | @SchemaMapping
    method addVisit (line 42) | @MutationMapping
    method onNewVisit (line 54) | @SubscriptionMapping

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/VisitPublisher.java
  class VisitPublisher (line 24) | @Component
    method VisitPublisher (line 32) | public VisitPublisher(VisitRepository visitRepository) {
    method onNewVisit (line 39) | @TransactionalEventListener
    method getPublisher (line 49) | public Flux<Visit> getPublisher() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/runtime/DateCoercing.java
  class DateCoercing (line 16) | public class DateCoercing implements Coercing<LocalDate, String> {
    method createIsoDateFormat (line 17) | private static DateTimeFormatter createIsoDateFormat() {
    method serialize (line 21) | @Override
    method parseValue (line 29) | @Override
    method parseLiteral (line 39) | @Override
    method fromString (line 48) | private static LocalDate fromString(String input) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/runtime/GraphiQlConfiguration.java
  class GraphiQlConfiguration (line 16) | @Configuration
    method graphiQlRouterFunction (line 19) | @Bean
    method addResourceHandlers (line 33) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/graphql/runtime/PetClinicRuntimeWiringConfiguration.java
  class PetClinicRuntimeWiringConfiguration (line 19) | @Configuration
    method petclinicWiringConfigurer (line 22) | @Bean
    method addPersonTypeResolver (line 30) | private void addPersonTypeResolver(RuntimeWiring.Builder builder) {
    method addDateCoercing (line 40) | private void addDateCoercing(RuntimeWiring.Builder builder) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java
  class BaseEntity (line 32) | @MappedSuperclass
    method getId (line 39) | public Integer getId() {
    method setId (line 43) | public void setId(Integer id) {
    method isNew (line 47) | public boolean isNew() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/InvalidVetDataException.java
  class InvalidVetDataException (line 3) | public class InvalidVetDataException extends Exception {
    method InvalidVetDataException (line 4) | public InvalidVetDataException(String msg, Object... args) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java
  class NamedEntity (line 28) | @MappedSuperclass
    method getName (line 34) | public String getName() {
    method setName (line 38) | public void setName(String name) {
    method toString (line 42) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/OrderField.java
  type OrderField (line 8) | public enum OrderField {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Owner.java
  class Owner (line 34) | @Entity
    method getAddress (line 53) | public String getAddress() {
    method setAddress (line 57) | public void setAddress(String address) {
    method getCity (line 61) | public String getCity() {
    method setCity (line 65) | public void setCity(String city) {
    method getTelephone (line 69) | public String getTelephone() {
    method setTelephone (line 73) | public void setTelephone(String telephone) {
    method getPetsInternal (line 77) | protected Set<Pet> getPetsInternal() {
    method setPetsInternal (line 84) | protected void setPetsInternal(Set<Pet> pets) {
    method getPets (line 88) | public List<Pet> getPets() {
    method addPet (line 94) | public void addPet(Pet pet) {
    method getPet (line 104) | public Pet getPet(String name) {
    method getPet (line 113) | public Pet getPet(String name, boolean ignoreNew) {
    method toString (line 127) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/OwnerFilter.java
  class OwnerFilter (line 19) | public class OwnerFilter implements Specification<Owner> {
    method toPredicate (line 22) | public Predicate toPredicate(Root<Owner> root, CriteriaQuery<?> query,...
    method setFirstName (line 33) | public void setFirstName(String firstName) {
    method setLastName (line 37) | public void setLastName(String lastName) {
    method setAddress (line 41) | public void setAddress(String address) {
    method setCity (line 45) | public void setCity(String city) {
    method setTelephone (line 49) | public void setTelephone(String telephone) {
    method toPredicate (line 53) | @Override
    method isSet (line 89) | private boolean isSet(String s) {
    method toString (line 93) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/OwnerOrder.java
  method defaultOrder (line 13) | public static List<Sort.Order> defaultOrder() {
  method toSortOrder (line 17) | public Sort.Order toSortOrder() {
  method toSort (line 22) | public Sort toSort() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/OwnerService.java
  class OwnerService (line 11) | @Service
    method OwnerService (line 17) | public OwnerService(OwnerRepository ownerRepository) {
    method addOwner (line 21) | @Transactional
    method updateOwner (line 37) | @Transactional
    method setIfGiven (line 53) | private void setIfGiven(String value, Consumer<String> s) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Person.java
  class Person (line 27) | @MappedSuperclass
    method getFirstName (line 38) | public String getFirstName() {
    method setFirstName (line 42) | public void setFirstName(String firstName) {
    method getLastName (line 46) | public String getLastName() {
    method setLastName (line 50) | public void setLastName(String lastName) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Pet.java
  class Pet (line 34) | @Entity
    method setBirthDate (line 53) | public void setBirthDate(LocalDate birthDate) {
    method getBirthDate (line 57) | public LocalDate getBirthDate() {
    method getType (line 61) | public PetType getType() {
    method setType (line 65) | public void setType(PetType type) {
    method getOwner (line 69) | public Owner getOwner() {
    method setOwner (line 73) | public void setOwner(Owner owner) {
    method getVisitsInternal (line 76) | @JsonIgnore
    method setVisitsInternal (line 84) | protected void setVisitsInternal(Set<Visit> visits) {
    method getVisits (line 88) | public List<Visit> getVisits() {
    method addVisit (line 94) | public void addVisit(Visit visit) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/PetService.java
  class PetService (line 16) | @Service
    method PetService (line 23) | public PetService(OwnerRepository ownerRepository, PetRepository petRe...
    method addPet (line 29) | @Transactional
    method updatePet (line 45) | @Transactional
    method setIfGiven (line 59) | private <T> void setIfGiven(T value, Consumer<T> s) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/PetType.java
  class PetType (line 24) | @Entity

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/PetValidator.java
  class PetValidator (line 32) | public class PetValidator implements Validator {
    method validate (line 36) | @Override
    method supports (line 59) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Specialty.java
  class Specialty (line 27) | @Entity

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/SpecialtyService.java
  class SpecialtyService (line 10) | @Service
    method SpecialtyService (line 17) | public SpecialtyService(SpecialtyRepository specialtyRepository) {
    method addSpecialty (line 21) | @Transactional
    method updateSpecialty (line 29) | @Transactional
    method deleteSpecialty (line 37) | @Transactional

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Vet.java
  class Vet (line 32) | @Entity
    method getSpecialtiesInternal (line 41) | protected Set<Specialty> getSpecialtiesInternal() {
    method setSpecialtiesInternal (line 48) | protected void setSpecialtiesInternal(Set<Specialty> specialties) {
    method getSpecialties (line 52) | public List<Specialty> getSpecialties() {
    method getNrOfSpecialties (line 58) | public int getNrOfSpecialties() {
    method addSpecialty (line 62) | public void addSpecialty(Specialty specialty) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/VetService.java
  class VetService (line 13) | @Service
    method VetService (line 20) | public VetService(VetRepository vetRepository, SpecialtyRepository spe...
    method createVet (line 25) | @Transactional

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Vets.java
  class Vets (line 27) | public class Vets {
    method getVetList (line 31) | public List<Vet> getVetList() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/Visit.java
  class Visit (line 30) | @Entity
    method Visit (line 55) | public Visit() {
    method getDate (line 59) | public LocalDate getDate() {
    method setDate (line 63) | public void setDate(LocalDate date) {
    method getDescription (line 67) | public String getDescription() {
    method setDescription (line 71) | public void setDescription(String description) {
    method getPet (line 75) | public Pet getPet() {
    method setPet (line 79) | public void setPet(Pet pet) {
    method getVetId (line 83) | public Integer getVetId() {
    method setVetId (line 88) | public void setVetId(Integer vetId) {
    method hasVetId (line 92) | public boolean hasVetId() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/VisitCreatedEvent.java
  class VisitCreatedEvent (line 3) | public class VisitCreatedEvent {
    method VisitCreatedEvent (line 7) | public VisitCreatedEvent(Integer visitId) {
    method getVisitId (line 11) | public Integer getVisitId() {
    method toString (line 15) | @Override

FILE: backend/src/main/java/org/springframework/samples/petclinic/model/VisitService.java
  class VisitService (line 15) | @Service
    method VisitService (line 22) | public VisitService(ApplicationEventPublisher applicationEventPublishe...
    method addVisit (line 28) | @Transactional

FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java
  type OwnerRepository (line 39) | public interface OwnerRepository extends Repository<Owner, Integer>, Jpa...
    method findById (line 47) | Optional<Owner> findById(Integer id);
    method save (line 56) | void save(Owner owner);
    method findAll (line 64) | Collection<Owner> findAll();
    method delete (line 72) | void delete(Owner owner);

FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java
  type PetRepository (line 39) | public interface PetRepository extends Repository<Pet, Integer> {
    method findPetTypes (line 46) | @Query("SELECT ptype FROM PetType ptype ORDER BY ptype.name")
    method findById (line 56) | Optional<Pet> findById(Integer id);
    method save (line 64) | void save(Pet pet);
    method findAll (line 72) | Collection<Pet> findAll();
    method delete (line 80) | void delete(Pet pet);

FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/PetTypeRepository.java
  type PetTypeRepository (line 32) | public interface PetTypeRepository extends Repository<PetType, Integer> {
    method findById (line 34) | Optional<PetType> findById(Integer id) ;
    method findAll (line 36) | Collection<PetType> findAll();
    method save (line 38) | void save(PetType petType);

FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/SpecialtyRepository.java
  type SpecialtyRepository (line 32) | public interface SpecialtyRepository extends Repository<Specialty, Integ...
    method findById (line 34) | Optional<Specialty> findById(Integer id);
    method findAll (line 36) | Collection<Specialty> findAll();
    method save (line 38) | void save(Specialty specialty);
    method delete (line 40) | void delete(Specialty specialty);

FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/VetRepository.java
  type VetRepository (line 39) | public interface VetRepository extends Repository<Vet, Integer> {
    method findById (line 41) | Optional<Vet> findById(Integer id);
    method save (line 43) | Vet save(Vet vet);
    method delete (line 45) | void delete(Vet vet);
    method findBy (line 47) | Window<Vet> findBy(ScrollPosition position, Sort sort, Limit limit);

FILE: backend/src/main/java/org/springframework/samples/petclinic/repository/VisitRepository.java
  type VisitRepository (line 37) | public interface VisitRepository extends Repository<Visit, Integer> {
    method save (line 45) | void save(Visit visit);
    method findByPetIdOrderById (line 47) | List<Visit> findByPetIdOrderById(Integer petId);
    method findById (line 49) | Optional<Visit> findById(Integer id);
    method findAll (line 51) | Collection<Visit> findAll();
    method delete (line 53) | void delete(Visit visit);
    method findByVetId (line 55) | List<Visit> findByVetId(Integer id);

FILE: backend/src/main/java/org/springframework/samples/petclinic/security/JwtTokenService.java
  class JwtTokenService (line 18) | @Service
    method JwtTokenService (line 23) | public JwtTokenService(JwtEncoder encoder) {
    method generateToken (line 27) | public String generateToken(Authentication authentication) {
    method generateToken (line 34) | public String generateToken(String name, Collection<? extends GrantedA...

FILE: backend/src/main/java/org/springframework/samples/petclinic/security/LoginController.java
  class LoginController (line 25) | @RestController
    method LoginController (line 33) | public LoginController(JwtTokenService tokenService, AuthenticationMan...
    method login (line 38) | @PostMapping("/api/login")
    method ping (line 56) | @GetMapping("/ping")

FILE: backend/src/main/java/org/springframework/samples/petclinic/security/LoginRequest.java
  class LoginRequest (line 3) | public class LoginRequest {
    method getUsername (line 8) | public String getUsername() {
    method setUsername (line 12) | public void setUsername(String username) {
    method getPassword (line 16) | public String getPassword() {
    method setPassword (line 20) | public void setPassword(String password) {

FILE: backend/src/main/java/org/springframework/samples/petclinic/security/LoginResponse.java
  class LoginResponse (line 3) | public class LoginResponse {
    method LoginResponse (line 6) | public LoginResponse(String token) {
    method getToken (line 10) | public String getToken() {

FILE: backend/src/main/java/org/springframework/samples/petclinic/security/NeverExpiringTokenGenerator.java
  class NeverExpiringTokenGenerator (line 20) | @Component
    method NeverExpiringTokenGenerator (line 28) | NeverExpiringTokenGenerator(UserRepository userRepository, JwtTokenSer...
    method createNonExpiringTokens (line 40) | @PostConstruct

FILE: backend/src/main/java/org/springframework/samples/petclinic/security/RSAKeyProvider.java
  class RSAKeyProvider (line 33) | @Component
    method RSAKeyProvider (line 42) | public RSAKeyProvider(@Value("${publicKey}") Resource publicKeyResourc...
    method getRsaKey (line 47) | public RSAKey getRsaKey() {
    method generateRsaKey (line 51) | @PostConstruct
    method getPublicKey (line 69) | private RSAPublicKey getPublicKey() throws Exception {
    method getPrivateKey (line 83) | private RSAPrivateKey getPrivateKey() throws Exception {

FILE: backend/src/main/java/org/springframework/samples/petclinic/security/SecurityConfig.java
  class SecurityConfig (line 46) | @Configuration
    method SecurityConfig (line 53) | public SecurityConfig(RSAKeyProvider RSAKeyProvider) {
    method authManager (line 57) | @Bean
    method userDetailsService (line 64) | @Bean
    method filterChain (line 75) | @Bean
    method bearerTokenResolver (line 101) | @Bean
    method jwkSource (line 108) | @Bean
    method jwtEncoder (line 114) | @Bean
    method jwtDecoder (line 119) | @Bean

FILE: backend/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java
  class EntityUtils (line 36) | public abstract class EntityUtils {
    method getById (line 47) | public static <T extends BaseEntity> T getById(Collection<T> entities,...
    method asDateTime (line 57) | public static LocalDate asDateTime(Date date) {

FILE: backend/src/main/resources/db/migration/V100_1__create_schema.sql
  type users (line 11) | CREATE TABLE users
  type roles (line 20) | CREATE TABLE roles
  type fk_username_idx (line 27) | CREATE INDEX fk_username_idx ON roles (username)
  type vets (line 30) | CREATE TABLE vets
  type vets_last_name (line 37) | CREATE INDEX vets_last_name ON vets (last_name)
  type specialties (line 39) | CREATE TABLE specialties
  type specialties_name (line 45) | CREATE INDEX specialties_name ON specialties (name)
  type vet_specialties (line 47) | CREATE TABLE vet_specialties
  type types (line 63) | CREATE TABLE types
  type types_name (line 69) | CREATE INDEX types_name ON types (name)
  type owners (line 71) | CREATE TABLE owners
  type owners_last_name (line 81) | CREATE INDEX owners_last_name ON owners (lower(last_name))
  type pets (line 83) | CREATE TABLE pets
  type pets_name (line 92) | CREATE INDEX pets_name ON pets (name)
  type visits (line 94) | CREATE TABLE visits
  type visits_pet_id (line 103) | CREATE INDEX visits_pet_id ON visits (pet_id)

FILE: backend/src/main/resources/ui/graphiql/assets/Range-52ddcb6a.js
  class h (line 1) | class h{constructor(t,r){this.containsPosition=e=>this.start.line===e.li...
    method constructor (line 1) | constructor(t,r){this.containsPosition=e=>this.start.line===e.line?thi...
    method setStart (line 1) | setStart(t,r){this.start=new s(t,r)}
    method setEnd (line 1) | setEnd(t,r){this.end=new s(t,r)}
  class s (line 1) | class s{constructor(t,r){this.lessThanOrEqualTo=e=>this.line<e.line||thi...
    method constructor (line 1) | constructor(t,r){this.lessThanOrEqualTo=e=>this.line<e.line||this.line...
    method setLine (line 1) | setLine(t){this.line=t}
    method setCharacter (line 1) | setCharacter(t){this.character=t}

FILE: backend/src/main/resources/ui/graphiql/assets/SchemaReference.es-0ccab37b.js
  function V (line 1) | function V(t,n){const e={schema:t,type:null,parentType:null,inputType:nu...
  function c (line 1) | function c(t,n,e){if(e===g.name&&t.getQueryType()===n)return g;if(e===D....
  function v (line 1) | function v(t,n){for(let e=0;e<t.length;e++)if(n(t[e]))return t[e]}
  function A (line 1) | function A(t){return{kind:"Field",schema:t.schema,field:t.fieldDef,type:...
  function L (line 1) | function L(t){return{kind:"Directive",schema:t.schema,directive:t.direct...
  function M (line 1) | function M(t){return t.directiveDef?{kind:"Argument",schema:t.schema,arg...
  function R (line 1) | function R(t){return{kind:"EnumValue",value:t.enumValue||void 0,type:t.i...
  function E (line 1) | function E(t,n){return{kind:"Type",schema:t.schema,type:n||t.type}}
  function f (line 1) | function f(t){return t.name.slice(0,2)==="__"}

FILE: backend/src/main/resources/ui/graphiql/assets/brace-fold.es-f2e3735d.js
  function A (line 1) | function A(k,T){for(var r=0;r<T.length;r++){const s=T[r];if(typeof s!="s...
  function s (line 1) | function s(e){return function(i,o){var t=o.line,u=i.getLine(t);function ...
  function o (line 1) | function o(n){if(n<e.firstLine()||n>e.lastLine())return null;var g=e.get...
  function o (line 1) | function o(f){if(f<e.firstLine()||f>e.lastLine())return null;var n=e.get...

FILE: backend/src/main/resources/ui/graphiql/assets/closebrackets.es-e969742b.js
  function z (line 1) | function z(P,k){for(var t=0;t<k.length;t++){const v=k[t];if(typeof v!="s...
  function h (line 1) | function h(e,n){return n=="pairs"&&typeof e=="string"?e:typeof e=="objec...
  function T (line 1) | function T(e){for(var n=0;n<e.length;n++){var r=e.charAt(n),a="'"+r+"'";...
  function w (line 1) | function w(e){return function(n){return I(n,e)}}
  function A (line 1) | function A(e){var n=e.state.closeBrackets;if(!n||n.override)return n;var...
  function E (line 1) | function E(e){var n=A(e);if(!n||e.getOption("disableInput"))return t.Pas...
  function M (line 1) | function M(e){var n=A(e),r=n&&h(n,"explode");if(!r||e.getOption("disable...
  function S (line 2) | function S(e,n){for(var r=[],a=e.listSelections(),i=0,l=0;l<a.length;l++...
  function R (line 2) | function R(e){var n=t.cmpPos(e.anchor,e.head)>0;return{anchor:new o(e.an...
  function I (line 2) | function I(e,n){var r=A(e);if(!r||e.getOption("disableInput"))return t.P...
  function x (line 2) | function x(e,n){var r=e.getRange(o(n.line,n.ch-1),o(n.line,n.ch+1));retu...
  function K (line 2) | function K(e,n){var r=e.getTokenAt(o(n.line,n.ch+1));return/\bstring/.te...

FILE: backend/src/main/resources/ui/graphiql/assets/codemirror.es-52e8b92d.js
  function c (line 1) | function c(e,n){for(var o=0;o<n.length;o++){const r=n[o];if(typeof r!="s...

FILE: backend/src/main/resources/ui/graphiql/assets/codemirror.es2-5884f31a.js
  function cu (line 1) | function cu(Et){return Et&&Et.__esModule&&Object.prototype.hasOwnPropert...
  function hu (line 1) | function hu(){return Ks||(Ks=1,function(Et,Nl){(function(it,tr){Et.expor...

FILE: backend/src/main/resources/ui/graphiql/assets/comment.es-39699bae.js
  function q (line 1) | function q(S,A){for(var f=0;f<A.length;f++){const p=A[f];if(typeof p!="s...
  function N (line 1) | function N(t){var i=t.search(s);return i==-1?0:i}
  function z (line 1) | function z(t,i,n){return/\bstring\b/.test(t.getTokenTypeAt(r(i.line,0)))...
  function j (line 1) | function j(t,i){var n=t.getMode();return n.useInnerComments===!1||!n.inn...

FILE: backend/src/main/resources/ui/graphiql/assets/dialog.es-b2776d29.js
  function C (line 1) | function C(p,m){for(var o=0;o<m.length;o++){const c=m[o];if(typeof c!="s...
  function c (line 1) | function c(u,l,e){var r=u.getWrapperElement(),a;return a=r.appendChild(d...
  function s (line 1) | function s(u,l){u.state.currentNotificationClose&&u.state.currentNotific...
  function i (line 1) | function i(t){if(typeof t=="string")n.value=t;else{if(a)return;a=!0,o.rm...
  function d (line 1) | function d(){f||(f=!0,o.rmClass(r.parentNode,"dialog-opened"),r.parentNo...
  function i (line 1) | function i(){r||(r=!0,clearTimeout(a),o.rmClass(e.parentNode,"dialog-ope...

FILE: backend/src/main/resources/ui/graphiql/assets/foldgutter.es-b6cee46a.js
  function U (line 1) | function U(C,y){for(var a=0;a<y.length;a++){const c=y[a];if(typeof c!="s...
  function S (line 1) | function S(){return E||(E=1,function(C,y){(function(a){a(P())})(function...
  function g (line 1) | function g(o){this.options=o,this.from=this.to=0}
  function F (line 1) | function F(o){return o===!0&&(o={}),o.gutter==null&&(o.gutter="CodeMirro...
  function m (line 1) | function m(o,n){for(var l=o.findMarks(c(n,0),c(n+1,0)),r=0;r<l.length;++...
  function e (line 1) | function e(o){if(typeof o=="string"){var n=document.createElement("div")...
  function t (line 1) | function t(o,n,l){var r=o.state.foldGutter.options,p=n-1,v=o.foldOption(...
  function i (line 1) | function i(o){return new RegExp("(^|\\s)"+o+"(?:$|\\s)\\s*")}
  function f (line 1) | function f(o){var n=o.getViewport(),l=o.state.foldGutter;l&&(o.operation...
  function s (line 1) | function s(o,n,l){var r=o.state.foldGutter;if(r){var p=r.options;if(l==p...
  function O (line 1) | function O(o){var n=o.state.foldGutter;if(n){var l=n.options;n.from=n.to...
  function w (line 1) | function w(o){var n=o.state.foldGutter;if(n){var l=n.options;clearTimeou...
  function u (line 1) | function u(o,n){var l=o.state.foldGutter;if(l){var r=n.line;r>=l.from&&r...

FILE: backend/src/main/resources/ui/graphiql/assets/forEachState.es-b2033c2b.js
  function f (line 1) | function f(t,n){const r=[];let e=t;for(;e!=null&&e.kind;)r.push(e),e=e.p...

FILE: backend/src/main/resources/ui/graphiql/assets/hint.es2-598d3bfe.js
  function u (line 1) | function u(i,n,t){const r=x(t,m(n.string));if(!r)return;const e=n.type!=...
  function x (line 1) | function x(i,n){if(!n)return y(i,r=>!r.isDeprecated);const t=i.map(r=>({...
  function y (line 1) | function y(i,n){const t=i.filter(n);return t.length===0?i:t}
  function m (line 1) | function m(i){return i.toLowerCase().replaceAll(/\W/g,"")}
  function V (line 1) | function V(i,n){let t=v(n,i);return i.length>n.length&&(t-=i.length-n.le...
  function v (line 1) | function v(i,n){let t,r;const e=[],a=i.length,s=n.length;for(t=0;t<=a;t+...
  function O (line 1) | function O(i,n,t){const r=n.state.kind==="Invalid"?n.state.prevState:n.s...
  function k (line 1) | function k(i,n){const t={type:null,fields:null};return L(n,r=>{switch(r....

FILE: backend/src/main/resources/ui/graphiql/assets/index-27dc12ba.js
  function G2 (line 1) | function G2(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!="...
  function n (line 1) | function n(o){const i={};return o.integrity&&(i.integrity=o.integrity),o...
  function r (line 1) | function r(o){if(o.ep)return;o.ep=!0;const i=n(o);fetch(o.href,i)}
  function Wi (line 1) | function Wi(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.c...
  function W2 (line 1) | function W2(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="fu...
  function ok (line 9) | function ok(e){return e===null||typeof e!="object"?null:(e=x0&&e[x0]||e[...
  function Qi (line 9) | function Qi(e,t,n){this.props=e,this.context=t,this.refs=kb,this.updater...
  function Nb (line 9) | function Nb(){}
  function Kh (line 9) | function Kh(e,t,n){this.props=e,this.context=t,this.refs=kb,this.updater...
  function Ib (line 9) | function Ib(e,t,n){var r,o={},i=null,s=null;if(t!=null)for(r in t.ref!==...
  function ik (line 9) | function ik(e,t){return{$$typeof:Oa,type:e.type,key:t,ref:e.ref,props:e....
  function nm (line 9) | function nm(e){return typeof e=="object"&&e!==null&&e.$$typeof===Oa}
  function sk (line 9) | function sk(e){var t={"=":"=0",":":"=2"};return"$"+e.replace(/[=:]/g,fun...
  function Af (line 9) | function Af(e,t){return typeof e=="object"&&e!==null&&e.key!=null?sk(""+...
  function Yl (line 9) | function Yl(e,t,n,r,o){var i=typeof e;(i==="undefined"||i==="boolean")&&...
  function il (line 9) | function il(e,t,n){if(e==null)return e;var r=[],o=0;return Yl(e,r,"","",...
  function ak (line 9) | function ak(e){if(e._status===-1){var t=e._result;t=t(),t.then(function(...
  function Rb (line 17) | function Rb(e,t,n){var r,o={},i=null,s=null;n!==void 0&&(i=""+n),t.key!=...
  function t (line 25) | function t(D,P){var U=D.length;D.push(P);e:for(;0<U;){var Z=U-1>>>1,ee=D...
  function n (line 25) | function n(D){return D.length===0?null:D[0]}
  function r (line 25) | function r(D){if(D.length===0)return null;var P=D[0],U=D.pop();if(U!==P)...
  function o (line 25) | function o(D,P){var U=D.sortIndex-P.sortIndex;return U!==0?U:D.id-P.id}
  function E (line 25) | function E(D){for(var P=n(c);P!==null;){if(P.callback===null)r(c);else i...
  function x (line 25) | function x(D){if(v=!1,E(D),!m)if(n(l)!==null)m=!0,R(w);else{var P=n(c);P...
  function w (line 25) | function w(D,P){m=!1,v&&(v=!1,y(A),A=-1),f=!0;var U=p;try{for(E(P),d=n(l...
  function q (line 25) | function q(){return!(e.unstable_now()-k<S)}
  function H (line 25) | function H(){if(T!==null){var D=e.unstable_now();k=D;var P=!0;try{P=T(!0...
  function R (line 25) | function R(D){T=D,C||(C=!0,V())}
  function I (line 25) | function I(D,P){A=b(function(){D(e.unstable_now())},P)}
  function W (line 33) | function W(e){for(var t="https://reactjs.org/docs/error-decoder.html?inv...
  function Vo (line 33) | function Vo(e,t){Li(e,t),Li(e+"Capture",t)}
  function Li (line 33) | function Li(e,t){for(Gs[e]=t,e=0;e<t.length;e++)Fb.add(t[e])}
  function gk (line 33) | function gk(e){return Yd.call(C0,e)?!0:Yd.call(S0,e)?!1:vk.test(e)?C0[e]...
  function yk (line 33) | function yk(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){c...
  function Ek (line 33) | function Ek(e,t,n,r){if(t===null||typeof t>"u"||yk(e,t,n,r))return!0;if(...
  function St (line 33) | function St(e,t,n,r,o,i,s){this.acceptsBooleans=t===2||t===3||t===4,this...
  function om (line 33) | function om(e){return e[1].toUpperCase()}
  function im (line 33) | function im(e,t,n,r){var o=st.hasOwnProperty(t)?st[t]:null;(o!==null?o.t...
  function cs (line 33) | function cs(e){return e===null||typeof e!="object"?null:(e=T0&&e[T0]||e[...
  function bs (line 33) | function bs(e){if(Df===void 0)try{throw Error()}catch(n){var t=n.stack.t...
  function Rf (line 34) | function Rf(e,t){if(!e||If)return"";If=!0;var n=Error.prepareStackTrace;...
  function bk (line 37) | function bk(e){switch(e.tag){case 5:return bs(e.type);case 16:return bs(...
  function Kd (line 37) | function Kd(e){if(e==null)return null;if(typeof e=="function")return e.d...
  function xk (line 37) | function xk(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:r...
  function Ur (line 37) | function Ur(e){switch(typeof e){case"boolean":case"number":case"string":...
  function qb (line 37) | function qb(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="inp...
  function wk (line 37) | function wk(e){var t=qb(e)?"checked":"value",n=Object.getOwnPropertyDesc...
  function al (line 37) | function al(e){e._valueTracker||(e._valueTracker=wk(e))}
  function Ub (line 37) | function Ub(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n...
  function bc (line 37) | function bc(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u...
  function ep (line 37) | function ep(e,t){var n=t.checked;return $e({},t,{defaultChecked:void 0,d...
  function k0 (line 37) | function k0(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checke...
  function Bb (line 37) | function Bb(e,t){t=t.checked,t!=null&&im(e,"checked",t,!1)}
  function tp (line 37) | function tp(e,t){Bb(e,t);var n=Ur(t.value),r=t.type;if(n!=null)r==="numb...
  function N0 (line 37) | function N0(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defau...
  function np (line 37) | function np(e,t,n){(t!=="number"||bc(e.ownerDocument)!==e)&&(n==null?e.d...
  function bi (line 37) | function bi(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t...
  function rp (line 37) | function rp(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(W(91));r...
  function A0 (line 37) | function A0(e,t){var n=t.value;if(n==null){if(n=t.children,t=t.defaultVa...
  function zb (line 37) | function zb(e,t){var n=Ur(t.value),r=Ur(t.defaultValue);n!=null&&(n=""+n...
  function D0 (line 37) | function D0(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!=...
  function Hb (line 37) | function Hb(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";ca...
  function op (line 37) | function op(e,t){return e==null||e==="http://www.w3.org/1999/xhtml"?Hb(t...
  function Ws (line 37) | function Ws(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeT...
  function Wb (line 37) | function Wb(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typ...
  function Qb (line 37) | function Qb(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=...
  function ip (line 37) | function ip(e,t){if(t){if(Sk[e]&&(t.children!=null||t.dangerouslySetInne...
  function sp (line 37) | function sp(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";swi...
  function cm (line 37) | function cm(e){return e=e.target||e.srcElement||window,e.correspondingUs...
  function I0 (line 37) | function I0(e){if(e=Fa(e)){if(typeof lp!="function")throw Error(W(280));...
  function Yb (line 37) | function Yb(e){xi?wi?wi.push(e):wi=[e]:xi=e}
  function Zb (line 37) | function Zb(){if(xi){var e=xi,t=wi;if(wi=xi=null,I0(e),t)for(e=0;e<t.len...
  function Xb (line 37) | function Xb(e,t){return e(t)}
  function Jb (line 37) | function Jb(){}
  function Kb (line 37) | function Kb(e,t,n){if(Lf)return e(t,n);Lf=!0;try{return Xb(e,t,n)}finall...
  function Qs (line 37) | function Qs(e,t){var n=e.stateNode;if(n===null)return null;var r=Au(n);i...
  function Ck (line 37) | function Ck(e,t,n,r,o,i,s,a,l){var c=Array.prototype.slice.call(argument...
  function kk (line 37) | function kk(e,t,n,r,o,i,s,a,l){As=!1,xc=null,Ck.apply(Tk,arguments)}
  function Nk (line 37) | function Nk(e,t,n,r,o,i,s,a,l){if(kk.apply(this,arguments),As){if(As){va...
  function jo (line 37) | function jo(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else...
  function ex (line 37) | function ex(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.al...
  function R0 (line 37) | function R0(e){if(jo(e)!==e)throw Error(W(188))}
  function Ak (line 37) | function Ak(e){var t=e.alternate;if(!t){if(t=jo(e),t===null)throw Error(...
  function tx (line 37) | function tx(e){return e=Ak(e),e!==null?nx(e):null}
  function nx (line 37) | function nx(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;)...
  function Ok (line 37) | function Ok(e){if(Fn&&typeof Fn.onCommitFiberRoot=="function")try{Fn.onC...
  function Fk (line 37) | function Fk(e){return e>>>=0,e===0?32:31-(Pk(e)/$k|0)|0}
  function ws (line 37) | function ws(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:retur...
  function Sc (line 37) | function Sc(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.susp...
  function Mk (line 37) | function Mk(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case...
  function Vk (line 37) | function Vk(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirati...
  function fp (line 37) | function fp(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?...
  function sx (line 37) | function sx(){var e=cl;return cl<<=1,!(cl&4194240)&&(cl=64),e}
  function Of (line 37) | function Of(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}
  function Pa (line 37) | function Pa(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,...
  function jk (line 37) | function jk(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLan...
  function fm (line 37) | function fm(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var...
  function ax (line 37) | function ax(e){return e&=-e,1<e?4<e?e&268435455?16:536870912:4:1}
  function O0 (line 37) | function O0(e,t){switch(e){case"focusin":case"focusout":Rr=null;break;ca...
  function fs (line 37) | function fs(e,t,n,r,o,i){return e===null||e.nativeEvent!==i?(e={blockedO...
  function Uk (line 37) | function Uk(e,t,n,r,o){switch(t){case"focusin":return Rr=fs(Rr,e,t,n,r,o...
  function dx (line 37) | function dx(e){var t=po(e.target);if(t!==null){var n=jo(t);if(n!==null){...
  function Xl (line 37) | function Xl(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContaine...
  function P0 (line 37) | function P0(e,t,n){Xl(e)&&n.delete(t)}
  function Bk (line 37) | function Bk(){dp=!1,Rr!==null&&Xl(Rr)&&(Rr=null),Lr!==null&&Xl(Lr)&&(Lr=...
  function ds (line 37) | function ds(e,t){e.blockedOn===t&&(e.blockedOn=null,dp||(dp=!0,qt.unstab...
  function Xs (line 37) | function Xs(e){function t(o){return ds(o,e)}if(0<fl.length){ds(fl[0],e);...
  function zk (line 37) | function zk(e,t,n,r){var o=Ee,i=_i.transition;_i.transition=null;try{Ee=...
  function Hk (line 37) | function Hk(e,t,n,r){var o=Ee,i=_i.transition;_i.transition=null;try{Ee=...
  function pm (line 37) | function pm(e,t,n,r){if(Cc){var o=pp(e,t,n,r);if(o===null)zf(e,t,r,Tc,n)...
  function pp (line 37) | function pp(e,t,n,r){if(Tc=null,e=cm(r),e=po(e),e!==null)if(t=jo(e),t===...
  function px (line 37) | function px(e){switch(e){case"cancel":case"click":case"close":case"conte...
  function hx (line 37) | function hx(){if(Jl)return Jl;var e,t=hm,n=t.length,r,o="value"in Tr?Tr....
  function Kl (line 37) | function Kl(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&...
  function dl (line 37) | function dl(){return!0}
  function $0 (line 37) | function $0(){return!1}
  function Gt (line 37) | function Gt(e){function t(n,r,o,i,s){this._reactName=n,this._targetInst=...
  function oN (line 37) | function oN(e){var t=this.nativeEvent;return t.getModifierState?t.getMod...
  function vm (line 37) | function vm(){return oN}
  function vx (line 37) | function vx(e,t){switch(e){case"keyup":return hN.indexOf(t.keyCode)!==-1...
  function gx (line 37) | function gx(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:n...
  function vN (line 37) | function vN(e,t){switch(e){case"compositionend":return gx(t);case"keypre...
  function gN (line 37) | function gN(e,t){if(ii)return e==="compositionend"||!gm&&vx(e,t)?(e=hx()...
  function U0 (line 37) | function U0(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t===...
  function yx (line 37) | function yx(e,t,n,r){Yb(r),t=kc(t,"onChange"),0<t.length&&(n=new mm("onC...
  function EN (line 37) | function EN(e){Ax(e,0)}
  function ku (line 37) | function ku(e){var t=li(e);if(Ub(t))return e}
  function bN (line 37) | function bN(e,t){if(e==="change")return t}
  function z0 (line 37) | function z0(){Is&&(Is.detachEvent("onpropertychange",bx),Js=Is=null)}
  function bx (line 37) | function bx(e){if(e.propertyName==="value"&&ku(Js)){var t=[];yx(t,Js,e,c...
  function xN (line 37) | function xN(e,t,n){e==="focusin"?(z0(),Is=t,Js=n,Is.attachEvent("onprope...
  function wN (line 37) | function wN(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")retu...
  function _N (line 37) | function _N(e,t){if(e==="click")return ku(t)}
  function SN (line 37) | function SN(e,t){if(e==="input"||e==="change")return ku(t)}
  function CN (line 37) | function CN(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}
  function Ks (line 37) | function Ks(e,t){if(Cn(e,t))return!0;if(typeof e!="object"||e===null||ty...
  function H0 (line 37) | function H0(e){for(;e&&e.firstChild;)e=e.firstChild;return e}
  function G0 (line 37) | function G0(e,t){var n=H0(e);e=0;for(var r;n;){if(n.nodeType===3){if(r=e...
  function xx (line 37) | function xx(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType...
  function wx (line 37) | function wx(){for(var e=window,t=bc();t instanceof e.HTMLIFrameElement;)...
  function ym (line 37) | function ym(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(...
  function TN (line 37) | function TN(e){var t=wx(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n...
  function W0 (line 37) | function W0(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.owne...
  function pl (line 37) | function pl(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["W...
  function Nu (line 37) | function Nu(e){if(jf[e])return jf[e];if(!ai[e])return e;var t=ai[e],n;fo...
  function Wr (line 37) | function Wr(e,t){Nx.set(e,t),Vo(t,[e])}
  function Y0 (line 37) | function Y0(e,t,n){var r=e.type||"unknown-event";e.currentTarget=n,Nk(r,...
  function Ax (line 37) | function Ax(e,t){t=(t&4)!==0;for(var n=0;n<e.length;n++){var r=e[n],o=r....
  function Te (line 37) | function Te(e,t){var n=t[bp];n===void 0&&(n=t[bp]=new Set);var r=e+"__bu...
  function Bf (line 37) | function Bf(e,t,n){var r=0;t&&(r|=4),Dx(n,e,r,t)}
  function ea (line 37) | function ea(e){if(!e[hl]){e[hl]=!0,Fb.forEach(function(n){n!=="selection...
  function Dx (line 37) | function Dx(e,t,n,r){switch(px(t)){case 1:var o=zk;break;case 4:o=Hk;bre...
  function zf (line 37) | function zf(e,t,n,r,o){var i=r;if(!(t&1)&&!(t&2)&&r!==null)e:for(;;){if(...
  function ta (line 37) | function ta(e,t,n){return{instance:e,listener:t,currentTarget:n}}
  function kc (line 37) | function kc(e,t){for(var n=t+"Capture",r=[];e!==null;){var o=e,i=o.state...
  function Yo (line 37) | function Yo(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5)...
  function Z0 (line 37) | function Z0(e,t,n,r,o){for(var i=t._reactName,s=[];n!==null&&n!==r;){var...
  function X0 (line 37) | function X0(e){return(typeof e=="string"?e:""+e).replace(IN,`
  function ml (line 38) | function ml(e,t,n){if(t=X0(t),X0(e)!==t&&n)throw Error(W(425))}
  function Nc (line 38) | function Nc(){}
  function yp (line 38) | function yp(e,t){return e==="textarea"||e==="noscript"||typeof t.childre...
  function PN (line 38) | function PN(e){setTimeout(function(){throw e})}
  function Hf (line 38) | function Hf(e,t){var n=t,r=0;do{var o=n.nextSibling;if(e.removeChild(n),...
  function Pr (line 38) | function Pr(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||...
  function K0 (line 38) | function K0(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){va...
  function po (line 38) | function po(e){var t=e[On];if(t)return t;for(var n=e.parentNode;n;){if(t...
  function Fa (line 38) | function Fa(e){return e=e[On]||e[or],!e||e.tag!==5&&e.tag!==6&&e.tag!==1...
  function li (line 38) | function li(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(W(...
  function Au (line 38) | function Au(e){return e[na]||null}
  function Qr (line 38) | function Qr(e){return{current:e}}
  function ke (line 38) | function ke(e){0>ci||(e.current=xp[ci],xp[ci]=null,ci--)}
  function Ce (line 38) | function Ce(e,t){ci++,xp[ci]=e.current,e.current=t}
  function Oi (line 38) | function Oi(e,t){var n=e.type.contextTypes;if(!n)return Br;var r=e.state...
  function Dt (line 38) | function Dt(e){return e=e.childContextTypes,e!=null}
  function Ac (line 38) | function Ac(){ke(At),ke(mt)}
  function eg (line 38) | function eg(e,t,n){if(mt.current!==Br)throw Error(W(168));Ce(mt,t),Ce(At...
  function Ix (line 38) | function Ix(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.g...
  function Dc (line 38) | function Dc(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMerged...
  function tg (line 38) | function tg(e,t,n){var r=e.stateNode;if(!r)throw Error(W(169));n?(e=Ix(e...
  function Rx (line 38) | function Rx(e){Xn===null?Xn=[e]:Xn.push(e)}
  function MN (line 38) | function MN(e){Du=!0,Rx(e)}
  function Yr (line 38) | function Yr(){if(!Gf&&Xn!==null){Gf=!0;var e=0,t=Ee;try{var n=Xn;for(Ee=...
  function lo (line 38) | function lo(e,t){ui[fi++]=Rc,ui[fi++]=Ic,Ic=e,Rc=t}
  function Lx (line 38) | function Lx(e,t,n){Wt[Qt++]=Kn,Wt[Qt++]=er,Wt[Qt++]=To,To=e;var r=Kn;e=e...
  function Em (line 38) | function Em(e){e.return!==null&&(lo(e,1),Lx(e,1,0))}
  function bm (line 38) | function bm(e){for(;e===Ic;)Ic=ui[--fi],ui[fi]=null,Rc=ui[--fi],ui[fi]=n...
  function Ox (line 38) | function Ox(e,t){var n=Zt(5,null,null,0);n.elementType="DELETED",n.state...
  function ng (line 38) | function ng(e,t){switch(e.tag){case 5:var n=e.type;return t=t.nodeType!=...
  function wp (line 38) | function wp(e){return(e.mode&1)!==0&&(e.flags&128)===0}
  function _p (line 38) | function _p(e){if(Ne){var t=$t;if(t){var n=t;if(!ng(e,t)){if(wp(e))throw...
  function rg (line 38) | function rg(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13...
  function vl (line 38) | function vl(e){if(e!==Mt)return!1;if(!Ne)return rg(e),Ne=!0,!1;var t;if(...
  function Px (line 38) | function Px(){for(var e=$t;e;)e=Pr(e.nextSibling)}
  function Pi (line 38) | function Pi(){$t=Mt=null,Ne=!1}
  function xm (line 38) | function xm(e){hn===null?hn=[e]:hn.push(e)}
  function fn (line 38) | function fn(e,t){if(e&&e.defaultProps){t=$e({},t),e=e.defaultProps;for(v...
  function _m (line 38) | function _m(){wm=di=Oc=null}
  function Sm (line 38) | function Sm(e){var t=Lc.current;ke(Lc),e._currentValue=t}
  function Sp (line 38) | function Sp(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)...
  function Si (line 38) | function Si(e,t){Oc=e,wm=di=null,e=e.dependencies,e!==null&&e.firstConte...
  function en (line 38) | function en(e){var t=e._currentValue;if(wm!==e)if(e={context:e,memoizedV...
  function Cm (line 38) | function Cm(e){ho===null?ho=[e]:ho.push(e)}
  function $x (line 38) | function $x(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,Cm(t)...
  function ir (line 38) | function ir(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t)...
  function Tm (line 38) | function Tm(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:...
  function Fx (line 38) | function Fx(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={base...
  function tr (line 38) | function tr(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:n...
  function $r (line 38) | function $r(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.sh...
  function ec (line 38) | function ec(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!...
  function og (line 38) | function og(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.upd...
  function Pc (line 38) | function Pc(e,t,n,r){var o=e.updateQueue;br=!1;var i=o.firstBaseUpdate,s...
  function ig (line 38) | function ig(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.le...
  function Cp (line 38) | function Cp(e,t,n,r){t=e.memoizedState,n=n(r,t),n=n==null?t:$e({},t,n),e...
  function sg (line 38) | function sg(e,t,n,r,o,i,s){return e=e.stateNode,typeof e.shouldComponent...
  function Vx (line 38) | function Vx(e,t,n){var r=!1,o=Br,i=t.contextType;return typeof i=="objec...
  function ag (line 38) | function ag(e,t,n,r){e=t.state,typeof t.componentWillReceiveProps=="func...
  function Tp (line 38) | function Tp(e,t,n,r){var o=e.stateNode;o.props=n,o.state=e.memoizedState...
  function hs (line 38) | function hs(e,t,n){if(e=n.ref,e!==null&&typeof e!="function"&&typeof e!=...
  function gl (line 38) | function gl(e,t){throw e=Object.prototype.toString.call(t),Error(W(31,e=...
  function lg (line 38) | function lg(e){var t=e._init;return t(e._payload)}
  function jx (line 38) | function jx(e){function t(y,g){if(e){var E=y.deletions;E===null?(y.delet...
  function mo (line 38) | function mo(e){if(e===Ma)throw Error(W(174));return e}
  function km (line 38) | function km(e,t){switch(Ce(oa,t),Ce(ra,e),Ce(Mn,Ma),e=t.nodeType,e){case...
  function Fi (line 38) | function Fi(){ke(Mn),ke(ra),ke(oa)}
  function Ux (line 38) | function Ux(e){mo(oa.current);var t=mo(Mn.current),n=op(t,e.type);t!==n&...
  function Nm (line 38) | function Nm(e){ra.current===e&&(ke(Mn),ke(ra))}
  function $c (line 38) | function $c(e){for(var t=e;t!==null;){if(t.tag===13){var n=t.memoizedSta...
  function Am (line 38) | function Am(){for(var e=0;e<Wf.length;e++)Wf[e]._workInProgressVersionPr...
  function ut (line 38) | function ut(){throw Error(W(321))}
  function Dm (line 38) | function Dm(e,t){if(t===null)return!1;for(var n=0;n<t.length&&n<e.length...
  function Im (line 38) | function Im(e,t,n,r,o,i){if(ko=i,Pe=t,t.memoizedState=null,t.updateQueue...
  function Rm (line 38) | function Rm(){var e=ia!==0;return ia=0,e}
  function Rn (line 38) | function Rn(){var e={memoizedState:null,baseState:null,baseQueue:null,qu...
  function tn (line 38) | function tn(){if(We===null){var e=Pe.alternate;e=e!==null?e.memoizedStat...
  function sa (line 38) | function sa(e,t){return typeof t=="function"?t(e):t}
  function Yf (line 38) | function Yf(e){var t=tn(),n=t.queue;if(n===null)throw Error(W(311));n.la...
  function Zf (line 38) | function Zf(e){var t=tn(),n=t.queue;if(n===null)throw Error(W(311));n.la...
  function Bx (line 38) | function Bx(){}
  function zx (line 38) | function zx(e,t){var n=Pe,r=tn(),o=t(),i=!Cn(r.memoizedState,o);if(i&&(r...
  function Hx (line 38) | function Hx(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},t=Pe.updateQ...
  function Gx (line 38) | function Gx(e,t,n,r){t.value=n,t.getSnapshot=r,Qx(t)&&Yx(e)}
  function Wx (line 38) | function Wx(e,t,n){return n(function(){Qx(t)&&Yx(e)})}
  function Qx (line 38) | function Qx(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!Cn(e,n...
  function Yx (line 38) | function Yx(e){var t=ir(e,1);t!==null&&wn(t,e,1,-1)}
  function cg (line 38) | function cg(e){var t=Rn();return typeof e=="function"&&(e=e()),t.memoize...
  function aa (line 38) | function aa(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null...
  function Zx (line 38) | function Zx(){return tn().memoizedState}
  function nc (line 38) | function nc(e,t,n,r){var o=Rn();Pe.flags|=e,o.memoizedState=aa(1|t,n,voi...
  function Ru (line 38) | function Ru(e,t,n,r){var o=tn();r=r===void 0?null:r;var i=void 0;if(We!=...
  function ug (line 38) | function ug(e,t){return nc(8390656,8,e,t)}
  function Lm (line 38) | function Lm(e,t){return Ru(2048,8,e,t)}
  function Xx (line 38) | function Xx(e,t){return Ru(4,2,e,t)}
  function Jx (line 38) | function Jx(e,t){return Ru(4,4,e,t)}
  function Kx (line 38) | function Kx(e,t){if(typeof t=="function")return e=e(),t(e),function(){t(...
  function ew (line 38) | function ew(e,t,n){return n=n!=null?n.concat([e]):null,Ru(4,4,Kx.bind(nu...
  function Om (line 38) | function Om(){}
  function tw (line 38) | function tw(e,t){var n=tn();t=t===void 0?null:t;var r=n.memoizedState;re...
  function nw (line 38) | function nw(e,t){var n=tn();t=t===void 0?null:t;var r=n.memoizedState;re...
  function rw (line 38) | function rw(e,t,n){return ko&21?(Cn(n,t)||(n=sx(),Pe.lanes|=n,No|=n,e.ba...
  function qN (line 38) | function qN(e,t){var n=Ee;Ee=n!==0&&4>n?n:4,e(!0);var r=Qf.transition;Qf...
  function ow (line 38) | function ow(){return tn().memoizedState}
  function UN (line 38) | function UN(e,t,n){var r=Mr(e);if(n={lane:r,action:n,hasEagerState:!1,ea...
  function BN (line 38) | function BN(e,t,n){var r=Mr(e),o={lane:r,action:n,hasEagerState:!1,eager...
  function iw (line 38) | function iw(e){var t=e.alternate;return e===Pe||t!==null&&t===Pe}
  function sw (line 38) | function sw(e,t){Ls=Fc=!0;var n=e.pending;n===null?t.next=t:(t.next=n.ne...
  function aw (line 38) | function aw(e,t,n){if(n&4194240){var r=t.lanes;r&=e.pendingLanes,n|=r,t....
  function Mi (line 38) | function Mi(e,t){try{var n="",r=t;do n+=bk(r),r=r.return;while(r);var o=...
  function Xf (line 40) | function Xf(e,t,n){return{value:e,source:null,stack:n??null,digest:t??nu...
  function kp (line 40) | function kp(e,t){try{console.error(t.value)}catch(n){setTimeout(function...
  function lw (line 40) | function lw(e,t,n){n=tr(-1,n),n.tag=3,n.payload={element:null};var r=t.v...
  function cw (line 40) | function cw(e,t,n){n=tr(-1,n),n.tag=3;var r=e.type.getDerivedStateFromEr...
  function fg (line 40) | function fg(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new WN;v...
  function dg (line 40) | function dg(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null...
  function pg (line 40) | function pg(e,t,n,r,o){return e.mode&1?(e.flags|=65536,e.lanes=o,e):(e==...
  function bt (line 40) | function bt(e,t,n,r){t.child=e===null?qx(t,null,n,r):$i(t,e.child,n,r)}
  function hg (line 40) | function hg(e,t,n,r,o){n=n.render;var i=t.ref;return Si(t,o),r=Im(e,t,n,...
  function mg (line 40) | function mg(e,t,n,r,o){if(e===null){var i=n.type;return typeof i=="funct...
  function uw (line 40) | function uw(e,t,n,r,o){if(e!==null){var i=e.memoizedProps;if(Ks(i,r)&&e....
  function fw (line 40) | function fw(e,t,n){var r=t.pendingProps,o=r.children,i=e!==null?e.memoiz...
  function dw (line 40) | function dw(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&...
  function Np (line 40) | function Np(e,t,n,r,o){var i=Dt(n)?Co:mt.current;return i=Oi(t,i),Si(t,o...
  function vg (line 40) | function vg(e,t,n,r,o){if(Dt(n)){var i=!0;Dc(t)}else i=!1;if(Si(t,o),t.s...
  function Ap (line 40) | function Ap(e,t,n,r,o,i){dw(e,t);var s=(t.flags&128)!==0;if(!r&&!s)retur...
  function pw (line 40) | function pw(e){var t=e.stateNode;t.pendingContext?eg(e,t.pendingContext,...
  function gg (line 40) | function gg(e,t,n,r,o){return Pi(),xm(o),t.flags|=256,bt(e,t,n,r),t.child}
  function Ip (line 40) | function Ip(e){return{baseLanes:e,cachePool:null,transitions:null}}
  function hw (line 40) | function hw(e,t,n){var r=t.pendingProps,o=Le.current,i=!1,s=(t.flags&128...
  function Pm (line 40) | function Pm(e,t){return t=Pu({mode:"visible",children:t},e.mode,0,null),...
  function yl (line 40) | function yl(e,t,n,r){return r!==null&&xm(r),$i(t,e.child,null,n),e=Pm(t,...
  function YN (line 40) | function YN(e,t,n,r,o,i,s){if(n)return t.flags&256?(t.flags&=-257,r=Xf(E...
  function yg (line 40) | function yg(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),S...
  function Jf (line 40) | function Jf(e,t,n,r,o){var i=e.memoizedState;i===null?e.memoizedState={i...
  function mw (line 40) | function mw(e,t,n){var r=t.pendingProps,o=r.revealOrder,i=r.tail;if(bt(e...
  function rc (line 40) | function rc(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=nu...
  function sr (line 40) | function sr(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),No|=t.la...
  function ZN (line 40) | function ZN(e,t,n){switch(t.tag){case 3:pw(t),Pi();break;case 5:Ux(t);br...
  function ms (line 40) | function ms(e,t){if(!Ne)switch(e.tailMode){case"hidden":t=e.tail;for(var...
  function ft (line 40) | function ft(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0...
  function XN (line 40) | function XN(e,t,n){var r=t.pendingProps;switch(bm(t),t.tag){case 2:case ...
  function JN (line 40) | function JN(e,t){switch(bm(t),t.tag){case 1:return Dt(t.type)&&Ac(),e=t....
  function pi (line 40) | function pi(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(n...
  function Lp (line 40) | function Lp(e,t,n){try{n()}catch(r){Fe(e,t,r)}}
  function eA (line 40) | function eA(e,t){if(vp=Cc,e=wx(),ym(e)){if("selectionStart"in e)var n={s...
  function Os (line 40) | function Os(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r...
  function Lu (line 40) | function Lu(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==nul...
  function Op (line 40) | function Op(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){...
  function Ew (line 40) | function Ew(e){var t=e.alternate;t!==null&&(e.alternate=null,Ew(t)),e.ch...
  function bw (line 40) | function bw(e){return e.tag===5||e.tag===3||e.tag===4}
  function bg (line 40) | function bg(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||bw(...
  function Pp (line 40) | function Pp(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeTyp...
  function $p (line 40) | function $p(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertB...
  function mr (line 40) | function mr(e,t,n){for(n=n.child;n!==null;)xw(e,t,n),n=n.sibling}
  function xw (line 40) | function xw(e,t,n){if(Fn&&typeof Fn.onCommitFiberUnmount=="function")try...
  function xg (line 40) | function xg(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n...
  function ln (line 40) | function ln(e,t){var n=t.deletions;if(n!==null)for(var r=0;r<n.length;r+...
  function ww (line 40) | function ww(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 1...
  function In (line 40) | function In(e){var t=e.flags;if(t&2){try{e:{for(var n=e.return;n!==null;...
  function tA (line 40) | function tA(e,t,n){X=e,_w(e)}
  function _w (line 40) | function _w(e,t,n){for(var r=(e.mode&1)!==0;X!==null;){var o=X,i=o.child...
  function wg (line 40) | function wg(e){for(;X!==null;){var t=X;if(t.flags&8772){var n=t.alternat...
  function _g (line 40) | function _g(e){for(;X!==null;){var t=X;if(t===e){X=null;break}var n=t.si...
  function Sg (line 40) | function Sg(e){for(;X!==null;){var t=X;try{switch(t.tag){case 0:case 11:...
  function xt (line 40) | function xt(){return pe&6?je():oc!==-1?oc:oc=je()}
  function Mr (line 40) | function Mr(e){return e.mode&1?pe&2&&it!==0?it&-it:VN.transition!==null?...
  function wn (line 40) | function wn(e,t,n,r){if(50<$s)throw $s=0,Mp=null,Error(W(185));Pa(e,n,r)...
  function It (line 40) | function It(e,t){var n=e.callbackNode;Vk(e,t);var r=Sc(e,e===Je?it:0);if...
  function Sw (line 40) | function Sw(e,t){if(oc=-1,ic=0,pe&6)throw Error(W(327));var n=e.callback...
  function Vp (line 40) | function Vp(e,t){var n=Ps;return e.current.memoizedState.isDehydrated&&(...
  function jp (line 40) | function jp(e){Tt===null?Tt=e:Tt.push.apply(Tt,e)}
  function rA (line 40) | function rA(e){for(var t=e;;){if(t.flags&16384){var n=t.updateQueue;if(n...
  function Cr (line 40) | function Cr(e,t){for(t&=~Fm,t&=~Ou,e.suspendedLanes|=t,e.pingedLanes&=~t...
  function Cg (line 40) | function Cg(e){if(pe&6)throw Error(W(327));Ci();var t=Sc(e,0);if(!(t&1))...
  function Vm (line 40) | function Vm(e,t){var n=pe;pe|=1;try{return e(t)}finally{pe=n,pe===0&&(Vi...
  function Ao (line 40) | function Ao(e){kr!==null&&kr.tag===0&&!(pe&6)&&Ci();var t=pe;pe|=1;var n...
  function jm (line 40) | function jm(){Ot=hi.current,ke(hi)}
  function Eo (line 40) | function Eo(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHa...
  function Cw (line 40) | function Cw(e,t){do{var n=Ge;try{if(_m(),tc.current=Mc,Fc){for(var r=Pe....
  function Tw (line 40) | function Tw(){var e=Vc.current;return Vc.current=Mc,e===null?Mc:e}
  function qm (line 40) | function qm(){(Ye===0||Ye===3||Ye===2)&&(Ye=4),Je===null||!(No&268435455...
  function Uc (line 40) | function Uc(e,t){var n=pe;pe|=2;var r=Tw();(Je!==e||it!==t)&&(Zn=null,Eo...
  function oA (line 40) | function oA(){for(;Ge!==null;)kw(Ge)}
  function iA (line 40) | function iA(){for(;Ge!==null&&!Dk();)kw(Ge)}
  function kw (line 40) | function kw(e){var t=Dw(e.alternate,e,Ot);e.memoizedProps=e.pendingProps...
  function Nw (line 40) | function Nw(e){var t=e;do{var n=t.alternate;if(e=t.return,t.flags&32768)...
  function co (line 40) | function co(e,t,n){var r=Ee,o=Kt.transition;try{Kt.transition=null,Ee=1,...
  function sA (line 40) | function sA(e,t,n,r){do Ci();while(kr!==null);if(pe&6)throw Error(W(327)...
  function Ci (line 40) | function Ci(){if(kr!==null){var e=ax(qc),t=Kt.transition,n=Ee;try{if(Kt....
  function Tg (line 40) | function Tg(e,t,n){t=Mi(n,t),t=lw(e,t,1),e=$r(e,t,1),t=xt(),e!==null&&(P...
  function Fe (line 40) | function Fe(e,t,n){if(e.tag===3)Tg(e,e,n);else for(;t!==null;){if(t.tag=...
  function aA (line 40) | function aA(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),t=xt(),e.ping...
  function Aw (line 40) | function Aw(e,t){t===0&&(e.mode&1?(t=ul,ul<<=1,!(ul&130023424)&&(ul=4194...
  function lA (line 40) | function lA(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Aw(e,n)}
  function cA (line 40) | function cA(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.mem...
  function Iw (line 40) | function Iw(e,t){return rx(e,t)}
  function uA (line 40) | function uA(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this....
  function Zt (line 40) | function Zt(e,t,n,r){return new uA(e,t,n,r)}
  function Um (line 40) | function Um(e){return e=e.prototype,!(!e||!e.isReactComponent)}
  function fA (line 40) | function fA(e){if(typeof e=="function")return Um(e)?1:0;if(e!=null){if(e...
  function Vr (line 40) | function Vr(e,t){var n=e.alternate;return n===null?(n=Zt(e.tag,t,e.key,e...
  function sc (line 40) | function sc(e,t,n,r,o,i){var s=2;if(r=e,typeof e=="function")Um(e)&&(s=1...
  function bo (line 40) | function bo(e,t,n,r){return e=Zt(7,e,r,t),e.lanes=n,e}
  function Pu (line 40) | function Pu(e,t,n,r){return e=Zt(22,e,r,t),e.elementType=jb,e.lanes=n,e....
  function Kf (line 40) | function Kf(e,t,n){return e=Zt(6,e,null,t),e.lanes=n,e}
  function ed (line 40) | function ed(e,t,n){return t=Zt(4,e.children!==null?e.children:[],e.key,t...
  function dA (line 40) | function dA(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork...
  function Bm (line 40) | function Bm(e,t,n,r,o,i,s,a,l){return e=new dA(e,t,n,a,l),t===1?(t=1,i==...
  function pA (line 40) | function pA(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?argum...
  function Rw (line 40) | function Rw(e){if(!e)return Br;e=e._reactInternals;e:{if(jo(e)!==e||e.ta...
  function Lw (line 40) | function Lw(e,t,n,r,o,i,s,a,l){return e=Bm(n,r,!0,e,o,i,s,a,l),e.context...
  function $u (line 40) | function $u(e,t,n,r){var o=t.current,i=xt(),s=Mr(o);return n=Rw(n),t.con...
  function Bc (line 40) | function Bc(e){if(e=e.current,!e.child)return null;switch(e.child.tag){c...
  function kg (line 40) | function kg(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var...
  function zm (line 40) | function zm(e,t){kg(e,t),(e=e.alternate)&&kg(e,t)}
  function hA (line 40) | function hA(){return null}
  function Hm (line 40) | function Hm(e){this._internalRoot=e}
  function Fu (line 40) | function Fu(e){this._internalRoot=e}
  function Gm (line 40) | function Gm(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
  function Mu (line 40) | function Mu(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==...
  function Ng (line 40) | function Ng(){}
  function mA (line 40) | function mA(e,t,n,r,o){if(o){if(typeof r=="function"){var i=r;r=function...
  function Vu (line 40) | function Vu(e,t,n,r,o){var i=n._reactRootContainer;if(i){var s=i;if(type...
  function Pw (line 40) | function Pw(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __R...
  function o (line 40) | function o(i){return i instanceof n?i:new n(function(s){s(i)})}
  function a (line 40) | function a(u){try{c(r.next(u))}catch(d){s(d)}}
  function l (line 40) | function l(u){try{c(r.throw(u))}catch(d){s(d)}}
  function c (line 40) | function c(u){u.done?i(u.value):o(u.value).then(a,l)}
  function Dg (line 40) | function Dg(e){return typeof e=="object"&&e!==null&&typeof e.then=="func...
  function yA (line 40) | function yA(e){return new Promise((t,n)=>{const r=e.subscribe({next(o){t...
  function Fw (line 40) | function Fw(e){return typeof e=="object"&&e!==null&&"subscribe"in e&&typ...
  function Mw (line 40) | function Mw(e){return typeof e=="object"&&e!==null&&(e[Symbol.toStringTa...
  function EA (line 40) | function EA(e){var t;return $w(this,void 0,void 0,function*(){const n=(t...
  function Ig (line 40) | function Ig(e){return $w(this,void 0,void 0,function*(){const t=yield e;...
  function ge (line 40) | function ge(e,t){if(!!!e)throw new Error(t)}
  function ar (line 40) | function ar(e){return typeof e=="object"&&e!==null}
  function ju (line 40) | function ju(e,t){if(!!!e)throw new Error(t??"Unexpected invariant trigge...
  function Up (line 40) | function Up(e,t){let n=0,r=1;for(const o of e.body.matchAll(bA)){if(type...
  function xA (line 40) | function xA(e){return Vw(e.source,Up(e.source,e.start))}
  function Vw (line 40) | function Vw(e,t){const n=e.locationOffset.column-1,r="".padStart(n)+e.bo...
  function Rg (line 41) | function Rg(e){const t=e.filter(([r,o])=>o!==void 0),n=Math.max(...t.map...
  function wA (line 42) | function wA(e){const t=e[0];return t==null||"kind"in t||"length"in t?{no...
  class ve (line 42) | class ve extends Error{constructor(t,...n){var r,o,i;const{nodes:s,sourc...
    method constructor (line 42) | constructor(t,...n){var r,o,i;const{nodes:s,source:a,positions:l,path:...
    method toString (line 42) | toString(){let t=this.message;if(this.nodes)for(const n of this.nodes)...
    method toJSON (line 46) | toJSON(){const t={message:this.message};return this.locations!=null&&(...
  method [Symbol.toStringTag] (line 42) | get[Symbol.toStringTag](){return"GraphQLError"}
  function Lg (line 46) | function Lg(e){return e===void 0||e.length===0?void 0:e}
  function Xe (line 46) | function Xe(e,t,n){return new ve(`Syntax Error: ${n}`,{source:e,position...
  method constructor (line 46) | constructor(t,n,r){this.start=t.start,this.end=n.end,this.startToken=t,t...
  method [Symbol.toStringTag] (line 46) | get[Symbol.toStringTag](){return"Location"}
  method toJSON (line 46) | toJSON(){return{start:this.start,end:this.end}}
  method constructor (line 46) | constructor(t,n,r,o,i,s){this.kind=t,this.start=n,this.end=r,this.line=o...
  method [Symbol.toStringTag] (line 46) | get[Symbol.toStringTag](){return"Token"}
  method toJSON (line 46) | toJSON(){return{kind:this.kind,value:this.value,line:this.line,column:th...
  function Bp (line 46) | function Bp(e){const t=e==null?void 0:e.kind;return typeof t=="string"&&...
  function zp (line 46) | function zp(e){return e===9||e===32}
  function ca (line 46) | function ca(e){return e>=48&&e<=57}
  function Uw (line 46) | function Uw(e){return e>=97&&e<=122||e>=65&&e<=90}
  function Wm (line 46) | function Wm(e){return Uw(e)||e===95}
  function Bw (line 46) | function Bw(e){return Uw(e)||ca(e)||e===95}
  function CA (line 46) | function CA(e){var t;let n=Number.MAX_SAFE_INTEGER,r=null,o=-1;for(let s...
  function TA (line 46) | function TA(e){let t=0;for(;t<e.length&&zp(e.charCodeAt(t));)++t;return t}
  function kA (line 46) | function kA(e,t){const n=e.replace(/"""/g,'\\"""'),r=n.split(/\r\n|[\n\r...
  class NA (line 48) | class NA{constructor(t){const n=new jw(B.SOF,0,0,0,0);this.source=t,this...
    method constructor (line 48) | constructor(t){const n=new jw(B.SOF,0,0,0,0);this.source=t,this.lastTo...
    method advance (line 48) | advance(){return this.lastToken=this.token,this.token=this.lookahead()}
    method lookahead (line 48) | lookahead(){let t=this.token;if(t.kind!==B.EOF)do if(t.next)t=t.next;e...
  method [Symbol.toStringTag] (line 48) | get[Symbol.toStringTag](){return"Lexer"}
  function AA (line 48) | function AA(e){return e===B.BANG||e===B.DOLLAR||e===B.AMP||e===B.PAREN_L...
  function Xi (line 48) | function Xi(e){return e>=0&&e<=55295||e>=57344&&e<=1114111}
  function qu (line 48) | function qu(e,t){return zw(e.charCodeAt(t))&&Hw(e.charCodeAt(t+1))}
  function zw (line 48) | function zw(e){return e>=55296&&e<=56319}
  function Hw (line 48) | function Hw(e){return e>=56320&&e<=57343}
  function Do (line 48) | function Do(e,t){const n=e.source.body.codePointAt(t);if(n===void 0)retu...
  function He (line 48) | function He(e,t,n,r,o){const i=e.line,s=1+n-e.lineStart;return new jw(t,...
  function DA (line 48) | function DA(e,t){const n=e.source.body,r=n.length;let o=t;for(;o<r;){con...
  function IA (line 48) | function IA(e,t){const n=e.source.body,r=n.length;let o=t+1;for(;o<r;){c...
  function RA (line 48) | function RA(e,t,n){const r=e.source.body;let o=t,i=n,s=!1;if(i===45&&(i=...
  function td (line 48) | function td(e,t,n){if(!ca(n))throw Xe(e.source,t,`Invalid number, expect...
  function LA (line 48) | function LA(e,t){const n=e.source.body,r=n.length;let o=t+1,i=o,s="";for...
  function OA (line 48) | function OA(e,t){const n=e.source.body;let r=0,o=3;for(;o<12;){const i=n...
  function PA (line 48) | function PA(e,t){const n=e.source.body,r=Og(n,t+2);if(Xi(r))return{value...
  function Og (line 48) | function Og(e,t){return Ss(e.charCodeAt(t))<<12|Ss(e.charCodeAt(t+1))<<8...
  function Ss (line 48) | function Ss(e){return e>=48&&e<=57?e-48:e>=65&&e<=70?e-55:e>=97&&e<=102?...
  function $A (line 48) | function $A(e,t){const n=e.source.body;switch(n.charCodeAt(t+1)){case 34...
  function FA (line 49) | function FA(e,t){const n=e.source.body,r=n.length;let o=e.lineStart,i=t+...
  function MA (line 50) | function MA(e,t){const n=e.source.body,r=n.length;let o=t+1;for(;o<r;){c...
  function J (line 50) | function J(e){return Uu(e,[])}
  function Uu (line 50) | function Uu(e,t){switch(typeof e){case"string":return JSON.stringify(e);...
  function jA (line 50) | function jA(e,t){if(e===null)return"null";if(t.includes(e))return"[Circu...
  function qA (line 50) | function qA(e){return typeof e.toJSON=="function"}
  function UA (line 50) | function UA(e,t){const n=Object.entries(e);return n.length===0?"{}":t.le...
  function BA (line 50) | function BA(e,t){if(e.length===0)return"[]";if(t.length>Gw)return"[Array...
  function zA (line 50) | function zA(e){const t=Object.prototype.toString.call(e).replace(/^\[obj...
  class Ww (line 61) | class Ww{constructor(t,n="GraphQL request",r={line:1,column:1}){typeof t...
    method constructor (line 61) | constructor(t,n="GraphQL request",r={line:1,column:1}){typeof t=="stri...
  method [Symbol.toStringTag] (line 61) | get[Symbol.toStringTag](){return"Source"}
  function HA (line 61) | function HA(e){return kn(e,Ww)}
  function qo (line 61) | function qo(e,t){return new Qw(e,t).parseDocument()}
  function GA (line 61) | function GA(e,t){const n=new Qw(e,t);n.expectToken(B.SOF);const r=n.pars...
  class Qw (line 61) | class Qw{constructor(t,n={}){const r=HA(t)?t:new Ww(t);this._lexer=new N...
    method constructor (line 61) | constructor(t,n={}){const r=HA(t)?t:new Ww(t);this._lexer=new NA(r),th...
    method parseName (line 61) | parseName(){const t=this.expectToken(B.NAME);return this.node(t,{kind:...
    method parseDocument (line 61) | parseDocument(){return this.node(this._lexer.token,{kind:L.DOCUMENT,de...
    method parseDefinition (line 61) | parseDefinition(){if(this.peek(B.BRACE_L))return this.parseOperationDe...
    method parseOperationDefinition (line 61) | parseOperationDefinition(){const t=this._lexer.token;if(this.peek(B.BR...
    method parseOperationType (line 61) | parseOperationType(){const t=this.expectToken(B.NAME);switch(t.value){...
    method parseVariableDefinitions (line 61) | parseVariableDefinitions(){return this.optionalMany(B.PAREN_L,this.par...
    method parseVariableDefinition (line 61) | parseVariableDefinition(){return this.node(this._lexer.token,{kind:L.V...
    method parseVariable (line 61) | parseVariable(){const t=this._lexer.token;return this.expectToken(B.DO...
    method parseSelectionSet (line 61) | parseSelectionSet(){return this.node(this._lexer.token,{kind:L.SELECTI...
    method parseSelection (line 61) | parseSelection(){return this.peek(B.SPREAD)?this.parseFragment():this....
    method parseField (line 61) | parseField(){const t=this._lexer.token,n=this.parseName();let r,o;retu...
    method parseArguments (line 61) | parseArguments(t){const n=t?this.parseConstArgument:this.parseArgument...
    method parseArgument (line 61) | parseArgument(t=!1){const n=this._lexer.token,r=this.parseName();retur...
    method parseConstArgument (line 61) | parseConstArgument(){return this.parseArgument(!0)}
    method parseFragment (line 61) | parseFragment(){const t=this._lexer.token;this.expectToken(B.SPREAD);c...
    method parseFragmentDefinition (line 61) | parseFragmentDefinition(){const t=this._lexer.token;return this.expect...
    method parseFragmentName (line 61) | parseFragmentName(){if(this._lexer.token.value==="on")throw this.unexp...
    method parseValueLiteral (line 61) | parseValueLiteral(t){const n=this._lexer.token;switch(n.kind){case B.B...
    method parseConstValueLiteral (line 61) | parseConstValueLiteral(){return this.parseValueLiteral(!0)}
    method parseStringLiteral (line 61) | parseStringLiteral(){const t=this._lexer.token;return this.advanceLexe...
    method parseList (line 61) | parseList(t){const n=()=>this.parseValueLiteral(t);return this.node(th...
    method parseObject (line 61) | parseObject(t){const n=()=>this.parseObjectField(t);return this.node(t...
    method parseObjectField (line 61) | parseObjectField(t){const n=this._lexer.token,r=this.parseName();retur...
    method parseDirectives (line 61) | parseDirectives(t){const n=[];for(;this.peek(B.AT);)n.push(this.parseD...
    method parseConstDirectives (line 61) | parseConstDirectives(){return this.parseDirectives(!0)}
    method parseDirective (line 61) | parseDirective(t){const n=this._lexer.token;return this.expectToken(B....
    method parseTypeReference (line 61) | parseTypeReference(){const t=this._lexer.token;let n;if(this.expectOpt...
    method parseNamedType (line 61) | parseNamedType(){return this.node(this._lexer.token,{kind:L.NAMED_TYPE...
    method peekDescription (line 61) | peekDescription(){return this.peek(B.STRING)||this.peek(B.BLOCK_STRING)}
    method parseDescription (line 61) | parseDescription(){if(this.peekDescription())return this.parseStringLi...
    method parseSchemaDefinition (line 61) | parseSchemaDefinition(){const t=this._lexer.token,n=this.parseDescript...
    method parseOperationTypeDefinition (line 61) | parseOperationTypeDefinition(){const t=this._lexer.token,n=this.parseO...
    method parseScalarTypeDefinition (line 61) | parseScalarTypeDefinition(){const t=this._lexer.token,n=this.parseDesc...
    method parseObjectTypeDefinition (line 61) | parseObjectTypeDefinition(){const t=this._lexer.token,n=this.parseDesc...
    method parseImplementsInterfaces (line 61) | parseImplementsInterfaces(){return this.expectOptionalKeyword("impleme...
    method parseFieldsDefinition (line 61) | parseFieldsDefinition(){return this.optionalMany(B.BRACE_L,this.parseF...
    method parseFieldDefinition (line 61) | parseFieldDefinition(){const t=this._lexer.token,n=this.parseDescripti...
    method parseArgumentDefs (line 61) | parseArgumentDefs(){return this.optionalMany(B.PAREN_L,this.parseInput...
    method parseInputValueDef (line 61) | parseInputValueDef(){const t=this._lexer.token,n=this.parseDescription...
    method parseInterfaceTypeDefinition (line 61) | parseInterfaceTypeDefinition(){const t=this._lexer.token,n=this.parseD...
    method parseUnionTypeDefinition (line 61) | parseUnionTypeDefinition(){const t=this._lexer.token,n=this.parseDescr...
    method parseUnionMemberTypes (line 61) | parseUnionMemberTypes(){return this.expectOptionalToken(B.EQUALS)?this...
    method parseEnumTypeDefinition (line 61) | parseEnumTypeDefinition(){const t=this._lexer.token,n=this.parseDescri...
    method parseEnumValuesDefinition (line 61) | parseEnumValuesDefinition(){return this.optionalMany(B.BRACE_L,this.pa...
    method parseEnumValueDefinition (line 61) | parseEnumValueDefinition(){const t=this._lexer.token,n=this.parseDescr...
    method parseEnumValueName (line 61) | parseEnumValueName(){if(this._lexer.token.value==="true"||this._lexer....
    method parseInputObjectTypeDefinition (line 61) | parseInputObjectTypeDefinition(){const t=this._lexer.token,n=this.pars...
    method parseInputFieldsDefinition (line 61) | parseInputFieldsDefinition(){return this.optionalMany(B.BRACE_L,this.p...
    method parseTypeSystemExtension (line 61) | parseTypeSystemExtension(){const t=this._lexer.lookahead();if(t.kind==...
    method parseSchemaExtension (line 61) | parseSchemaExtension(){const t=this._lexer.token;this.expectKeyword("e...
    method parseScalarTypeExtension (line 61) | parseScalarTypeExtension(){const t=this._lexer.token;this.expectKeywor...
    method parseObjectTypeExtension (line 61) | parseObjectTypeExtension(){const t=this._lexer.token;this.expectKeywor...
    method parseInterfaceTypeExtension (line 61) | parseInterfaceTypeExtension(){const t=this._lexer.token;this.expectKey...
    method parseUnionTypeExtension (line 61) | parseUnionTypeExtension(){const t=this._lexer.token;this.expectKeyword...
    method parseEnumTypeExtension (line 61) | parseEnumTypeExtension(){const t=this._lexer.token;this.expectKeyword(...
    method parseInputObjectTypeExtension (line 61) | parseInputObjectTypeExtension(){const t=this._lexer.token;this.expectK...
    method parseDirectiveDefinition (line 61) | parseDirectiveDefinition(){const t=this._lexer.token,n=this.parseDescr...
    method parseDirectiveLocations (line 61) | parseDirectiveLocations(){return this.delimitedMany(B.PIPE,this.parseD...
    method parseDirectiveLocation (line 61) | parseDirectiveLocation(){const t=this._lexer.token,n=this.parseName();...
    method node (line 61) | node(t,n){return this._options.noLocation!==!0&&(n.loc=new _A(t,this._...
    method peek (line 61) | peek(t){return this._lexer.token.kind===t}
    method expectToken (line 61) | expectToken(t){const n=this._lexer.token;if(n.kind===t)return this.adv...
    method expectOptionalToken (line 61) | expectOptionalToken(t){return this._lexer.token.kind===t?(this.advance...
    method expectKeyword (line 61) | expectKeyword(t){const n=this._lexer.token;if(n.kind===B.NAME&&n.value...
    method expectOptionalKeyword (line 61) | expectOptionalKeyword(t){const n=this._lexer.token;return n.kind===B.N...
    method unexpected (line 61) | unexpected(t){const n=t??this._lexer.token;return Xe(this._lexer.sourc...
    method any (line 61) | any(t,n,r){this.expectToken(t);const o=[];for(;!this.expectOptionalTok...
    method optionalMany (line 61) | optionalMany(t,n,r){if(this.expectOptionalToken(t)){const o=[];do o.pu...
    method many (line 61) | many(t,n,r){this.expectToken(t);const o=[];do o.push(n.call(this));whi...
    method delimitedMany (line 61) | delimitedMany(t,n){this.expectOptionalToken(t);const r=[];do r.push(n....
    method advanceLexer (line 61) | advanceLexer(){const{maxTokens:t}=this._options,n=this._lexer.advance(...
  function wl (line 61) | function wl(e){const t=e.value;return Yw(e.kind)+(t!=null?` "${t}"`:"")}
  function Yw (line 61) | function Yw(e){return AA(e)?`"${e}"`:e}
  function QA (line 61) | function QA(e,t){const[n,r]=t?[e,t]:[void 0,e];let o=" Did you mean ";n&...
  function Pg (line 61) | function Pg(e){return e}
  function Zw (line 61) | function Zw(e,t){const n=Object.create(null);for(const r of e)n[t(r)]=r;...
  function vo (line 61) | function vo(e,t,n){const r=Object.create(null);for(const o of e)r[t(o)]=...
  function Bu (line 61) | function Bu(e,t){const n=Object.create(null);for(const r of Object.keys(...
  function YA (line 61) | function YA(e,t){let n=0,r=0;for(;n<e.length&&r<t.length;){let o=e.charC...
  function _l (line 61) | function _l(e){return!isNaN(e)&&Hp<=e&&e<=ZA}
  function XA (line 61) | function XA(e,t){const n=Object.create(null),r=new JA(e),o=Math.floor(e....
  class JA (line 61) | class JA{constructor(t){this._input=t,this._inputLowerCase=t.toLowerCase...
    method constructor (line 61) | constructor(t){this._input=t,this._inputLowerCase=t.toLowerCase(),this...
    method measure (line 61) | measure(t,n){if(this._input===t)return 0;const r=t.toLowerCase();if(th...
  function $g (line 61) | function $g(e){const t=e.length,n=new Array(t);for(let r=0;r<t;++r)n[r]=...
  function an (line 61) | function an(e){if(e==null)return Object.create(null);if(Object.getProtot...
  function KA (line 61) | function KA(e){return`"${e.replace(eD,tD)}"`}
  function tD (line 61) | function tD(e){return nD[e.charCodeAt(0)]}
  function Tn (line 61) | function Tn(e,t,n=qw){const r=new Map;for(const y of Object.values(L))r....
  function i_e (line 61) | function i_e(e){const t=new Array(e.length).fill(null),n=Object.create(n...
  function zc (line 61) | function zc(e,t){const n=e[t];return typeof n=="object"?n:typeof n=="fun...
  function Ut (line 61) | function Ut(e){return Tn(e,oD)}
  method leave (line 63) | leave(e){const t=le("(",K(e.variableDefinitions,", "),")"),n=K([e.operat...
  method leave (line 63) | leave({alias:e,name:t,arguments:n,directives:r,selectionSet:o}){const i=...
  function K (line 83) | function K(e,t=""){var n;return(n=e==null?void 0:e.filter(r=>r).join(t))...
  function cn (line 83) | function cn(e){return le(`{
  function le (line 86) | function le(e,t,n=""){return t!=null&&t!==""?e+t+n:""}
  function ac (line 86) | function ac(e){return le("  ",e.replace(/\n/g,`
  function Fg (line 87) | function Fg(e){var t;return(t=e==null?void 0:e.some(n=>n.includes(`
  function Gp (line 88) | function Gp(e,t){switch(e.kind){case L.NULL:return null;case L.INT:retur...
  function Nn (line 88) | function Nn(e){if(e!=null||ge(!1,"Must provide name."),typeof e=="string...
  function iD (line 88) | function iD(e){if(e==="true"||e==="false"||e==="null")throw new ve(`Enum...
  function Qm (line 88) | function Qm(e){return Zr(e)||Ae(e)||De(e)||nn(e)||Bt(e)||vt(e)||wt(e)||q...
  function Zr (line 88) | function Zr(e){return kn(e,Uo)}
  function Ae (line 88) | function Ae(e){return kn(e,zn)}
  function sD (line 88) | function sD(e){if(!Ae(e))throw new Error(`Expected ${J(e)} to be a Graph...
  function De (line 88) | function De(e){return kn(e,ki)}
  function aD (line 88) | function aD(e){if(!De(e))throw new Error(`Expected ${J(e)} to be a Graph...
  function nn (line 88) | function nn(e){return kn(e,s_)}
  function Bt (line 88) | function Bt(e){return kn(e,Ji)}
  function vt (line 88) | function vt(e){return kn(e,Jm)}
  function wt (line 88) | function wt(e){return kn(e,kt)}
  function qe (line 88) | function qe(e){return kn(e,ce)}
  function Yt (line 88) | function Yt(e){return Zr(e)||Bt(e)||vt(e)||Ym(e)&&Yt(e.ofType)}
  function xo (line 88) | function xo(e){return Zr(e)||Ae(e)||De(e)||nn(e)||Bt(e)||Ym(e)&&xo(e.ofT...
  function zu (line 88) | function zu(e){return Zr(e)||Bt(e)}
  function Jt (line 88) | function Jt(e){return Ae(e)||De(e)||nn(e)}
  function jr (line 88) | function jr(e){return De(e)||nn(e)}
  function lD (line 88) | function lD(e){if(!jr(e))throw new Error(`Expected ${J(e)} to be a Graph...
  class kt (line 88) | class kt{constructor(t){Qm(t)||ge(!1,`Expected ${J(t)} to be a GraphQL t...
    method constructor (line 88) | constructor(t){Qm(t)||ge(!1,`Expected ${J(t)} to be a GraphQL type.`),...
    method toString (line 88) | toString(){return"["+String(this.ofType)+"]"}
    method toJSON (line 88) | toJSON(){return this.toString()}
  method [Symbol.toStringTag] (line 88) | get[Symbol.toStringTag](){return"GraphQLList"}
  class ce (line 88) | class ce{constructor(t){Xw(t)||ge(!1,`Expected ${J(t)} to be a GraphQL n...
    method constructor (line 88) | constructor(t){Xw(t)||ge(!1,`Expected ${J(t)} to be a GraphQL nullable...
    method toString (line 88) | toString(){return String(this.ofType)+"!"}
    method toJSON (line 88) | toJSON(){return this.toString()}
  method [Symbol.toStringTag] (line 88) | get[Symbol.toStringTag](){return"GraphQLNonNull"}
  function Ym (line 88) | function Ym(e){return wt(e)||qe(e)}
  function Xw (line 88) | function Xw(e){return Qm(e)&&!qe(e)}
  function cD (line 88) | function cD(e){if(!Xw(e))throw new Error(`Expected ${J(e)} to be a Graph...
  function Jw (line 88) | function Jw(e){if(e)return qe(e)?e.ofType:e}
  function Zm (line 88) | function Zm(e){return Zr(e)||Ae(e)||De(e)||nn(e)||Bt(e)||vt(e)}
  function Ft (line 88) | function Ft(e){if(e){let t=e;for(;Ym(t);)t=t.ofType;return t}}
  function Kw (line 88) | function Kw(e){return typeof e=="function"?e():e}
  function e_ (line 88) | function e_(e){return typeof e=="function"?e():e}
  class Uo (line 88) | class Uo{constructor(t){var n,r,o,i;const s=(n=t.parseValue)!==null&&n!=...
    method constructor (line 88) | constructor(t){var n,r,o,i;const s=(n=t.parseValue)!==null&&n!==void 0...
    method toConfig (line 88) | toConfig(){return{name:this.name,description:this.description,specifie...
    method toString (line 88) | toString(){return this.name}
    method toJSON (line 88) | toJSON(){return this.toString()}
  method [Symbol.toStringTag] (line 88) | get[Symbol.toStringTag](){return"GraphQLScalarType"}
  class zn (line 88) | class zn{constructor(t){var n;this.name=Nn(t.name),this.description=t.de...
    method constructor (line 88) | constructor(t){var n;this.name=Nn(t.name),this.description=t.descripti...
    method getFields (line 88) | getFields(){return typeof this._fields=="function"&&(this._fields=this...
    method getInterfaces (line 88) | getInterfaces(){return typeof this._interfaces=="function"&&(this._int...
    method toConfig (line 88) | toConfig(){return{name:this.name,description:this.description,interfac...
    method toString (line 88) | toString(){return this.name}
    method toJSON (line 88) | toJSON(){return this.toString()}
  method [Symbol.toStringTag] (line 88) | get[Symbol.toStringTag](){return"GraphQLObjectType"}
  function t_ (line 88) | function t_(e){var t;const n=Kw((t=e.interfaces)!==null&&t!==void 0?t:[]...
  function n_ (line 88) | function n_(e){const t=e_(e.fields);return Ti(t)||ge(!1,`${e.name} field...
  function r_ (line 88) | function r_(e){return Object.entries(e).map(([t,n])=>({name:Nn(t),descri...
  function Ti (line 88) | function Ti(e){return ar(e)&&!Array.isArray(e)}
  function o_ (line 88) | function o_(e){return Bu(e,t=>({description:t.description,type:t.type,ar...
  function i_ (line 88) | function i_(e){return vo(e,t=>t.name,t=>({description:t.description,type...
  function Xm (line 88) | function Xm(e){return qe(e.type)&&e.defaultValue===void 0}
  class ki (line 88) | class ki{constructor(t){var n;this.name=Nn(t.name),this.description=t.de...
    method constructor (line 88) | constructor(t){var n;this.name=Nn(t.name),this.description=t.descripti...
    method getFields (line 88) | getFields(){return typeof this._fields=="function"&&(this._fields=this...
    method getInterfaces (line 88) | getInterfaces(){return typeof this._interfaces=="function"&&(this._int...
    method toConfig (line 88) | toConfig(){return{name:this.name,description:this.description,interfac...
    method toString (line 88) | toString(){return this.name}
    method toJSON (line 88) | toJSON(){return this.toString()}
  method [Symbol.toStringTag] (line 88) | get[Symbol.toStringTag](){return"GraphQLInterfaceType"}
  class s_ (line 88) | class s_{constructor(t){var n;this.name=Nn(t.name),this.description=t.de...
    method constructor (line 88) | constructor(t){var n;this.name=Nn(t.name),this.description=t.descripti...
    method getTypes (line 88) | getTypes(){return typeof this._types=="function"&&(this._types=this._t...
    method toConfig (line 88) | toConfig(){return{name:this.name,description:this.description,types:th...
    method toString (line 88) | toString(){return this.name}
    method toJSON (line 88) | toJSON(){return this.toString()}
  method [Symbol.toStringTag] (line 88) | get[Symbol.toStringTag](){return"GraphQLUnionType"}
  function uD (line 88) | function uD(e){const t=Kw(e.types);return Array.isArray(t)||ge(!1,`Must ...
  class Ji (line 88) | class Ji{constructor(t){var n;this.name=Nn(t.name),this.description=t.de...
    method constructor (line 88) | constructor(t){var n;this.name=Nn(t.name),this.description=t.descripti...
    method getValues (line 88) | getValues(){return this._values}
    method getValue (line 88) | getValue(t){return this._nameLookup[t]}
    method serialize (line 88) | serialize(t){const n=this._valueLookup.get(t);if(n===void 0)throw new ...
    method parseValue (line 88) | parseValue(t){if(typeof t!="string"){const r=J(t);throw new ve(`Enum "...
    method parseLiteral (line 88) | parseLiteral(t,n){if(t.kind!==L.ENUM){const o=Ut(t);throw new ve(`Enum...
    method toConfig (line 88) | toConfig(){const t=vo(this.getValues(),n=>n.name,n=>({description:n.de...
    method toString (line 88) | toString(){return this.name}
    method toJSON (line 88) | toJSON(){return this.toString()}
  method [Symbol.toStringTag] (line 88) | get[Symbol.toStringTag](){return"GraphQLEnumType"}
  function Sl (line 88) | function Sl(e,t){const n=e.getValues().map(o=>o.name),r=XA(t,n);return Q...
  function fD (line 88) | function fD(e,t){return Ti(t)||ge(!1,`${e} values must be an object with...
  class Jm (line 88) | class Jm{constructor(t){var n;this.name=Nn(t.name),this.description=t.de...
    method constructor (line 88) | constructor(t){var n;this.name=Nn(t.name),this.description=t.descripti...
    method getFields (line 88) | getFields(){return typeof this._fields=="function"&&(this._fields=this...
    method toConfig (line 88) | toConfig(){const t=Bu(this.getFields(),n=>({description:n.description,...
    method toString (line 88) | toString(){return this.name}
    method toJSON (line 88) | toJSON(){return this.toString()}
  method [Symbol.toStringTag] (line 88) | get[Symbol.toStringTag](){return"GraphQLInputObjectType"}
  function dD (line 88) | function dD(e){const t=e_(e.fields);return Ti(t)||ge(!1,`${e.name} field...
  function pD (line 88) | function pD(e){return qe(e.type)&&e.defaultValue===void 0}
  function Wp (line 88) | function Wp(e,t){return e===t?!0:qe(e)&&qe(t)||wt(e)&&wt(t)?Wp(e.ofType,...
  function lc (line 88) | function lc(e,t,n){return t===n?!0:qe(n)?qe(t)?lc(e,t.ofType,n.ofType):!...
  function hD (line 88) | function hD(e,t,n){return t===n?!0:jr(t)?jr(n)?e.getPossibleTypes(t).som...
  method serialize (line 88) | serialize(e){const t=ja(e);if(typeof t=="boolean")return t?1:0;let n=t;i...
  method parseValue (line 88) | parseValue(e){if(typeof e!="number"||!Number.isInteger(e))throw new ve(`...
  method parseLiteral (line 88) | parseLiteral(e){if(e.kind!==L.INT)throw new ve(`Int cannot represent non...
  method serialize (line 88) | serialize(e){const t=ja(e);if(typeof t=="boolean")return t?1:0;let n=t;i...
  method parseValue (line 88) | parseValue(e){if(typeof e!="number"||!Number.isFinite(e))throw new ve(`F...
  method parseLiteral (line 88) | parseLiteral(e){if(e.kind!==L.FLOAT&&e.kind!==L.INT)throw new ve(`Float ...
  method serialize (line 88) | serialize(e){const t=ja(e);if(typeof t=="string")return t;if(typeof t=="...
  method parseValue (line 88) | parseValue(e){if(typeof e!="string")throw new ve(`String cannot represen...
  method parseLiteral (line 88) | parseLiteral(e){if(e.kind!==L.STRING)throw new ve(`String cannot represe...
  method serialize (line 88) | serialize(e){const t=ja(e);if(typeof t=="boolean")return t;if(Number.isF...
  method parseValue (line 88) | parseValue(e){if(typeof e!="boolean")throw new ve(`Boolean cannot repres...
  method parseLiteral (line 88) | parseLiteral(e){if(e.kind!==L.BOOLEAN)throw new ve(`Boolean cannot repre...
  method serialize (line 88) | serialize(e){const t=ja(e);if(typeof t=="string")return t;if(Number.isIn...
  method parseValue (line 88) | parseValue(e){if(typeof e=="string")return e;if(typeof e=="number"&&Numb...
  method parseLiteral (line 88) | parseLiteral(e){if(e.kind!==L.STRING&&e.kind!==L.INT)throw new ve("ID ca...
  function ja (line 88) | function ja(e){if(ar(e)){if(typeof e.valueOf=="function"){const t=e.valu...
  function c_ (line 88) | function c_(e){return kn(e,Ki)}
  class Ki (line 88) | class Ki{constructor(t){var n,r;this.name=Nn(t.name),this.description=t....
    method constructor (line 88) | constructor(t){var n,r;this.name=Nn(t.name),this.description=t.descrip...
    method toConfig (line 88) | toConfig(){return{name:this.name,description:this.description,location...
    method toString (line 88) | toString(){return"@"+this.name}
    method toJSON (line 88) | toJSON(){return this.toString()}
  method [Symbol.toStringTag] (line 88) | get[Symbol.toStringTag](){return"GraphQLDirective"}
  function wD (line 88) | function wD(e){return typeof e=="object"&&typeof(e==null?void 0:e[Symbol...
  function vi (line 88) | function vi(e,t){if(qe(t)){const n=vi(e,t.ofType);return(n==null?void 0:...
  method resolve (line 88) | resolve(e){return Object.values(e.getTypeMap())}
  method resolve (line 90) | resolve(e,{includeDeprecated:t}){return t?e.args:e.args.filter(n=>n.depr...
  method resolve (line 90) | resolve(e){if(Zr(e))return xe.SCALAR;if(Ae(e))return xe.OBJECT;if(De(e))...
  method resolve (line 90) | resolve(e,{includeDeprecated:t}){if(Ae(e)||De(e)){const n=Object.values(...
  method resolve (line 90) | resolve(e){if(Ae(e)||De(e))return e.getInterfaces()}
  method resolve (line 90) | resolve(e,t,n,{schema:r}){if(jr(e))return r.getPossibleTypes(e)}
  method resolve (line 90) | resolve(e,{includeDeprecated:t}){if(Bt(e)){const n=e.getValues();return ...
  method resolve (line 90) | resolve(e,{includeDeprecated:t}){if(vt(e)){const n=Object.values(e.getFi...
  method resolve (line 90) | resolve(e,{includeDeprecated:t}){return t?e.args:e.args.filter(n=>n.depr...
  method resolve (line 90) | resolve(e){const{type:t,defaultValue:n}=e,r=vi(n,t);return r?Ut(r):null}
  function _D (line 90) | function _D(e){return v_.some(({name:t})=>e.name===t)}
  function Qp (line 90) | function Qp(e){return kn(e,g_)}
  function SD (line 90) | function SD(e){if(!Qp(e))throw new Error(`Expected ${J(e)} to be a Graph...
  class g_ (line 90) | class g_{constructor(t){var n,r;this.__validationErrors=t.assumeValid===...
    method constructor (line 90) | constructor(t){var n,r;this.__validationErrors=t.assumeValid===!0?[]:v...
    method getQueryType (line 90) | getQueryType(){return this._queryType}
    method getMutationType (line 90) | getMutationType(){return this._mutationType}
    method getSubscriptionType (line 90) | getSubscriptionType(){return this._subscriptionType}
    method getRootType (line 90) | getRootType(t){switch(t){case Xt.QUERY:return this.getQueryType();case...
    method getTypeMap (line 90) | getTypeMap(){return this._typeMap}
    method getType (line 90) | getType(t){return this.getTypeMap()[t]}
    method getPossibleTypes (line 90) | getPossibleTypes(t){return nn(t)?t.getTypes():this.getImplementations(...
    method getImplementations (line 90) | getImplementations(t){const n=this._implementationsMap[t.name];return ...
    method isSubType (line 90) | isSubType(t,n){let r=this._subTypeMap[t.name];if(r===void 0){if(r=Obje...
    method getDirectives (line 90) | getDirectives(){return this._directives}
    method getDirective (line 90) | getDirective(t){return this.getDirectives().find(n=>n.name===t)}
    method toConfig (line 90) | toConfig(){return{description:this.description,query:this.getQueryType...
  method [Symbol.toStringTag] (line 90) | get[Symbol.toStringTag](){return"GraphQLSchema"}
  function mn (line 90) | function mn(e,t){const n=Ft(e);if(!t.has(n)){if(t.add(n),nn(n))for(const...
  function y_ (line 90) | function y_(e){if(SD(e),e.__validationErrors)return e.__validationErrors...
  function s_e (line 90) | function s_e(e){const t=y_(e);if(t.length!==0)throw new Error(t.map(n=>n...
  class CD (line 92) | class CD{constructor(t){this._errors=[],this.schema=t}reportError(t,n){c...
    method constructor (line 92) | constructor(t){this._errors=[],this.schema=t}
    method reportError (line 92) | reportError(t,n){const r=Array.isArray(n)?n.filter(Boolean):n;this._er...
    method getErrors (line 92) | getErrors(){return this._errors}
  function TD (line 92) | function TD(e){const t=e.schema,n=t.getQueryType();if(!n)e.reportError("...
  function od (line 92) | function od(e,t){var n;return(n=[e.astNode,...e.extensionASTNodes].flatM...
  function kD (line 92) | function kD(e){for(const n of e.schema.getDirectives()){if(!c_(n)){e.rep...
  function Io (line 92) | function Io(e,t){t.name.startsWith("__")&&e.reportError(`Name "${t.name}...
  function ND (line 92) | function ND(e){const t=OD(e),n=e.schema.getTypeMap();for(const r of Obje...
  function Vg (line 92) | function Vg(e,t){const n=Object.values(t.getFields());n.length===0&&e.re...
  function jg (line 92) | function jg(e,t){const n=Object.create(null);for(const r of t.getInterfa...
  function AD (line 92) | function AD(e,t,n){const r=t.getFields();for(const l of Object.values(n....
  function DD (line 92) | function DD(e,t,n){const r=t.getInterfaces();for(const o of n.getInterfa...
  function ID (line 92) | function ID(e,t){const n=t.getTypes();n.length===0&&e.reportError(`Union...
  function RD (line 92) | function RD(e,t){const n=t.getValues();n.length===0&&e.reportError(`Enum...
  function LD (line 92) | function LD(e,t){const n=Object.values(t.getFields());n.length===0&&e.re...
  function OD (line 92) | function OD(e){const t=Object.create(null),n=[],r=Object.create(null);re...
  function Fs (line 92) | function Fs(e,t){const{astNode:n,extensionASTNodes:r}=e;return(n!=null?[...
  function qg (line 92) | function qg(e,t){const{astNode:n,extensionASTNodes:r}=e;return(n!=null?[...
  function ev (line 92) | function ev(e){var t;return e==null||(t=e.directives)===null||t===void 0...
  function pa (line 92) | function pa(e,t){switch(t.kind){case L.LIST_TYPE:{const n=pa(e,t.type);r...
  class E_ (line 92) | class E_{constructor(t,n,r){this._schema=t,this._typeStack=[],this._pare...
    method constructor (line 92) | constructor(t,n,r){this._schema=t,this._typeStack=[],this._parentTypeS...
    method getType (line 92) | getType(){if(this._typeStack.length>0)return this._typeStack[this._typ...
    method getParentType (line 92) | getParentType(){if(this._parentTypeStack.length>0)return this._parentT...
    method getInputType (line 92) | getInputType(){if(this._inputTypeStack.length>0)return this._inputType...
    method getParentInputType (line 92) | getParentInputType(){if(this._inputTypeStack.length>1)return this._inp...
    method getFieldDef (line 92) | getFieldDef(){if(this._fieldDefStack.length>0)return this._fieldDefSta...
    method getDefaultValue (line 92) | getDefaultValue(){if(this._defaultValueStack.length>0)return this._def...
    method getDirective (line 92) | getDirective(){return this._directive}
    method getArgument (line 92) | getArgument(){return this._argument}
    method getEnumValue (line 92) | getEnumValue(){return this._enumValue}
    method enter (line 92) | enter(t){const n=this._schema;switch(t.kind){case L.SELECTION_SET:{con...
    method leave (line 92) | leave(t){switch(t.kind){case L.SELECTION_SET:this._parentTypeStack.pop...
  method [Symbol.toStringTag] (line 92) | get[Symbol.toStringTag](){return"TypeInfo"}
  function PD (line 92) | function PD(e,t,n){const r=n.name.value;if(r===ua.name&&e.getQueryType()...
  function $D (line 92) | function $D(e,t){return{enter(...n){const r=n[0];e.enter(r);const o=zc(t...
  function Cs (line 92) | function Cs(e,t,n){if(e){if(e.kind===L.VARIABLE){const r=e.name.value;if...
  function Ug (line 92) | function Ug(e,t){return e.kind===L.VARIABLE&&(t==null||t[e.name.value]==...
  function FD (line 92) | function FD(e){const t={descriptions:!0,specifiedByUrl:!1,directiveIsRep...
  function MD (line 197) | function MD(e,t){ar(e)&&ar(e.__schema)||ge(!1,`Invalid or incomplete int...
  function VD (line 197) | async function VD(e,t){let n=e.headers["content-type"];if(!n||!~n.indexO...
  function jD (line 202) | function jD(e,t,n){const r=async function*(){yield*e}(),o=r.return.bind(...
  function Bg (line 202) | function Bg(){const e={};return e.promise=new Promise((t,n)=>{e.resolve=...
  function qD (line 202) | function qD(){let e={type:"running"},t=Bg();const n=[];function r(s){e.t...
  function UD (line 202) | function UD(e){return typeof e=="object"&&e!==null&&(e[Symbol.toStringTa...
  function o (line 202) | function o(i){return i instanceof n?i:new n(function(s){s(i)})}
  function a (line 202) | function a(u){try{c(r.next(u))}catch(d){s(d)}}
  function l (line 202) | function l(u){try{c(r.throw(u))}catch(d){s(d)}}
  function c (line 202) | function c(u){u.done?i(u.value):o(u.value).then(a,l)}
  function r (line 202) | function r(i){n[i]=e[i]&&function(s){return new Promise(function(a,l){s=...
  function o (line 202) | function o(i,s,a,l){Promise.resolve(l).then(function(c){i({value:c,done:...
  function s (line 202) | function s(p){r[p]&&(o[p]=function(f){return new Promise(function(m,v){i...
  function a (line 202) | function a(p,f){try{l(r[p](f))}catch(m){d(i[0][3],m)}}
  function l (line 202) | function l(p){p.value instanceof Jn?Promise.resolve(p.value.v).then(c,u)...
  function c (line 202) | function c(p){a("next",p)}
  function u (line 202) | function u(p){a("throw",p)}
  function d (line 202) | function d(p,f){p(f),i.shift(),i.length&&a(i[0][0],i[0][1])}
  method OperationDefinition (line 202) | OperationDefinition(r){var o;t===((o=r.name)===null||o===void 0?void 0:o...
  method error (line 202) | error(r){r instanceof CloseEvent?n.error(new Error(`Socket closed with e...
  function KD (line 207) | function KD(e){let t;if(typeof window<"u"&&window.fetch&&(t=window.fetch...
  function Yp (line 207) | function Yp(e){return JSON.stringify(e,null,2)}
  function e3 (line 207) | function e3(e){return Object.assign(Object.assign({},e),{message:e.messa...
  function zg (line 207) | function zg(e){return e instanceof Error?e3(e):e}
  function ha (line 207) | function ha(e){return Array.isArray(e)?Yp({errors:e.map(t=>zg(t))}):Yp({...
  function Zp (line 207) | function Zp(e){return Yp(e)}
  function t3 (line 207) | function t3(e,t,n){const r=[];if(!e||!t)return{insertions:r,result:t};le...
  function n3 (line 209) | function n3(e){if(!("getFields"in e))return[];const t=e.getFields();if(t...
  function w_ (line 209) | function w_(e,t){const n=Ft(e);if(!e||zu(e))return;const r=t(n);if(!(!Ar...
  function r3 (line 209) | function r3(e,t){if(t.length===0)return e;let n="",r=0;for(const{index:o...
  function o3 (line 209) | function o3(e,t){let n=t,r=t;for(;n;){const o=e.charCodeAt(n-1);if(o===1...
  function i3 (line 209) | function i3(e){if(e)return e}
  function s3 (line 209) | function s3(e,t){var n;const r=new Map,o=[];for(const i of e)if(i.kind==...
  function __ (line 209) | function __(e,t,n){var r;const o=n?Ft(n).name:null,i=[],s=[];for(let a o...
  function a3 (line 209) | function a3(e,t){const n=t?new E_(t):null,r=Object.create(null);for(cons...
  function l3 (line 209) | function l3(e,t,n){if(!n||n.length<1)return;const r=n.map(o=>{var i;retu...
  function c3 (line 209) | function c3(e,t){return t instanceof DOMException&&(t.code===22||t.code=...
  class Xp (line 209) | class Xp{constructor(t){t?this.storage=t:t===null?this.storage=null:type...
    method constructor (line 209) | constructor(t){t?this.storage=t:t===null?this.storage=null:typeof wind...
    method get (line 209) | get(t){if(!this.storage)return null;const n=`${Cl}:${t}`,r=this.storag...
    method set (line 209) | set(t,n){let r=!1,o=null;if(this.storage){const i=`${Cl}:${t}`;if(n)tr...
    method clear (line 209) | clear(){this.storage&&this.storage.clear()}
  class Hg (line 209) | class Hg{constructor(t,n,r=null){this.key=t,this.storage=n,this.maxSize=...
    method constructor (line 209) | constructor(t,n,r=null){this.key=t,this.storage=n,this.maxSize=r,this....
    method length (line 209) | get length(){return this.items.length}
    method contains (line 209) | contains(t){return this.items.some(n=>n.query===t.query&&n.variables==...
    method edit (line 209) | edit(t,n){if(typeof n=="number"&&this.items[n]){const o=this.items[n];...
    method delete (line 209) | delete(t){const n=this.items.findIndex(r=>r.query===t.query&&r.variabl...
    method fetchRecent (line 209) | fetchRecent(){return this.items.at(-1)}
    method fetchAll (line 209) | fetchAll(){const t=this.storage.get(this.key);return t?JSON.parse(t)[t...
    method push (line 209) | push(t){const n=[...this.items,t];this.maxSize&&n.length>this.maxSize&...
    method save (line 209) | save(){this.storage.set(this.key,JSON.stringify({[this.key]:this.items...
  class f3 (line 209) | class f3{constructor(t,n){this.storage=t,this.maxHistoryLength=n,this.up...
    method constructor (line 209) | constructor(t,n){this.storage=t,this.maxHistoryLength=n,this.updateHis...
    method shouldSaveQuery (line 209) | shouldSaveQuery(t,n,r,o){if(!t)return!1;try{qo(t)}catch{return!1}retur...
    method toggleFavorite (line 209) | toggleFavorite({query:t,variables:n,headers:r,operationName:o,label:i,...
    method editLabel (line 209) | editLabel({query:t,variables:n,headers:r,operationName:o,label:i,favor...
  function S_ (line 209) | function S_(e){var t,n,r="";if(typeof e=="string"||typeof e=="number")r+...
  function Ke (line 209) | function Ke(){for(var e,t,n=0,r="";n<arguments.length;)(e=arguments[n++]...
  function h3 (line 209) | function h3(e){let t;return C_(e,n=>{switch(n.kind){case"Query":case"Sho...
  function Wg (line 209) | function Wg(e,t,n){return n===ua.name&&e.getQueryType()===t?ua:n===fa.na...
  function C_ (line 209) | function C_(e,t){const n=[];let r=e;for(;r!=null&&r.kind;)n.push(r),r=r....
  function Ro (line 209) | function Ro(e){const t=Object.keys(e),n=t.length,r=new Array(n);for(let ...
  function Re (line 209) | function Re(e,t){return m3(t,T_(e.string))}
  function m3 (line 209) | function m3(e,t){if(!t)return id(e,r=>!r.isDeprecated);const n=e.map(r=>...
  function id (line 209) | function id(e,t){const n=e.filter(t);return n.length===0?e:n}
  function T_ (line 209) | function T_(e){return e.toLowerCase().replaceAll(/\W/g,"")}
  function v3 (line 209) | function v3(e,t){let n=g3(t,e);return e.length>t.length&&(n-=e.length-t....
  function g3 (line 209) | function g3(e,t){let n,r;const o=[],i=e.length,s=t.length;for(n=0;n<=i;n...
  function t (line 209) | function t(n){return typeof n=="string"}
  function t (line 209) | function t(n){return typeof n=="string"}
  function t (line 209) | function t(n){return typeof n=="number"&&e.MIN_VALUE<=n&&n<=e.MAX_VALUE}
  function t (line 209) | function t(n){return typeof n=="number"&&e.MIN_VALUE<=n&&n<=e.MAX_VALUE}
  function t (line 209) | function t(r,o){return r===Number.MAX_VALUE&&(r=Hc.MAX_VALUE),o===Number...
  function n (line 209) | function n(r){let o=r;return O.objectLiteral(o)&&O.uinteger(o.line)&&O.u...
  function t (line 209) | function t(r,o,i,s){if(O.uinteger(r)&&O.uinteger(o)&&O.uinteger(i)&&O.ui...
  function n (line 209) | function n(r){let o=r;return O.objectLiteral(o)&&vn.is(o.start)&&vn.is(o...
  function t (line 209) | function t(r,o){return{uri:r,range:o}}
  function n (line 209) | function n(r){let o=r;return O.objectLiteral(o)&&Be.is(o.range)&&(O.stri...
  function t (line 209) | function t(r,o,i,s){return{targetUri:r,targetRange:o,targetSelectionRang...
  function n (line 209) | function n(r){let o=r;return O.objectLiteral(o)&&Be.is(o.targetRange)&&O...
  function t (line 209) | function t(r,o,i,s){return{red:r,green:o,blue:i,alpha:s}}
  function n (line 209) | function n(r){const o=r;return O.objectLiteral(o)&&O.numberRange(o.red,0...
  function t (line 209) | function t(r,o){return{range:r,color:o}}
  function n (line 209) | function n(r){const o=r;return O.objectLiteral(o)&&Be.is(o.range)&&Kp.is...
  function t (line 209) | function t(r,o,i){return{label:r,textEdit:o,additionalTextEdits:i}}
  function n (line 209) | function n(r){const o=r;return O.objectLiteral(o)&&O.string(o.label)&&(O...
  function t (line 209) | function t(r,o,i,s,a,l){const c={startLine:r,endLine:o};return O.defined...
  function n (line 209) | function n(r){const o=r;return O.objectLiteral(o)&&O.uinteger(o.startLin...
  function t (line 209) | function t(r,o){return{location:r,message:o}}
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&Gc.is(o.location)&&O.string(o...
  function t (line 209) | function t(n){const r=n;return O.objectLiteral(r)&&O.string(r.href)}
  function t (line 209) | function t(r,o,i,s,a,l){let c={range:r,message:o};return O.defined(i)&&(...
  function n (line 209) | function n(r){var o;let i=r;return O.defined(i)&&Be.is(i.range)&&O.strin...
  function t (line 209) | function t(r,o,...i){let s={title:r,command:o};return O.defined(i)&&i.le...
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&O.string(o.title)&&O.string(o...
  function t (line 209) | function t(i,s){return{range:i,newText:s}}
  function n (line 209) | function n(i,s){return{range:{start:i,end:i},newText:s}}
  function r (line 209) | function r(i){return{range:i,newText:""}}
  function o (line 209) | function o(i){const s=i;return O.objectLiteral(s)&&O.string(s.newText)&&...
  function t (line 209) | function t(r,o,i){const s={label:r};return o!==void 0&&(s.needsConfirmat...
  function n (line 209) | function n(r){const o=r;return O.objectLiteral(o)&&O.string(o.label)&&(O...
  function t (line 209) | function t(n){const r=n;return O.string(r)}
  function t (line 209) | function t(i,s,a){return{range:i,newText:s,annotationId:a}}
  function n (line 209) | function n(i,s,a){return{range:{start:i,end:i},newText:s,annotationId:a}}
  function r (line 209) | function r(i,s){return{range:i,newText:"",annotationId:s}}
  function o (line 209) | function o(i){const s=i;return qi.is(s)&&(th.is(s.annotationId)||Ui.is(s...
  function t (line 209) | function t(r,o){return{textDocument:r,edits:o}}
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&ah.is(o.textDocument)&&Array....
  function t (line 209) | function t(r,o,i){let s={kind:"create",uri:r};return o!==void 0&&(o.over...
  function n (line 209) | function n(r){let o=r;return o&&o.kind==="create"&&O.string(o.uri)&&(o.o...
  function t (line 209) | function t(r,o,i,s){let a={kind:"rename",oldUri:r,newUri:o};return i!==v...
  function n (line 209) | function n(r){let o=r;return o&&o.kind==="rename"&&O.string(o.oldUri)&&O...
  function t (line 209) | function t(r,o,i){let s={kind:"delete",uri:r};return o!==void 0&&(o.recu...
  function n (line 209) | function n(r){let o=r;return o&&o.kind==="delete"&&O.string(o.uri)&&(o.o...
  function t (line 209) | function t(n){let r=n;return r&&(r.changes!==void 0||r.documentChanges!=...
  function t (line 209) | function t(r){return{uri:r}}
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&O.string(o.uri)}
  function t (line 209) | function t(r,o){return{uri:r,version:o}}
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&O.string(o.uri)&&O.integer(o....
  function t (line 209) | function t(r,o){return{uri:r,version:o}}
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&O.string(o.uri)&&(o.version==...
  function t (line 209) | function t(r,o,i,s){return{uri:r,languageId:o,version:i,text:s}}
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&O.string(o.uri)&&O.string(o.l...
  function t (line 209) | function t(n){const r=n;return r===e.PlainText||r===e.Markdown}
  function t (line 209) | function t(n){const r=n;return O.objectLiteral(n)&&lh.is(r.kind)&&O.stri...
  function t (line 209) | function t(r,o,i){return{newText:r,insert:o,replace:i}}
  function n (line 209) | function n(r){const o=r;return o&&O.string(o.newText)&&Be.is(o.insert)&&...
  function t (line 209) | function t(n){const r=n;return r&&(O.string(r.detail)||r.detail===void 0...
  function t (line 209) | function t(n){return{label:n}}
  function t (line 209) | function t(n,r){return{items:n||[],isIncomplete:!!r}}
  function t (line 209) | function t(r){return r.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")}
  function n (line 209) | function n(r){const o=r;return O.string(o)||O.objectLiteral(o)&&O.string...
  function t (line 209) | function t(n){let r=n;return!!r&&O.objectLiteral(r)&&(ma.is(r.contents)|...
  function t (line 209) | function t(n,r){return r?{label:n,documentation:r}:{label:n}}
  function t (line 209) | function t(n,r,...o){let i={label:n};return O.defined(r)&&(i.documentati...
  function t (line 209) | function t(n,r){let o={range:n};return O.number(r)&&(o.kind=r),o}
  function t (line 209) | function t(n,r,o,i,s){let a={name:n,kind:r,location:{uri:i,range:o}};ret...
  function t (line 209) | function t(n,r,o,i){return i!==void 0?{name:n,kind:r,location:{uri:o,ran...
  function t (line 209) | function t(r,o,i,s,a,l){let c={name:r,detail:o,kind:i,range:s,selectionR...
  function n (line 209) | function n(r){let o=r;return o&&O.string(o.name)&&O.number(o.kind)&&Be.i...
  function t (line 209) | function t(r,o,i){let s={diagnostics:r};return o!=null&&(s.only=o),i!=nu...
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&O.typedArray(o.diagnostics,Wc...
  function t (line 209) | function t(r,o,i){let s={title:r},a=!0;return typeof o=="string"?(a=!1,s...
  function n (line 209) | function n(r){let o=r;return o&&O.string(o.title)&&(o.diagnostics===void...
  function t (line 209) | function t(r,o){let i={range:r};return O.defined(o)&&(i.data=o),i}
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&Be.is(o.range)&&(O.undefined(...
  function t (line 209) | function t(r,o){return{tabSize:r,insertSpaces:o}}
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&O.uinteger(o.tabSize)&&O.bool...
  function t (line 209) | function t(r,o,i){return{range:r,target:o,data:i}}
  function n (line 209) | function n(r){let o=r;return O.defined(o)&&Be.is(o.range)&&(O.undefined(...
  function t (line 209) | function t(r,o){return{range:r,parent:o}}
  function n (line 209) | function n(r){let o=r;return O.objectLiteral(o)&&Be.is(o.range)&&(o.pare...
  function t (line 209) | function t(n){const r=n;return O.objectLiteral(r)&&(r.resultId===void 0|...
  function t (line 209) | function t(r,o){return{range:r,text:o}}
  function n (line 209) | function n(r){const o=r;return o!=null&&Be.is(o.range)&&O.string(o.text)}
  function t (line 209) | function t(r,o,i){return{range:r,variableName:o,caseSensitiveLookup:i}}
  function n (line 209) | function n(r){const o=r;return o!=null&&Be.is(o.range)&&O.boolean(o.case...
  function t (line 209) | function t(r,o){return{range:r,expression:o}}
  function n (line 209) | function n(r){const o=r;return o!=null&&Be.is(o.range)&&(O.string(o.expr...
  function t (line 209) | function t(r,o){return{frameId:r,stoppedLocation:o}}
  function n (line 209) | function n(r){const o=r;return O.defined(o)&&Be.is(r.stoppedLocation)}
  function t (line 209) | function t(n){return n===1||n===2}
  function t (line 209) | function t(r){return{value:r}}
  function n (line 209) | function n(r){const o=r;return O.objectLiteral(o)&&(o.tooltip===void 0||...
  function t (line 209) | function t(r,o,i){const s={position:r,label:o};return i!==void 0&&(s.kin...
  function n (line 209) | function n(r){const o=r;return O.objectLiteral(o)&&vn.is(o.position)&&(O...
  function t (line 209) | function t(n){return{kind:"snippet",value:n}}
  function t (line 209) | function t(n,r,o,i){return{insertText:n,filterText:r,range:o,command:i}}
  function t (line 209) | function t(n){return{items:n}}
  function t (line 209) | function t(n,r){return{range:n,text:r}}
  function t (line 209) | function t(n,r){return{triggerKind:n,selectedCompletionInfo:r}}
  function t (line 209) | function t(n){const r=n;return O.objectLiteral(r)&&Jp.is(r.uri)&&O.strin...
  function t (line 209) | function t(i,s,a,l){return new y3(i,s,a,l)}
  function n (line 209) | function n(i){let s=i;return!!(O.defined(s)&&O.string(s.uri)&&(O.undefin...
  function r (line 209) | function r(i,s){let a=i.getText(),l=o(s,(u,d)=>{let p=u.range.start.line...
  function o (line 209) | function o(i,s){if(i.length<=1)return i;const a=i.length/2|0,l=i.slice(0...
  class y3 (line 209) | class y3{constructor(t,n,r,o){this._uri=t,this._languageId=n,this._versi...
    method constructor (line 209) | constructor(t,n,r,o){this._uri=t,this._languageId=n,this._version=r,th...
    method uri (line 209) | get uri(){return this._uri}
    method languageId (line 209) | get languageId(){return this._languageId}
    method version (line 209) | get version(){return this._version}
    method getText (line 209) | getText(t){if(t){let n=this.offsetAt(t.start),r=this.offsetAt(t.end);r...
    method update (line 209) | update(t,n){this._content=t.text,this._version=n,this._lineOffsets=voi...
    method getLineOffsets (line 209) | getLineOffsets(){if(this._lineOffsets===void 0){let t=[],n=this._conte...
    method positionAt (line 211) | positionAt(t){t=Math.max(Math.min(t,this._content.length),0);let n=thi...
    method offsetAt (line 211) | offsetAt(t){let n=this.getLineOffsets();if(t.line>=n.length)return thi...
    method lineCount (line 211) | get lineCount(){return this.getLineOffsets().length}
  function n (line 211) | function n(f){return typeof f<"u"}
  function r (line 211) | function r(f){return typeof f>"u"}
  function o (line 211) | function o(f){return f===!0||f===!1}
  function i (line 211) | function i(f){return t.call(f)==="[object String]"}
  function s (line 211) | function s(f){return t.call(f)==="[object Number]"}
  function a (line 211) | function a(f,m,v){return t.call(f)==="[object Number]"&&m<=f&&f<=v}
  function l (line 211) | function l(f){return t.call(f)==="[object Number]"&&-2147483648<=f&&f<=2...
  function c (line 211) | function c(f){return t.call(f)==="[object Number]"&&0<=f&&f<=2147483647}
  function u (line 211) | function u(f){return t.call(f)==="[object Function]"}
  function d (line 211) | function d(f){return f!==null&&typeof f=="object"}
  function p (line 211) | function p(f,m){return Array.isArray(f)&&f.every(m)}
  class Qy (line 211) | class Qy{constructor(t){this._start=0,this._pos=0,this.getStartOfToken=(...
    method constructor (line 211) | constructor(t){this._start=0,this._pos=0,this.getStartOfToken=()=>this...
    method _testNextCharacter (line 211) | _testNextCharacter(t){const n=this._sourceText.charAt(this._pos);let r...
  function Me (line 211) | function Me(e){return{ofRule:e}}
  function de (line 211) | function de(e,t){return{ofRule:e,isList:!0,separator:t}}
  function E3 (line 211) | function E3(e,t){const n=e.match;return e.match=r=>{let o=!1;return n&&(...
  function sd (line 211) | function sd(e,t){return{style:t,match:n=>n.kind===e}}
  function ie (line 211) | function ie(e,t){return{style:t||"punctuation",match:n=>n.kind==="Punctu...
  method Definition (line 212) | Definition(e){switch(e.value){case"{":return"ShortQuery";case"query":ret...
  method Selection (line 212) | Selection(e,t){return e.value==="..."?t.match(/[\s\u00a0,]*(on\b|@|{)/,!...
  method Value (line 212) | Value(e){switch(e.kind){case"Number":return"NumberValue";case"String":re...
  method update (line 212) | update(e,t){t.value.startsWith('"""')&&(e.inBlockstring=!t.value.slice(3...
  method Type (line 212) | Type(e){return e.value==="["?"ListType":"NonNullType"}
  method ExtensionDefinition (line 212) | ExtensionDefinition(e){switch(e.value){case"schema":return L.SCHEMA_EXTE...
  function tt (line 212) | function tt(e){return{style:"keyword",match:t=>t.kind==="Name"&&t.value=...
  function _e (line 212) | function _e(e){return{style:e,match:t=>t.kind==="Name",update(t,n){t.nam...
  function _3 (line 212) | function _3(e){return{style:e,match:t=>t.kind==="Name",update(t,n){var r...
  function S3 (line 212) | function S3(e={eatWhitespace:t=>t.eatWhile(b3),lexRules:x3,parseRules:w3...
  function C3 (line 212) | function C3(e,t,n){var r;if(t.inBlockstring)return e.match(/.*"""/)?(t.i...
  function Yy (line 212) | function Yy(e,t){const n=Object.keys(t);for(let r=0;r<n.length;r++)e[n[r...
  function Ts (line 212) | function Ts(e,t,n){if(!e[n])throw new TypeError("Unknown rule: "+n);t.pr...
  function tv (line 212) | function tv(e){e.prevState&&(e.kind=e.prevState.kind,e.name=e.prevState....
  function dh (line 212) | function dh(e,t){var n;if(Zy(e)&&e.rule){const r=e.rule[e.step];if(r.sep...
  function Zy (line 212) | function Zy(e){const t=Array.isArray(e.rule)&&typeof e.rule[e.step]!="st...
  function T3 (line 212) | function T3(e){for(;e.rule&&!(Array.isArray(e.rule)&&e.rule[e.step].ofRu...
  function k3 (line 212) | function k3(e,t){const n=Object.keys(e);for(let r=0;r<n.length;r++){cons...
  method FragmentDefinition (line 212) | FragmentDefinition(n){t.push(n)}
  method enter (line 212) | enter(n){if(n.kind!=="Document")return D3.includes(n.kind)?(t=!0,mi):!1}
  function a_e (line 212) | function a_e(e,t,n,r,o,i){var s;const a=Object.assign(Object.assign({},i...
  function L3 (line 214) | function L3(e){return Re(e,[{label:"extend",kind:se.Function},{label:"ty...
  function O3 (line 214) | function O3(e){return Re(e,[{label:"query",kind:se.Function},{label:"mut...
  function P3 (line 214) | function P3(e){return Re(e,[{label:"type",kind:se.Function},{label:"inte...
  function $3 (line 214) | function $3(e,t,n){var r;if(t.parentType){const{parentType:o}=t;let i=[]...
  function F3 (line 214) | function F3(e,t,n,r){const o=Ft(t.inputType),i=N_(n,r,e).filter(s=>s.det...
  function M3 (line 214) | function M3(e,t,n,r,o){if(t.needsSeparator)return[];const i=n.getTypeMap...
  function V3 (line 214) | function V3(e,t,n,r){let o;if(t.parentType)if(jr(t.parentType)){const i=...
  function j3 (line 214) | function j3(e,t,n,r,o){if(!r)return[];const i=n.getTypeMap(),s=h3(e.stat...
  function N_ (line 214) | function N_(e,t,n){let r=null,o;const i=Object.create({});return Gu(e,(s...
  function U3 (line 214) | function U3(e){const t=[];return Gu(e,(n,r)=>{r.kind===Q.FRAGMENT_DEFINI...
  function B3 (line 214) | function B3(e,t,n){const r=t.getTypeMap(),o=Ro(r).filter(Yt);return Re(e...
  function z3 (line 214) | function z3(e,t,n,r){var o;if(!((o=t.prevState)===null||o===void 0)&&o.k...
  function H3 (line 214) | function H3(e,t,n=0){let r=null,o=null,i=null;const s=Gu(e,(a,l,c,u)=>{i...
  function Gu (line 214) | function Gu(e,t){const n=e.split(`
  function G3 (line 215) | function G3(e,t){if(!(e!=null&&e.kind))return!1;const{kind:n,prevState:r...
  function W3 (line 215) | function W3(e,t){let n,r,o,i,s,a,l,c,u,d,p;return C_(t,f=>{var m;switch(...
  function Q3 (line 215) | function Q3(e,t){return t!=null&&t.endsWith(".graphqls")||I3(e)?wo.TYPE_...
  function A_ (line 215) | function A_(e){return e.prevState&&e.kind&&[Q.NAMED_TYPE,Q.LIST_TYPE,Q.T...
  function D_ (line 215) | function D_(e,t){if(e!=null)return e;var n=new Error(t!==void 0?t:"Got u...
  method FragmentDefinition (line 215) | FragmentDefinition(s){n.set(s.name.value,!0)}
  method FragmentSpread (line 215) | FragmentSpread(s){r.has(s.name.value)||r.add(s.name.value)}
  method FragmentSpread (line 215) | FragmentSpread(a){!r.has(a.name.value)&&t.get(a.name.value)&&(o.add(Xy(t...
  function X3 (line 215) | function X3(e,t){const n=Object.create(null);for(const r of t.definition...
  function J3 (line 215) | function J3(e,t){const n=t?X3(t,e):void 0,r=[];return Tn(e,{OperationDef...
  function K3 (line 215) | function K3(e,t){if(t)try{const n=qo(t);return Object.assign(Object.assi...
  function Jy (line 230) | function Jy(e){return nI(e)===!0&&Object.prototype.toString.call(e)==="[...
  function gI (line 235) | function gI(e){var t=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+...
  function yI (line 235) | function yI(e,t){var n,r,o,i,s,a,l=!1;t||(t={}),n=t.debug||!1;try{o=mI()...
  function oe (line 235) | function oe(){return oe=Object.assign?Object.assign.bind():function(e){f...
  function ae (line 235) | function ae(e,t,{checkForDefaultPrevented:n=!0}={}){return function(o){i...
  function xI (line 235) | function xI(e,t){typeof e=="function"?e(t):e!=null&&(e.current=t)}
  function rv (line 235) | function rv(...e){return t=>e.forEach(n=>xI(n,t))}
  function at (line 235) | function at(...e){return h.useCallback(rv(...e),e)}
  function Bo (line 235) | function Bo(e,t=[]){let n=[];function r(i,s){const a=h.createContext(s),...
  function wI (line 235) | function wI(...e){const t=e[0];if(e.length===1)return t;const n=()=>{con...
  function _o (line 235) | function _o(e){const[t,n]=h.useState(_I());return Bi(()=>{e||n(r=>r??Str...
  function jn (line 235) | function jn(e){const t=h.useRef(e);return h.useEffect(()=>{t.current=e})...
  function Qu (line 235) | function Qu({prop:e,defaultProp:t,onChange:n=()=>{}}){const[r,o]=CI({def...
  function CI (line 235) | function CI({defaultProp:e,onChange:t}){const n=h.useState(e),[r]=n,o=h....
  function TI (line 235) | function TI(e){return h.isValidElement(e)&&e.type===R_}
  function kI (line 235) | function kI(e,t){const n={...t};for(const r in t){const o=e[r],i=t[r];/^...
  function L_ (line 235) | function L_(e,t){e&&Va.flushSync(()=>e.dispatchEvent(t))}
  function AI (line 235) | function AI(e,t=globalThis==null?void 0:globalThis.document){const n=jn(...
  function LI (line 235) | function LI(e,t=globalThis==null?void 0:globalThis.document){const n=jn(...
  function OI (line 235) | function OI(e,t=globalThis==null?void 0:globalThis.document){const n=jn(...
  function r1 (line 235) | function r1(){const e=new CustomEvent(hh);document.dispatchEvent(e)}
  function O_ (line 235) | function O_(e,t,n,{discrete:r}){const o=n.originalEvent.target,i=new Cus...
  method pause (line 235) | pause(){this.paused=!0}
  method resume (line 235) | resume(){this.paused=!1}
  function PI (line 235) | function PI(e,{select:t=!1}={}){const n=document.activeElement;for(const...
  function $I (line 235) | function $I(e){const t=$_(e),n=i1(t,e),r=i1(t.reverse(),e);return[n,r]}
  function $_ (line 235) | function $_(e){const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_...
  function i1 (line 235) | function i1(e,t){for(const n of e)if(!FI(n,{upTo:t}))return n}
  function FI (line 235) | function FI(e,{upTo:t}){if(getComputedStyle(e).visibility==="hidden")ret...
  function MI (line 235) | function MI(e){return e instanceof HTMLInputElement&&"select"in e}
  function vr (line 235) | function vr(e,{select:t=!1}={}){if(e&&e.focus){const n=document.activeEl...
  function VI (line 235) | function VI(){let e=[];return{add(t){const n=e[0];t!==n&&(n==null||n.pau...
  function a1 (line 235) | function a1(e,t){const n=[...e],r=n.indexOf(t);return r!==-1&&n.splice(r...
  function jI (line 235) | function jI(e){return e.filter(t=>t.tagName!=="A")}
  function qI (line 235) | function qI(e,t){return h.useReducer((n,r)=>{const o=t[n][r];return o??n...
  function UI (line 235) | function UI(e){const[t,n]=h.useState(),r=h.useRef({}),o=h.useRef(e),i=h....
  function kl (line 235) | function kl(e){return(e==null?void 0:e.animationName)||"none"}
  function F_ (line 235) | function F_(){h.useEffect(()=>{var e,t;const n=document.querySelectorAll...
  function l1 (line 235) | function l1(){const e=document.createElement("span");return e.setAttribu...
  function M_ (line 235) | function M_(e,t){if(typeof t!="function"&&t!==null)throw new TypeError("...
  function yt (line 235) | function yt(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty...
  function Ie (line 235) | function Ie(e,t){var n=typeof Symbol=="function"&&e[Symbol.iterator];if(...
  function _n (line 235) | function _n(e,t,n){if(n||arguments.length===2)for(var r=0,o=t.length,i;r...
  function HI (line 235) | function HI(e,t){return typeof e=="function"?e(t):e&&(e.current=t),e}
  function GI (line 235) | function GI(e,t){var n=h.useState(function(){return{value:e,callback:t,f...
  function WI (line 235) | function WI(e,t){return GI(t||null,function(n){return e.forEach(function...
  function QI (line 235) | function QI(e){return e}
  function YI (line 235) | function YI(e,t){t===void 0&&(t=QI);var n=[],r=!1,o={read:function(){if(...
  function ZI (line 235) | function ZI(e){e===void 0&&(e={});var t=YI(null);return t.options=G({asy...
  function XI (line 235) | function XI(e,t){return e.useMedium(t),V_}
  function KI (line 235) | function KI(){if(!document)return null;var e=document.createElement("sty...
  function e5 (line 235) | function e5(e,t){e.styleSheet?e.styleSheet.cssText=t:e.appendChild(docum...
  function t5 (line 235) | function t5(e){var t=document.head||document.getElementsByTagName("head"...
  function b5 (line 275) | function b5(e){var t=h.useRef([]),n=h.useRef([0,0]),r=h.useRef(),o=h.use...
  function sv (line 275) | function sv(e){return e?"open":"closed"}
  function tS (line 275) | function tS(e){const t=e+"CollectionProvider",[n,r]=Bo(t),[o,i]=n(t,{col...
  function nS (line 275) | function nS(e){const t=h.useContext(X5);return e||t||"ltr"}
  function yh (line 275) | function yh(e,t,n){return Pt(e,zr(t,n))}
  function lr (line 275) | function lr(e,t){return typeof e=="function"?e(t):e}
  function cr (line 275) | function cr(e){return e.split("-")[0]}
  function es (line 275) | function es(e){return e.split("-")[1]}
  function av (line 275) | function av(e){return e==="x"?"y":"x"}
  function lv (line 275) | function lv(e){return e==="y"?"height":"width"}
  function ts (line 275) | function ts(e){return["top","bottom"].includes(cr(e))?"y":"x"}
  function cv (line 275) | function cv(e){return av(ts(e))}
  function tR (line 275) | function tR(e,t,n){n===void 0&&(n=!1);const r=es(e),o=cv(e),i=lv(o);let ...
  function nR (line 275) | function nR(e){const t=Xc(e);return[Eh(e),t,Eh(t)]}
  function Eh (line 275) | function Eh(e){return e.replace(/start|end/g,t=>eR[t])}
  function rR (line 275) | function rR(e,t,n){const r=["left","right"],o=["right","left"],i=["top",...
  function oR (line 275) | function oR(e,t,n,r){const o=es(e);let i=rR(cr(e),n==="start",r);return ...
  function Xc (line 275) | function Xc(e){return e.replace(/left|right|bottom|top/g,t=>K5[t])}
  function iR (line 275) | function iR(e){return{top:0,right:0,bottom:0,left:0,...e}}
  function rS (line 275) | function rS(e){return typeof e!="number"?iR(e):{top:e,right:e,bottom:e,l...
  function Jc (line 275) | function Jc(e){return{...e,top:e.y,left:e.x,right:e.x+e.width,bottom:e.y...
  function p1 (line 275) | function p1(e,t,n){let{reference:r,floating:o}=e;const i=ts(t),s=cv(t),a...
  function ga (line 275) | async function ga(e,t){var n;t===void 0&&(t={});const{x:r,y:o,platform:i...
  method fn (line 275) | async fn(t){const{x:n,y:r,placement:o,rects:i,platform:s,elements:a,midd...
  method fn (line 275) | async fn(t){var n,r;const{placement:o,middlewareData:i,rects:s,initialPl...
  function m1 (line 275) | function m1(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:...
  function v1 (line 275) | function v1(e){return J5.some(t=>e[t]>=0)}
  method fn (line 275) | async fn(t){const{rects:n}=t,{strategy:r="referenceHidden",...o}=lr(e,t)...
  function cR (line 275) | async function cR(e,t){const{placement:n,platform:r,elements:o}=e,i=awai...
  method fn (line 275) | async fn(t){const{x:n,y:r}=t,o=await cR(t,e);return{x:n+o.x,y:r+o.y,data...
  method fn (line 275) | async fn(t){const{x:n,y:r,placement:o}=t,{mainAxis:i=!0,crossAxis:s=!1,l...
  method fn (line 275) | fn(t){const{x:n,y:r,placement:o,rects:i,middlewareData:s}=t,{offset:a=0,...
  method fn (line 275) | async fn(t){const{placement:n,rects:r,platform:o,elements:i}=t,{apply:s=...
  function Gr (line 275) | function Gr(e){return oS(e)?(e.nodeName||"").toLowerCase():"#document"}
  function Vt (line 275) | function Vt(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t....
  function hr (line 275) | function hr(e){var t;return(t=(oS(e)?e.ownerDocument:e.document)||window...
  function oS (line 275) | function oS(e){return e instanceof Node||e instanceof Vt(e).Node}
  function ur (line 275) | function ur(e){return e instanceof Element||e instanceof Vt(e).Element}
  function qn (line 275) | function qn(e){return e instanceof HTMLElement||e instanceof Vt(e).HTMLE...
  function g1 (line 275) | function g1(e){return typeof ShadowRoot>"u"?!1:e instanceof ShadowRoot||...
  function qa (line 275) | function qa(e){const{overflow:t,overflowX:n,overflowY:r,display:o}=rn(e)...
  function hR (line 275) | function hR(e){return["table","td","th"].includes(Gr(e))}
  function uv (line 275) | function uv(e){const t=fv(),n=rn(e);return n.transform!=="none"||n.persp...
  function mR (line 275) | function mR(e){let t=Hi(e);for(;qn(t)&&!Zu(t);){if(uv(t))return t;t=Hi(t...
  function fv (line 275) | function fv(){return typeof CSS>"u"||!CSS.supports?!1:CSS.supports("-web...
  function Zu (line 275) | function Zu(e){return["html","body","#document"].includes(Gr(e))}
  function rn (line 275) | function rn(e){return Vt(e).getComputedStyle(e)}
  function Xu (line 275) | function Xu(e){return ur(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollT...
  function Hi (line 275) | function Hi(e){if(Gr(e)==="html")return e;const t=e.assignedSlot||e.pare...
  function iS (line 275) | function iS(e){const t=Hi(e);return Zu(t)?e.ownerDocument?e.ownerDocumen...
  function ya (line 275) | function ya(e,t,n){var r;t===void 0&&(t=[]),n===void 0&&(n=!0);const o=i...
  function sS (line 275) | function sS(e){const t=rn(e);let n=parseFloat(t.width)||0,r=parseFloat(t...
  function dv (line 275) | function dv(e){return ur(e)?e:e.contextElement}
  function Ni (line 275) | function Ni(e){const t=dv(e);if(!qn(t))return Hr(1);const n=t.getBoundin...
  function aS (line 275) | function aS(e){const t=Vt(e);return!fv()||!t.visualViewport?vR:{x:t.visu...
  function gR (line 275) | function gR(e,t,n){return t===void 0&&(t=!1),!n||t&&n!==Vt(e)?!1:t}
  function Oo (line 275) | function Oo(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);const o=e.get...
  function yR (line 275) | function yR(e){let{rect:t,offsetParent:n,strategy:r}=e;const o=qn(n),i=h...
  function ER (line 275) | function ER(e){return Array.from(e.getClientRects())}
  function lS (line 275) | function lS(e){return Oo(hr(e)).left+Xu(e).scrollLeft}
  function bR (line 275) | function bR(e){const t=hr(e),n=Xu(e),r=e.ownerDocument.body,o=Pt(t.scrol...
  function xR (line 275) | function xR(e,t){const n=Vt(e),r=hr(e),o=n.visualViewport;let i=r.client...
  function wR (line 275) | function wR(e,t){const n=Oo(e,!0,t==="fixed"),r=n.top+e.clientTop,o=n.le...
  function y1 (line 275) | function y1(e,t,n){let r;if(t==="viewport")r=xR(e,n);else if(t==="docume...
  function cS (line 275) | function cS(e,t){const n=Hi(e);return n===t||!ur(n)||Zu(n)?!1:rn(n).posi...
  function _R (line 275) | function _R(e,t){const n=t.get(e);if(n)return n;let r=ya(e,[],!1).filter...
  function SR (line 275) | function SR(e){let{element:t,boundary:n,rootBoundary:r,strategy:o}=e;con...
  function CR (line 275) | function CR(e){return sS(e)}
  function TR (line 275) | function TR(e,t,n){const r=qn(t),o=hr(t),i=n==="fixed",s=Oo(e,!0,i,t);le...
  function E1 (line 275) | function E1(e,t){return!qn(e)||rn(e).position==="fixed"?null:t?t(e):e.of...
  function uS (line 275) | function uS(e,t){const n=Vt(e);if(!qn(e))return n;let r=E1(e,t);for(;r&&...
  function NR (line 275) | function NR(e){return rn(e).direction==="rtl"}
  function DR (line 275) | function DR(e,t){let n=null,r;const o=hr(e);function i(){clearTimeout(r)...
  function IR (line 275) | function IR(e,t,n,r){r===void 0&&(r={});const{ancestorScroll:o=!0,ancest...
  function t (line 275) | function t(n){return{}.hasOwnProperty.call(n,"current")}
  method fn (line 275) | fn(n){const{element:r,padding:o}=typeof e=="function"?e(n):e;return r&&t...
  function Kc (line 275) | function Kc(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typ...
  function fS (line 275) | function fS(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||...
  function b1 (line 275) | function b1(e,t){const n=fS(e);return Math.round(t*n)/n}
  function x1 (line 275) | function x1(e){const t=h.useRef(e);return fc(()=>{t.current=e}),t}
  function OR (line 275) | function OR(e){e===void 0&&(e={});const{placement:t="bottom",strategy:n=...
  function PR (line 275) | function PR(e){const[t,n]=h.useState(void 0);return Bi(()=>{if(e){n({wid...
  function UR (line 275) | function UR(e){return e!==null}
  method fn (line 275) | fn(t){var n,r,o,i,s;const{placement:a,rects:l,middlewareData:c}=t,d=((n=...
  function vS (line 275) | function vS(e){const[t,n="center"]=e.split("-");return[t,n]}
  function eL (line 275) | function eL(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="Ar...
  function tL (line 275) | function tL(e,t,n){const r=eL(e.key,n);if(!(t==="vertical"&&["ArrowLeft"...
  function wS (line 275) | function wS(e){const t=document.activeElement;for(const n of e)if(n===t|...
  function nL (line 275) | function nL(e,t){return e.map((n,r)=>e[(t+r)%e.length])}
  function TL (line 275) | function TL(e){return e?"open":"closed"}
  function kL (line 275) | function kL(e){const t=document.activeElement;for(const n of e)if(n===t|...
  function NL (line 275) | function NL(e,t){return e.map((n,r)=>e[(t+r)%e.length])}
  function AL (line 275) | function AL(e,t,n){const o=t.length>1&&Array.from(t).every(c=>c===t[0])?...
  function DL (line 275) | function DL(e,t){const{x:n,y:r}=e;let o=!1;for(let i=0,s=t.length-1;i<t....
  function IL (line 275) | function IL(e,t){if(!t)return!1;const n={x:e.clientX,y:e.clientY};return...
  function _h (line 275) | function _h(e){return t=>t.pointerType==="mouse"?e(t):void 0}
  function mhe (line 276) | function mhe(e){var t,n,r=_1[e];if(r)return r;for(r=_1[e]=[],t=0;t<128;t...
  function ef (line 276) | function ef(e,t,n){var r,o,i,s,a,l="";for(typeof t!="string"&&(n=t,t=ef....
  function ghe (line 276) | function ghe(e){var t,n,r=S1[e];if(r)return r;for(r=S1[e]=[],t=0;t<128;t...
  function tf (line 276) | function tf(e,t){var n;return typeof t!="string"&&(t=tf.defaultChars),n=...
  function eu (line 276) | function eu(){this.protocol=null,this.slashes=null,this.auth=null,this.p...
  function Nhe (line 277) | function Nhe(e,t){if(e&&e instanceof eu)return e;var n=new eu;return n.p...
  function RS (line 277) | function RS(){return D1||(D1=1,md=/[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDB...
  function LS (line 277) | function LS(){return I1||(I1=1,vd=/[\0-\x1F\x7F-\x9F]/),vd}
  function Dhe (line 277) | function Dhe(){return R1||(R1=1,gd=/[\xAD\u0600-\u0605\u061C\u06DD\u070F...
  function OS (line 277) | function OS(){return L1||(L1=1,yd=/[ \xA0\u1680\u2000-\u200A\u2028\u2029...
  function Ihe (line 277) | function Ihe(){return O1||(O1=1,io.Any=RS(),io.Cc=LS(),io.Cf=Dhe(),io.P=...
  function t (line 277) | function t(N){return Object.prototype.toString.call(N)}
  function n (line 277) | function n(N){return t(N)==="[object String]"}
  function o (line 277) | function o(N,M){return r.call(N,M)}
  function i (line 277) | function i(N){var M=Array.prototype.slice.call(arguments,1);return M.for...
  function s (line 277) | function s(N,M,R){return[].concat(N.slice(0,M),R,N.slice(M+1))}
  function a (line 277) | function a(N){return!(N>=55296&&N<=57343||N>=64976&&N<=65007||(N&65535)=...
  function l (line 277) | function l(N){if(N>65535){N-=65536;var M=55296+(N>>10),R=56320+(N&1023);...
  function m (line 277) | function m(N,M){var R=0;return o(f,M)?f[M]:M.charCodeAt(0)===35&&p.test(...
  function v (line 277) | function v(N){return N.indexOf("\\")<0?N:N.replace(c,"$1")}
  function b (line 277) | function b(N){return N.indexOf("\\")<0&&N.indexOf("&")<0?N:N.replace(d,f...
  function x (line 277) | function x(N){return E[N]}
  function w (line 277) | function w(N){return y.test(N)?N.replace(g,x):N}
  function T (line 277) | function T(N){return N.replace(C,"\\$&")}
  function A (line 277) | function A(N){switch(N){case 9:case 32:return!0}return!1}
  function S (line 277) | function S(N){if(N>=8192&&N<=8202)return!0;switch(N){case 9:case 10:case...
  function q (line 277) | function q(N){return k.test(N)}
  function H (line 277) | function H(N){switch(N){case 33:case 34:case 35:case 36:case 37:case 38:...
  function V (line 277) | function V(N){return N=N.trim().replace(/\s+/g," "),"ẞ".toLowerCase()===...
  function rs (line 286) | function rs(){this.rules=$he({},Hn)}
  function Dn (line 289) | function Dn(){this.__rules__=[],this.__cache__=null}
  function Hhe (line 290) | function Hhe(e){return/^<a[>\s]/i.test(e)}
  function Ghe (line 290) | function Ghe(e){return/^<\/a\s*>/i.test(e)}
  function Xhe (line 290) | function Xhe(e,t){return Zhe[t.toLowerCase()]}
  function Jhe (line 290) | function Jhe(e){var t,n,r=0;for(t=e.length-1;t>=0;t--)n=e[t],n.type==="t...
  function Khe (line 290) | function Khe(e){var t,n,r=0;for(t=e.length-1;t>=0;t--)n=e[t],n.type==="t...
  function Ll (line 290) | function Ll(e,t,n){return e.substr(0,t)+n+e.substr(t+1)}
  function nme (line 290) | function nme(e,t){var n,r,o,i,s,a,l,c,u,d,p,f,m,v,b,y,g,E,x,w,C;for(x=[]...
  function os (line 290) | function os(e,t,n){this.type=e,this.tag=t,this.attrs=null,this.map=null,...
  function $S (line 290) | function $S(e,t,n){this.src=e,this.env=n,this.tokens=[],this.inlineMode=...
  function Ev (line 290) | function Ev(){this.ruler=new sme;for(var e=0;e<Ed.length;e++)this.ruler....
  function xd (line 290) | function xd(e,t){var n=e.bMarks[t]+e.tShift[t],r=e.eMarks[t];return e.sr...
  function q1 (line 290) | function q1(e){var t=[],n=0,r=e.length,o,i=!1,s=0,a="";for(o=e.charCodeA...
  function B1 (line 291) | function B1(e,t){var n,r,o,i;return r=e.bMarks[t]+e.tShift[t],o=e.eMarks...
  function z1 (line 291) | function z1(e,t){var n,r=e.bMarks[t]+e.tShift[t],o=r,i=e.eMarks[t];if(o+...
  function hme (line 291) | function hme(e,t){var n,r,o=e.level+2;for(n=t+2,r=e.tokens.length-2;n<r;...
  function Gn (line 291) | function Gn(e,t,n,r){var o,i,s,a,l,c,u,d;for(this.src=e,this.md=t,this.e...
  function sf (line 291) | function sf(){this.ruler=new Mme;for(var e=0;e<Pl.length;e++)this.ruler....
  function jme (line 291) | function jme(e){switch(e){case 10:case 33:case 35:case 36:case 37:case 3...
  function W1 (line 291) | function W1(e,t){var n,r,o,i,s,a=[],l=t.length;for(n=0;n<l;n++)o=t[n],o....
  function Q1 (line 291) | function Q1(e,t){var n,r,o,i,s,a,l=t.length;for(n=l-1;n>=0;n--)r=t[n],!(...
  function tve (line 291) | function tve(e){var t=e|32;return t>=97&&t<=122}
  function X1 (line 291) | function X1(e,t){var n,r,o,i,s,a,l,c,u={},d=t.length;if(d){var p=0,f=-2,...
  function za (line 291) | function za(e,t,n,r){this.src=e,this.env=n,this.md=t,this.tokens=r,this....
  function Ha (line 291) | function Ha(){var e;for(this.ruler=new tE,e=0;e<Sd.length;e++)this.ruler...
  function dve (line 291) | function dve(){return nE||(nE=1,Td=function(e){var t={};t.src_Any=RS().s...
  function Sh (line 291) | function Sh(e){var t=Array.prototype.slice.call(arguments,1);return t.fo...
  function cf (line 291) | function cf(e){return Object.prototype.toString.call(e)}
  function pve (line 291) | function pve(e){return cf(e)==="[object String]"}
  function hve (line 291) | function hve(e){return cf(e)==="[object Object]"}
  function mve (line 291) | function mve(e){return cf(e)==="[object RegExp]"}
  function rE (line 291) | function rE(e){return cf(e)==="[object Function]"}
  function vve (line 291) | function vve(e){return e.replace(/[.?*+^$[\]\\(){}|-]/g,"\\$&")}
  function gve (line 291) | function gve(e){return Object.keys(e||{}).reduce(function(t,n){return t|...
  function xve (line 291) | function xve(e){e.__index__=-1,e.__text_cache__=""}
  function wve (line 291) | function wve(e){return function(t,n){var r=t.slice(n);return e.test(r)?r...
  function oE (line 291) | function oE(){return function(e,t){t.normalize(e)}}
  function tu (line 291) | function tu(e){var t=e.re=dve()(e.__opts__),n=e.__tlds__.slice();e.onCom...
  function _ve (line 291) | function _ve(e,t){var n=e.__index__,r=e.__last_index__,o=e.__text_cache_...
  function iE (line 291) | function iE(e,t){var n=new _ve(e,t);return e.__compiled__[n.schema].norm...
  function on (line 291) | function on(e,t){if(!(this instanceof on))return new on(e,t);t||gve(e)&&...
  function xr (line 291) | function xr(e){throw new RangeError(Dve[e])}
  function Ive (line 291) | function Ive(e,t){const n=[];let r=e.length;for(;r--;)n[r]=t(e[r]);retur...
  function HS (line 291) | function HS(e,t){const n=e.split("@");let r="";n.length>1&&(r=n[0]+"@",e...
  function _v (line 291) | function _v(e){const t=[];let n=0;const r=e.length;for(;n<r;){const o=e....
  function Qve (line 291) | function Qve(e){var t=e.trim().toLowerCase();return Gve.test(t)?!!Wve.te...
  function Yve (line 291) | function Yve(e){var t=go.parse(e,!0);if(t.hostname&&(!t.protocol||XS.ind...
  function Zve (line 291) | function Zve(e){var t=go.parse(e,!0);if(t.hostname&&(!t.protocol||XS.ind...
  function sn (line 291) | function sn(e,t){if(!(this instanceof sn))return new sn(e,t);t||Ms.isStr...
  function t0e (line 291) | function t0e(e){for(var t in e)e[t]!==null&&(t==="projectionNodeConstruc...
  function o0e (line 291) | function o0e(e,t,n){var r=[],o=h.useContext(KS);if(!t)return null;JS!=="...
  function i0e (line 291) | function i0e(){return h.useContext(ff).visualElement}
  function s0e (line 291) | function s0e(){if(tC=!0,!!is)if(window.matchMedia){var e=window.matchMed...
  function a0e (line 291) | function a0e(){!tC&&s0e();var e=Ie(h.useState(Th.current),1),t=e[0];retu...
  function l0e (line 291) | function l0e(){var e=a0e(),t=h.useContext(uf).reducedMotion;return t==="...
  function c0e (line 291) | function c0e(e,t,n,r){var o=h.useContext(KS),i=i0e(),s=h.useContext(df),...
  function gi (line 291) | function gi(e){return typeof e=="object"&&Object.prototype.hasOwnPropert...
  function u0e (line 291) | function u0e(e,t,n){return h.useCallback(function(r){var o;r&&((o=e.moun...
  function nC (line 291) | function nC(e){return Array.isArray(e)}
  function pn (line 291) | function pn(e){return typeof e=="string"||nC(e)}
  function f0e (line 291) | function f0e(e){var t={};return e.forEachValue(function(n,r){return t[r]...
  function d0e (line 291) | function d0e(e){var t={};return e.forEachValue(function(n,r){return t[r]...
  function rC (line 291) | function rC(e,t,n,r,o){var i;return r===void 0&&(r={}),o===void 0&&(o={}...
  function pf (line 291) | function pf(e,t,n){var r=e.getProps();return rC(r,t,n??r.custom,f0e(e),d...
  function hf (line 291) | function hf(e){var t;return typeof((t=e.animate)===null||t===void 0?void...
  function oC (line 291) | function oC(e){return!!(hf(e)||e.variants)}
  function p0e (line 291) | function p0e(e,t){if(hf(e)){var n=e.initial,r=e.animate;return{initial:n...
  function h0e (line 291) | function h0e(e){var t=p0e(e,h.useContext(ff)),n=t.initial,r=t.animate;re...
  function aE (line 291) | function aE(e){return Array.isArray(e)?e.join(" "):e}
  function Jr (line 291) | function Jr(e){var t=h.useRef(null);return t.current===null&&(t.current=...
  function v0e (line 291) | function v0e(){return Jr(function(){if(Vs.hasEverUpdated)return m0e++})}
  function g0e (line 291) | function g0e(e,t,n,r){var o,i=t.layoutId,s=t.layout,a=t.drag,l=t.dragCon...
  function t (line 291) | function t(){return e!==null&&e.apply(this,arguments)||this}
  function E0e (line 291) | function E0e(e){var t=e.preloadedFeatures,n=e.createVisualElement,r=e.pr...
  function b0e (line 291) | function b0e(e){var t,n=e.layoutId,r=(t=h.useContext(iC))===null||t===vo...
  function x0e (line 291) | function x0e(e){function t(r,o){return o===void 0&&(o={}),E0e(e(r,o))}if...
  function Tv (line 291) | function Tv(e){return typeof e!="string"||e.includes("-")?!1:!!(w0e.inde...
  function _0e (line 291) | function _0e(e){Object.assign(ru,e)}
  function C0e (line 291) | function C0e(e,t){return xa.indexOf(e)-xa.indexOf(t)}
  function Ga (line 291) | function Ga(e){return T0e.has(e)}
  function aC (line 291) | function aC(e){return k0e.has(e)}
  function lC (line 291) | function lC(e,t){var n=t.layout,r=t.layoutId;return Ga(e)||aC(e)||(n||r!...
  function A0e (line 291) | function A0e(e,t,n,r){var o=e.transform,i=e.transformKeys,s=t.enableHard...
  function D0e (line 291) | function D0e(e){var t=e.originX,n=t===void 0?"50%":t,r=e.originY,o=r===v...
  function cC (line 291) | function cC(e){return e.startsWith("--")}
  function Wa (line 291) | function Wa(e){return typeof e=="string"}
  function $0e (line 291) | function $0e(e){let t="",n="",r="",o="";return e.length>5?(t=e.substr(1,...
  function F0e (line 291) | function F0e(e){var t,n,r,o;return isNaN(e)&&Wa(e)&&((n=(t=e.match(wa))=...
  function hC (line 291) | function hC(e){typeof e=="number"&&(e=`${e}`);const t=[];let n=0;const r...
  function mC (line 291) | function mC(e){return hC(e).values}
  function vC (line 291) | function vC(e){const{values:t,numColors:n,tokenised:r}=hC(e),o=t.length;...
  function V0e (line 291) | function V0e(e){const t=mC(e);return vC(e)(t.map(M0e))}
  function q0e (line 291) | function q0e(e){let[t,n]=e.slice(0,-1).split("(");if(t==="drop-shadow")r...
  function Nv (line 291) | function Nv(e,t,n,r){var o,i=e.style,s=e.vars,a=e.transform,l=e.transfor...
  function yC (line 291) | function yC(e,t,n){for(var r in t)!Un(t[r])&&!lC(r,n)&&(e[r]=t[r])}
  function B0e (line 291) | function B0e(e,t,n){var r=e.transformTemplate;return h.useMemo(function(...
  function z0e (line 291) | function z0e(e,t,n){var r=e.style||{},o={};return yC(o,r,e),Object.assig...
  function H0e (line 291) | function H0e(e,t,n){var r={},o=z0e(e,t,n);return e.drag&&e.dragListener!...
  function ou (line 291) | function ou(e){return G0e.has(e)}
  function W0e (line 291) | function W0e(e){e&&(EC=function(t){return t.startsWith("on")?!ou(t):e(t)})}
  function Q0e (line 291) | function Q0e(e,t,n){var r={};for(var o in e)(EC(o)||n===!0&&ou(o)||!t&&!...
  function uE (line 291) | function uE(e,t,n){return typeof e=="string"?e:re.transform(t+n*e)}
  function Y0e (line 291) | function Y0e(e,t,n){var r=uE(t,e.x,e.width),o=uE(n,e.y,e.height);return"...
  function J0e (line 291) | function J0e(e,t,n,r,o){n===void 0&&(n=1),r===void 0&&(r=0),o===void 0&&...
  function Dv (line 291) | function Dv(e,t,n,r){var o=t.attrX,i=t.attrY,s=t.originX,a=t.originY,l=t...
  function K0e (line 291) | function K0e(e,t){var n=h.useMemo(function(){var o=bC();return Dv(o,t,{e...
  function ege (line 291) | function ege(e){e===void 0&&(e=!1);var t=function(n,r,o,i,s,a){var l=s.l...
  function wC (line 291) | function wC(e,t,n,r){var o=t.style,i=t.vars;Object.assign(e.style,o,r&&r...
  function SC (line 291) | function SC(e,t,n,r){wC(e,t,void 0,r);for(var o in t.attrs)e.setAttribut...
  function Iv (line 291) | function Iv(e){var t=e.style,n={};for(var r in t)(Un(t[r])||lC(r,e))&&(n...
  function CC (line 291) | function CC(e){var t=Iv(e);for(var n in e)if(Un(e[n])){var r=n==="x"||n=...
  function Rv (line 291) | function Rv(e){return typeof e=="object"&&typeof e.start=="function"}
  function dc (line 291) | function dc(e){var t=Un(e)?e.get():e;return rge(t)?t.toValue():t}
  function fE (line 291) | function fE(e,t,n,r){var o=e.scrapeMotionValuesFromProps,i=e.createRende...
  function oge (line 291) | function oge(e,t,n,r){var o={},i=(n==null?void 0:n.initial)===!1,s=r(e);...
  function age (line 291) | function age(e,t,n,r,o){var i=t.forwardMotionProps,s=i===void 0?!1:i,a=T...
  function mf (line 291) | function mf(e,t,n,r){return r===void 0&&(r={passive:!0}),e.addEventListe...
  function Ih (line 291) | function Ih(e,t,n,r){h.useEffect(function(){var o=e.current;if(n&&o)retu...
  function lge (line 291) | function lge(e){var t=e.whileFocus,n=e.visualElement,r=function(){var i;...
  function NC (line 291) | function NC(e){return typeof PointerEvent<"u"&&e instanceof PointerEvent...
  function AC (line 291) | function AC(e){var t=!!e.touches;return t}
  function cge (line 291) | function cge(e){return function(t){var n=t instanceof MouseEvent,r=!n||n...
  function fge (line 291) | function fge(e,t){t===void 0&&(t="page");var n=e.touches[0]||e.changedTo...
  function dge (line 291) | function dge(e,t){return t===void 0&&(t="page"),{x:e[t+"X"],y:e[t+"Y"]}}
  function Lv (line 291) | function Lv(e,t){return t===void 0&&(t="page"),{point:AC(e)?fge(e,t):dge...
  function IC (line 291) | function IC(e){return pge()?e:hge()?gge[e]:mge()?vge[e]:e}
  function Di (line 291) | function Di(e,t,n,r){return mf(e,IC(t),DC(n,t==="pointerdown"),r)}
  function iu (line 291) | function iu(e,t,n,r){return Ih(e,IC(t),n&&DC(n,t==="pointerdown"),r)}
  function RC (line 291) | function RC(e){var t=null;return function(){var n=function(){t=null};ret...
  function LC (line 291) | function LC(e){var t=!1;if(e==="y")t=pE();else if(e==="x")t=dE();else{va...
  function OC (line 291) | function OC(){var e=LC(!0);return e?(e(),!1):!0}
  function hE (line 291) | function hE(e,t,n){return function(r,o){var i;!NC(r)||OC()||((i=e.animat...
  function yge (line 291) | function yge(e){var t=e.onHoverStart,n=e.onHoverEnd,r=e.whileHover,o=e.v...
  function $C (line 291) | function $C(e){return h.useEffect(function(){return function(){return e(...
  function wge (line 291) | function wge({duration:e=800,bounce:t=.25,velocity:n=0,mass:r=1}){let o,...
  function Sge (line 291) | function Sge(e,t,n){let r=n;for(let o=1;o<_ge;o++)r=r-e(r)/t(r);return r}
  function Rh (line 291) | function Rh(e,t){return e*Math.sqrt(1-t*t)}
  function vE (line 291) | function vE(e,t){return t.some(n=>e[n]!==void 0)}
  function kge (line 291) | function kge(e){let t=Object.assign({velocity:0,stiffness:100,damping:10...
  function Ov (line 291) | function Ov(e){var{from:t=0,to:n=1,restSpeed:r=2,restDelta:o}=e,i=yt(e,[...
  function Id (line 291) | function Id(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*6*n:n<1/...
  function yE (line 291) | function yE({hue:e,saturation:t,lightness:n,alpha:r}){e/=360,t/=100,n/=1...
  function MC (line 291) | function MC(e,t){return Lh(e)?n=>Oe(e,t,n):Et.test(e)?FC(e,t):jC(e,t)}
  function bE (line 291) | function bE(e){const t=fr.parse(e),n=t.length;let r=0,o=0,i=0;for(let s=...
  function Lge (line 291) | function Lge(e){if(typeof e=="number")return Rge;if(typeof e=="string")r...
  function Oge (line 291) | function Oge(e,t,n){const r=[],o=n||Lge(e[0]),i=e.length-1;for(let s=0;s...
  function Pge (line 291) | function Pge([e,t],[n]){return r=>n(Sa(e,t,r))}
  function $ge (line 291) | function $ge(e,t){const n=e.length,r=n-1;return o=>{let i=0,s=!1;if(o<=e...
  function Pv (line 291) | function Pv(e,t,{clamp:n=!0,ease:r,mixer:o}={}){const i=e.length;nu(i===...
  function Jge (line 291) | function Jge(e,t){return e.map(()=>t||BC).splice(0,e.length-1)}
  function Kge (line 291) | function Kge(e){const t=e.length;return e.map((n,r)=>r!==0?r/(t-1):0)}
  function eye (line 291) | function eye(e,t){return e.map(n=>n*t)}
  function pc (line 291) | function pc({from:e=0,to:t=1,ease:n,offset:r,duration:o=300}){const i={d...
  function tye (line 291) | function tye({velocity:e=0,from:t=0,power:n=.8,timeConstant:r=350,restDe...
  function nye (line 291) | function nye(e){if(Array.isArray(e.to))return pc;if(xE[e.type])return xE...
  function oye (line 291) | function oye(e){let t=[],n=[],r=0,o=!1,i=!1;const s=new WeakSet,a={sched...
  function QC (line 291) | function QC(e,t,n=0){return e-t-n}
  function lye (line 291) | function lye(e,t,n=0,r=!0){return r?QC(t+-e,t,n):t-(e-t)+n}
  function cye (line 291) | function cye(e,t,n,r){return r?e>=t+n:e<=-n}
  function YC (line 291) | function YC(e){var t,n,{from:r,autoplay:o=!0,driver:i=uye,elapsed:s=0,re...
  function ZC (line 291) | function ZC(e,t){return t?e*(1e3/t):0}
  function fye (line 291) | function fye({from:e=0,velocity:t=0,min:n,max:r,power:o=.8,timeConstant:...
  function XC (line 291) | function XC(e,t){if(Lh(e)&&Lh(t))return Fl(e,t);if($h(e)&&$h(t)){const n...
  function hye (line 291) | function hye(e,t,n,r,o){let i,s,a=0;do s=t+(n-t)/2,i=cu(s,r,o)-e,i>0?n=s...
  function gye (line 291) | function gye(e,t,n,r){for(let o=0;o<mye;++o){const i=tT(t,n,r);if(i===0)...
  function yye (line 291) | function yye(e,t,n,r){if(e===t&&n===r)return Fv;const o=new Float32Array...
  function Eye (line 291) | function Eye(e){var t=e.onTap,n=e.onTapStart,r=e.onTapCancel,o=e.whileTa...
  function bye (line 291) | function bye(e,t,n){e||_E.has(t)||(console.warn(t),n&&console.warn(n),_E...
  function _ye (line 291) | function _ye(e){var t=e.root,n=yt(e,["root"]),r=t||document;Ld.has(r)||L...
  function Sye (line 291) | function Sye(e,t,n){var r=_ye(t);return Fh.set(e,n),r.observe(e),functio...
  function Cye (line 291) | function Cye(e){var t=e.visualElement,n=e.whileInView,r=e.onViewportEnte...
  function kye (line 291) | function kye(e,t,n,r){var o=r.root,i=r.margin,s=r.amount,a=s===void 0?"s...
  function Nye (line 291) | function Nye(e,t,n,r){var o=r.fallback,i=o===void 0?!0:o;h.useEffect(fun...
  function nT (line 291) | function nT(){var e=h.useContext(df);if(e===null)return[!0,null];var t=e...
  function rT (line 291) | function rT(e,t){if(!Array.isArray(t))return!1;var n=t.length;if(n!==e.l...
  function Uv (line 291) | function Uv(e,t){var n,r=qv(e);return r!==Dh&&(r=fr),(n=r.getAnimatableN...
  function Mye (line 291) | function Mye(e){e.when,e.delay,e.delayChildren,e.staggerChildren,e.stagg...
  function Vye (line 291) | function Vye(e){var t=e.ease,n=e.times,r=e.yoyo,o=e.flip,i=e.loop,s=yt(e...
  function jye (line 291) | function jye(e,t){var n,r,o=Bv(e,t)||{};return(r=(n=o.delay)!==null&&n!=...
  function qye (line 291) | function qye(e){return Array.isArray(e.to)&&e.to[0]===null&&(e.to=_n([],...
  function Uye (line 291) | function Uye(e,t,n){var r;return Array.isArray(t.to)&&((r=e.duration)!==...
  function Bye (line 291) | function Bye(e,t,n,r,o){var i,s=Bv(r,e),a=(i=s.from)!==null&&i!==void 0?...
  function kE (line 291) | function kE(e){return e===0||typeof e=="string"&&parseFloat(e)===0&&e.in...
  function NE (line 291) | function NE(e){return typeof e=="number"?0:Uv("",e)}
  function Bv (line 291) | function Bv(e,t){return e[t]||e.default||e}
  function zv (line 291) | function zv(e,t,n,r){return r===void 0&&(r={}),t.start(function(o){var i...
  function Hv (line 291) | function Hv(e,t){e.indexOf(t)===-1&&e.push(t)}
  function Gv (line 291) | function Gv(e,t){var n=e.indexOf(t);n>-1&&e.splice(n,1)}
  function Gye (line 291) | function Gye(e,t,n){var r=Ie(e),o=r.slice(0),i=t<0?o.length+t:t;if(i>=0&...
  function e (line 291) | function e(){this.subscriptions=[]}
  function e (line 291) | function e(t){var n=this;this.version="6.5.1",this.timeDelta=0,this.last...
  function $o (line 291) | function $o(e){return new Qye(e)}
  function Jye (line 291) | function Jye(e,t,n){e.hasValue(t)?e.getValue(t).set(n):e.addValue(t,$o(n))}
  function Kye (line 291) | function Kye(e,t){var n=pf(e,t),r=n?e.makeTargetAnimatable(n,!1):{},o=r....
  function e1e (line 291) | function e1e(e,t,n){var r,o,i,s,a=Object.keys(t).filter(function(f){retu...
  function t1e (line 291) | function t1e(e,t){if(t){var n=t[e]||t.default||t;return n.from}}
  function n1e (line 291) | function n1e(e,t,n){var r,o,i={};for(var s in e)i[s]=(r=t1e(s,t))!==null...
  function r1e (line 291) | function r1e(e,t,n){n===void 0&&(n={}),e.notifyAnimationStart(t);var r;i...
  function Mh (line 291) | function Mh(e,t,n){var r;n===void 0&&(n={});var o=pf(e,t,n.custom),i=(o|...
  function sT (line 291) | function sT(e,t,n){var r,o=n===void 0?{}:n,i=o.delay,s=i===void 0?0:i,a=...
  function o1e (line 291) | function o1e(e,t,n,r,o,i){n===void 0&&(n=0),r===void 0&&(r=0),o===void 0...
  function i1e (line 291) | function i1e(e,t){return e.sortNodePosition(t)}
  function s1e (line 291) | function s1e(e,t){var n=e.protectedKeys,r=e.needsAnimating,o=n.hasOwnPro...
  function c1e (line 291) | function c1e(e){return function(t){return Promise.all(t.map(function(n){...
  function u1e (line 291) | function u1e(e){var t=c1e(e),n=d1e(),r={},o=!0,i=function(u,d){var p=pf(...
  function f1e (line 291) | function f1e(e,t){return typeof t=="string"?t!==e:nC(t)?!rT(t,e):!1}
  function ao (line 291) | function ao(e){return e===void 0&&(e=!1),{isActive:e,protectedKeys:{},ne...
  function d1e (line 291) | function d1e(){var e;return e={},e[Se.Animate]=ao(!0),e[Se.InView]=ao(),...
  function e (line 291) | function e(t,n,r){var o=this,i=r===void 0?{}:r,s=i.transformPagePoint;if...
  function Pd (line 291) | function Pd(e,t){return t?{point:t(e.point)}:e}
  function AE (line 291) | function AE(e,t){return{x:e.x-t.x,y:e.y-t.y}}
  function $d (line 291) | function $d(e,t){var n=e.point;return{point:n,delta:AE(n,lT(t)),offset:A...
  function h1e (line 291) | function h1e(e){return e[0]}
  function lT (line 291) | function lT(e){return e[e.length-1]}
  function m1e (line 291) | function m1e(e,t){if(e.length<2)return{x:0,y:0};for(var n=e.length-1,r=n...
  function dr (line 291) | function dr(e){return e.max-e.min}
  function DE (line 291) | function DE(e,t,n){return t===void 0&&(t=0),n===void 0&&(n=.01),XC(e,t)<n}
  function IE (line 291) | function IE(e,t,n,r){r===void 0&&(r=.5),e.origin=r,e.originPoint=Oe(t.mi...
  function Bs (line 291) | function Bs(e,t,n,r){IE(e.x,t.x,n.x,r==null?void 0:r.originX),IE(e.y,t.y...
  function RE (line 291) | function RE(e,t,n){e.min=n.min+t.min,e.max=e.min+dr(t)}
  function v1e (line 291) | function v1e(e,t,n){RE(e.x,t.x,n.x),RE(e.y,t.y,n.y)}
  function LE (line 291) | function LE(e,t,n){e.min=t.min-n.min,e.max=e.min+dr(t)}
  function zs (line 291) | function zs(e,t,n){LE(e.x,t.x,n.x),LE(e.y,t.y,n.y)}
  function g1e (line 291) | function g1e(e,t,n){var r=t.min,o=t.max;return r!==void 0&&e<r?e=n?Oe(r,...
  function OE (line 291) | function OE(e,t,n){return{min:t!==void 0?e.min+t:void 0,max:n!==void 0?e...
  function y1e (line 291) | function y1e(e,t){var n=t.top,r=t.left,o=t.bottom,i=t.right;return{x:OE(...
  function PE (line 291) | function PE(e,t){var n,r=t.min-e.min,o=t.max-e.max;return t.max-t.min<e....
  function E1e (line 291) | function E1e(e,t){return{x:PE(e.x,t.x),y:PE(e.y,t.y)}}
  function b1e (line 291) | function b1e(e,t){var n=.5,r=dr(e),o=dr(t);return o>r?n=Sa(t.min,t.max-r...
  function x1e (line 291) | function x1e(e,t){var n={};return t.min!==void 0&&(n.min=t.min-e.min),t....
  function w1e (line 291) | function w1e(e){return e===void 0&&(e=Vh),e===!1?e=0:e===!0&&(e=Vh),{x:$...
  function $E (line 291) | function $E(e,t,n){return{min:FE(e,t),max:FE(e,n)}}
  function FE (line 291) | function FE(e,t){var n;return typeof e=="number"?e:(n=e[t])!==null&&n!==...
  function Ln (line 291) | function Ln(e){return[e("x"),e("y")]}
  function cT (line 291) | function cT(e){var t=e.top,n=e.left,r=e.right,o=e.bottom;return{x:{min:n...
  function _1e (line 291) | function _1e(e){var t=e.x,n=e.y;return{top:n.min,right:t.max,bottom:n.ma...
  function S1e (line 291) | function S1e(e,t){if(!t)return e;var n=t({x:e.left,y:e.top}),r=t({x:e.ri...
  function Fd (line 291) | function Fd(e){return e===void 0||e===1}
  function uT (line 291) | function uT(e){var t=e.scale,n=e.scaleX,r=e.scaleY;return!Fd(t)||!Fd(n)|...
  function yr (line 291) | function yr(e){return uT(e)||jE(e.x)||jE(e.y)||e.z||e.rotate||e.rotateX|...
  function jE (line 291) | function jE(e){return e&&e!=="0%"}
  function fu (line 291) | function fu(e,t,n){var r=e-n,o=t*r;return n+o}
  function qE (line 291) | function qE(e,t,n,r,o){return o!==void 0&&(e=fu(e,o,r)),fu(e,n,r)+t}
  function jh (line 291) | function jh(e,t,n,r,o){t===void 0&&(t=0),n===void 0&&(n=1),e.min=qE(e.mi...
  function fT (line 291) | function fT(e,t){var n=t.x,r=t.y;jh(e.x,n.translate,n.scale,n.originPoin...
  function C1e (line 291) | function C1e(e,t,n,r){var o,i;r===void 0&&(r=!1);var s=n.length;if(s){t....
  function wr (line 291) | function wr(e,t){e.min=e.min+t,e.max=e.max+t}
  function UE (line 291) | function UE(e,t,n){var r=Ie(n,3),o=r[0],i=r[1],s=r[2],a=t[s]!==void 0?t[...
  function yi (line 291) | function yi(e,t){UE(e.x,t,T1e),UE(e.y,t,k1e)}
  function dT (line 291) | function dT(e,t){return cT(S1e(e.getBoundingClientRect(),t))}
  function N1e (line 291) | function N1e(e,t,n){var r=dT(e,n),o=t.scroll;return o&&(wr(r.x,o.x),wr(r...
  function e (line 291) | function e(t){this.openGlobalLock=null,this.isDragging=!1,this.currentDi...
  function jl (line 291) | function jl(e,t,n){return(t===!0||t===e)&&(n===null||n===e)}
  function I1e (line 291) | function I1e(e,t){t===void 0&&(t=10);var n=null;return Math.abs(e.y)>t?n...
  function R1e (line 291) | function R1e(e){var t=e.dragControls,n=e.visualElement,r=Jr(function(){r...
  function L1e (line 291) | function L1e(e){var t=e.onPan,n=e.onPanStart,r=e.onPanEnd,o=e.onPanSessi...
  function P1e (line 291) | function P1e(){var e=ql.map(function(){return new Us}),t={},n={clearAllL...
  function $1e (line 291) | function $1e(e,t,n){var r;for(var o in t){var i=t[o],s=n[o];if(Un(i))e.a...
  function N (line 291) | function N(){!T||!x||(M(),a(T,C,v.style,te.projection))}
  function M (line 291) | function M(){r(te,C,w,f,v)}
  function R (line 291) | function R(){A.notifyUpdate(w)}
  function I (line 291) | function I(j,z){var Y=z.onChange(function(lt){w[j]=lt,v.onUpdate&&Sn.upd...
  function qh (line 291) | function qh(e){return typeof e=="string"&&e.startsWith("var(--")}
  function M1e (line 291) | function M1e(e){var t=mT.exec(e);if(!t)return[,];var n=Ie(t,3),r=n[1],o=...
  function Uh (line 291) | function Uh(e,t,n){var r=Ie(M1e(e),2),o=r[0],i=r[1];if(o){var s=window.g...
  function V1e (line 291) | function V1e(e,t,n){var r,o=yt(t,[]),i=e.getInstance();if(!(i instanceof...
  function z1e (line 291) | function z1e(e){var t=[];return B1e.forEach(function(n){var r=e.getValue...
  function W1e (line 291) | function W1e(e,t,n,r){return q1e(t)?G1e(e,t,n,r):{target:t,transitionEnd...
  function Y1e (line 291) | function Y1e(e){return window.getComputedStyle(e)}
  function QE (line 291) | function QE(e,t){return t.max===t.min?0:e/(t.max-t.min)*100}
  function t (line 291) | function t(){return e!==null&&e.apply(this,arguments)||this}
  function tEe (line 291) | function tEe(e){var t=Ie(nT(),2),n=t[0],r=t[1],o=h.useContext(iC);return...
  function oEe (line 291) | function oEe(e,t,n){n===void 0&&(n={});var r=Un(e)?e:$o(e);return zv("",...
  function sEe (line 291) | function sEe(e,t,n,r,o,i){var s,a,l,c;o?(e.opacity=Oe(0,(s=n.opacity)!==...
  function JE (line 291) | function JE(e,t){var n;return(n=e[t])!==null&&n!==void 0?n:e.borderRadius}
  function bT (line 291) | function bT(e,t,n){return function(r){return r<e?0:r>t?1:n(Sa(e,t,r))}}
  function KE (line 291) | function KE(e,t){e.min=t.min,e.max=t.max}
  function un (line 291) | function un(e,t){KE(e.x,t.x),KE(e.y,t.y)}
  function eb (line 291) | function eb(e,t,n,r,o){return e-=t,e=fu(e,1/n,r),o!==void 0&&(e=fu(e,1/o...
  function cEe (line 291) | function cEe(e,t,n,r,o,i,s){if(t===void 0&&(t=0),n===void 0&&(n=1),r===v...
  function tb (line 291) | function tb(e,t,n,r,o){var i=Ie(n,3),s=i[0],a=i[1],l=i[2];cEe(e,t[s],t[a...
  function nb (line 291) | function nb(e,t,n,r){tb(e.x,t,uEe,n==null?void 0:n.x,r==null?void 0:r.x)...
  function rb (line 291) | function rb(e){return e.translate===0&&e.scale===1}
  function xT (line 291) | function xT(e){return rb(e.x)&&rb(e.y)}
  function wT (line 291) | function wT(e,t){return e.x.min===t.x.min&&e.x.max===t.x.max&&e.y.min===...
  function e (line 291) | function e(){this.members=[]}
  function ob (line 291) | function ob(e,t,n){var r=e.x.translate/t.x,o=e.y.translate/t.y,i="transl...
  function e (line 291) | function e(){this.children=[],this.isDirty=!1}
  function _T (line 291) | function _T(e){var t=e.attachResizeListener,n=e.defaultParent,r=e.measur...
  function vEe (line 291) | function vEe(e){e.updateLayout()}
  function gEe (line 291) | function gEe(e){var t,n,r,o,i=(n=(t=e.resumeFrom)===null||t===void 0?voi...
  function yEe (line 291) | function yEe(e){e.clearSnapshot()}
  function sb (line 291) | function sb(e){e.clearMeasurements()}
  function EEe (line 291) | function EEe(e){var t=e.options.visualElement;t!=null&&t.getProps().onBe...
  function bEe (line 291) | function bEe(e){e.finishAnimation(),e.targetDelta=e.relativeTarget=e.tar...
  function xEe (line 291) | function xEe(e){e.resolveTargetDelta()}
  function wEe (line 291) | function wEe(e){e.calcProjection()}
  function _Ee (line 291) | function _Ee(e){e.resetRotation()}
  function SEe (line 291) | function SEe(e){e.removeLeadSnapshot()}
  function ab (line 291) | function ab(e,t,n){e.translate=Oe(t.translate,0,n),e.scale=Oe(t.scale,1,...
  function lb (line 291) | function lb(e,t,n,r){e.min=Oe(t.min,n.min,r),e.max=Oe(t.max,n.max,r)}
  function CEe (line 291) | function CEe(e,t,n,r){lb(e.x,t.x,n.x,r),lb(e.y,t.y,n.y,r)}
  function TEe (line 291) | function TEe(e){return e.animationValues&&e.animationValues.opacityExit!...
  function NEe (line 291) | function NEe(e,t){for(var n=e.root,r=e.path.length-1;r>=0;r--)if(e.path[...
  function cb (line 291) | function cb(e){e.min=Math.round(e.min),e.max=Math.round(e.max)}
  function ub (line 291) | function ub(e){cb(e.x),cb(e.y)}
  function REe (line 291) | function REe(e,t,n,r){if(!r)return e;var o=e.findIndex(function(u){retur...
  function LEe (line 291) | function LEe(e,t){var n=e.children,r=e.as,o=r===void 0?"ul":r,i=e.axis,s...
  function PEe (line 291) | function PEe(e){return e.value}
  function $Ee (line 291) | function $Ee(e,t){return e.layout.min-t.layout.min}
  function TT (line 291) | function TT(e){var t=Jr(function(){return $o(e)}),n=h.useContext(uf).isS...
  function VEe (line 291) | function VEe(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t]...
  function jEe (line 291) | function jEe(e,t){Ch(function(){var n=e.map(function(r){return r.onChang...
  function qEe (line 291) | function qEe(e,t){var n=TT(t()),r=function(){return n.set(t())};return r...
  function UEe (line 291) | function UEe(e,t,n,r){var o=typeof t=="function"?t:VEe(t,n,r);return Arr...
  function fb (line 291) | function fb(e,t){var n=Jr(function(){return[]});return qEe(e,function(){...
  function db (line 291) | function db(e,t){return t===void 0&&(t=0),Un(e)?e:TT(t)}
  function BEe (line 291) | function BEe(e,t){var n=e.children,r=e.style,o=e.value,i=e.as,s=i===void...
  function obe (line 291) | function obe(e,t){const n=Math.abs(t.top-e.y),r=Math.abs(t.bottom-e.y),o...
  function ibe (line 291) | function ibe(e,t,n=5){const r=[];switch(t){case"top":r.push({x:e.x-n,y:e...
  function sbe (line 291) | function sbe(e){const{top:t,right:n,bottom:r,left:o}=e;return[{x:o,y:t},...
  function abe (line 291) | function abe(e,t){const{x:n,y:r}=e;let o=!1;for(let i=0,s=t.length-1;i<t...
  function lbe (line 291) | function lbe(e){const t=e.slice();return t.sort((n,r)=>n.x<r.x?-1:n.x>r....
  function cbe (line 291) | function cbe(e){if(e.length<=1)return e.slice();const t=[];for(let r=0;r...
  method constructor (line 291) | constructor(){Vd(this,"current",this.detect()),Vd(this,"handoffState","p...
  method set (line 291) | set(t){this.current!==t&&(this.handoffState="pending",this.currentId=0,t...
  method reset (line 291) | reset(){this.set(this.detect())}
  method nextId (line 291) | nextId(){return++this.currentId}
  method isServer (line 291) | get isServer(){return this.current==="server"}
  method isClient (line 291) | get isClient(){return this.current==="client"}
  method detect (line 291) | detect(){return typeof window>"u"||typeof document>"u"?"server":"client"}
  method handoff (line 291) | handoff(){this.handoffState==="pending"&&(this.handoffState="complete")}
  method isHandoffComplete (line 291) | get isHandoffComplete(){return this.handoffState==="complete"}
  function Xa (line 291) | function Xa(e){let t=h.useRef(e);return jt(()=>{t.current=e},[e]),t}
  function Xv (line 291) | function Xv(e,t){let[n,r]=h.useState(e),o=Xa(e);return jt(()=>r(o.curren...
  function ybe (line 291) | function ybe(e){typeof queueMicrotask=="function"?queueMicrotask(e):Prom...
  function du (line 291) | function du(){let e=[],t={addEventListener(n,r,o,i){return n.addEventLis...
  function Jv (line 291) | function Jv(){let[e]=h.useState(du);return h.useEffect(()=>()=>e.dispose...
  function Ebe (line 291) | function Ebe(){let e=typeof document>"u";return"useSyncExternalStore"in ...
  function bbe (line 291) | function bbe(){let e=Ebe(),[t,n]=h.useState(So.isHandoffComplete);return...
  function nr (line 291) | function nr(e,t,...n){if(e in t){let o=t[e];return typeof o=="function"?...
  function Kv (line 291) | function Kv(e){return So.isServer?null:e instanceof Node?e.ownerDocument...
  function Sbe (line 291) | function Sbe(e,t=0){var n;return e===((n=Kv(e))==null?void 0:n.body)?!1:...
  function Tbe (line 291) | function Tbe(e,t=n=>n){return e.slice().sort((n,r)=>{let o=t(n),i=t(r);i...
  function Ul (line 291) | function Ul(e,t,n){let r=Xa(t);h.useEffect(()=>{function o(i){r.current(...
  function kbe (line 291) | function kbe(e,t,n){let r=Xa(t);h.useEffect(()=>{function o(i){r.current...
  function Nbe (line 291) | function Nbe(e,t,n=!0){let r=h.useRef(!1);h.useEffect(()=>{requestAnimat...
  function vb (line 291) | function vb(e){var t;if(e.type)return e.type;let n=(t=e.as)!=null?t:"but...
  function Abe (line 291) | function Abe(e,t){let[n,r]=h.useState(()=>vb(e));return jt(()=>{r(vb(e))...
  function Ka (line 291) | function Ka(...e){let t=h.useRef(e);h.useEffect(()=>{t.current=e},[e]);l...
  function Ibe (line 291) | function Ibe({container:e,accept:t,walk:n,enabled:r=!0}){let o=h.useRef(...
  function Rbe (line 291) | function Rbe(e){throw new Error("Unexpected object: "+e)}
  function Lbe (line 291) | function Lbe(e,t){let n=t.resolveItems();if(n.length<=0)return null;let ...
  function gb (line 291) | function gb(...e){return Array.from(new Set(e.flatMap(t=>typeof t=="stri...
  function Go (line 291) | function Go({ourProps:e,theirProps:t,slot:n,defaultTag:r,features:o,visi...
  function Bl (line 291) | function Bl(e,t={},n,r){let{as:o=n,children:i,refName:s="ref",...a}=jd(e...
  function Pbe (line 294) | function Pbe(...e){return{ref:e.every(t=>t==null)?void 0:t=>{for(let n o...
  function IT (line 294) | function IT(...e){if(e.length===0)return{};if(e.length===1)return e[0];l...
  function Wo (line 294) | function Wo(e){var t;return Object.assign(h.forwardRef(e),{displayName:(...
  function Hh (line 294) | function Hh(e){let t=Object.assign({},e);for(let n in t)t[n]===void 0&&d...
  function jd (line 294) | function jd(e,t=[]){let n=Object.assign({},e);for(let r of t)r in n&&del...
  function $be (line 294) | function $be(e){let t=e.parentElement,n=null;for(;t&&!(t instanceof HTML...
  function Fbe (line 294) | function Fbe(e){if(!e)return!1;let t=e.previousElementSibling;for(;t!==n...
  function RT (line 294) | function RT(e={},t=null,n=[]){for(let[r,o]of Object.entries(e))OT(n,LT(t...
  function LT (line 294) | function LT(e,t){return e?e+"["+t+"]":t}
  function OT (line 294) | function OT(e,t,n){if(Array.isArray(n))for(let[r,o]of n.entries())OT(e,L...
  function Vbe (line 294) | function Vbe(e,t){let{features:n=1,...r}=e,o={ref:t,"aria-hidden":(n&2)=...
  function qbe (line 294) | function qbe(){return h.useContext(e0)}
  function Ube (line 294) | function Ube({value:e,children:t}){return $.createElement(e0.Provider,{v...
  function Bbe (line 294) | function Bbe(e,t,n){let[r,o]=h.useState(n),i=e!==void 0,s=h.useRef(i),a=...
  function yb (line 294) | function yb(e,t){let n=h.useRef([]),r=we(e);h.useEffect(()=>{let o=[...n...
  function Eb (line 294) | function Eb(e){return[e.screenX,e.screenY]}
  function zbe (line 294) | function zbe(){let e=h.useRef([-1,-1]);return{wasMoved(t){let n=Eb(t);re...
  function Hbe (line 294) | function Hbe(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi...
  function Gbe (line 294) | function Gbe(){return/Android/gi.test(window.navigator.userAgent)}
  function Wbe (line 294) | function Wbe(){return Hbe()||Gbe()}
  function Qbe (line 294) | function Qbe(...e){return h.useMemo(()=>Kv(...e),[...e])}
  function qd (line 294) | function qd(e,t=n=>n){let n=e.activeOptionIndex!==null?e.options[e.activ...
  method 1 (line 294) | 1(e){var t;return(t=e.dataRef.current)!=null&&t.disabled||e.comboboxStat...
  method 0 (line 294) | 0(e){var t;if((t=e.dataRef.current)!=null&&t.disabled||e.comboboxState==...
  method 2 (line 294) | 2(e,t){var n,r,o,i;if((n=e.dataRef.current)!=null&&n.disabled||(r=e.data...
  function el (line 294) | function el(e){let t=h.useContext(t0);if(t===null){let n=new Error(`<${e...
  function ss (line 294) | function ss(e){let t=h.useContext(n0);if(t===null){let n=new Error(`<${e...
  function exe (line 294) | function exe(e,t){return nr(t.type,Kbe,e,t)}
  function nxe (line 294) | function nxe(e,t){let{value:n,defaultValue:r,onChange:o,form:i,name:s,by...
  function oxe (line 294) | function oxe(e,t){var n,r,o,i;let s=Ja(),{id:a=`headlessui-combobox-inpu...
  function sxe (line 294) | function sxe(e,t){var n;let r=ss("Combobox.Button"),o=el("Combobox.Butto...
  function lxe (line 294) | function lxe(e,t){let n=Ja(),{id:r=`headlessui-combobox-label-${n}`,...o...
  function fxe (line 294) | function fxe(e,t){let n=Ja(),{id:r=`headlessui-combobox-options-${n}`,ho...
  function pxe (line 294) | function pxe(e,t){var n,r;let o=Ja(),{id:i=`headlessui-combobox-option-$...
  function Kr (line 294) | function Kr(e){const t=h.createContext(null);return t.displayName=e,t}
  function eo (line 294) | function eo(e){function t(n){var r;const o=h.useContext(e);if(o===null&&...
  function FT (line 294) | function FT(e){const t=h.useRef(!0),[n,r]=h.useState(new Xp(e.storage));...
  function he (line 294) | function he(e,t=e.name.replace("Svg","").replaceAll(/([A-Z])/g," $1").tr...
  function VT (line 294) | function VT({children:e,...t}){return _.jsx(U5,{...t,children:_.jsxs(z5,...
  function qT (line 294) | function qT({children:e,align:t="start",sideOffset:n=5,className:r,...o}...
  function UT (line 294) | function UT({children:e,align:t="start",side:n="bottom",sideOffset:r=5,l...
  function QT (line 294) | function QT(e){var t;const n=to(),r=h.useRef(new f3(n||new Xp(null),e.ma...
  function YT (line 294) | function YT(){const{items:e,deleteFromHistory:t}=bf({nonNull:!0});let n=...
  function Na (line 294) | function Na(e){const{editLabel:t,toggleFavorite:n,deleteFromHistory:r,se...
  function ZT (line 294) | function ZT(e){return e==null?void 0:e.split(`
  function hu (line 295) | function hu({fetcher:e,getDefaultFieldNames:t,children:n,operationName:r...
  function Wh (line 297) | function Wh({json:e,errorMessageParse:t,errorMessageType:n}){let r;try{r...
  function as (line 297) | async function as(e,t){const n=await me(()=>import("./codemirror.es-52e8...
  function i0 (line 297) | function i0({field:e}){if(!("defaultValue"in e)||e.defaultValue===void 0...
  function s0 (line 297) | function s0(e){if(!e.fetcher)throw new TypeError("The `SchemaContextProv...
  function e2 (line 297) | function e2({inputValueDeprecation:e,introspectionQueryName:t,schemaDesc...
  function t2 (line 297) | function t2(e){let t=null,n=!0;try{e&&(t=JSON.parse(e))}catch{n=!1}retur...
  function a0 (line 297) | function a0(e){const{schema:t,validationErrors:n}=Wn({nonNull:!0,caller:...
  function Aa (line 297) | function Aa(e,t){return qe(e)?_.jsxs(_.Fragment,{children:[Aa(e.ofType,t...
  function En (line 297) | function En(e){const{push:t}=no({nonNull:!0,caller:En});return e.type?Aa...
  function Da (line 297) | function Da({arg:e,showDefaultValue:t,inline:n}){const r=_.jsxs("span",{...
  function l0 (line 297) | function l0(e){return e.children?_.jsxs("div",{className:"graphiql-doc-e...
  function r2 (line 297) | function r2({directive:e}){return _.jsxs("span",{className:"graphiql-doc...
  function zt (line 297) | function zt(e){const t=Dwe[e.title];return _.jsxs("div",{children:[_.jsx...
  function o2 (line 297) | function o2(e){return _.jsxs(_.Fragment,{children:[e.field.description?_...
  function i2 (line 297) | function i2({field:e}){const[t,n]=h.useState(!1),r=h.useCallback(()=>{n(...
  function s2 (line 297) | function s2({field:e}){var t;const n=((t=e.astNode)==null?void 0:t.direc...
  function a2 (line 297) | function a2(e){var t,n,r,o;const i=e.schema.getQueryType(),s=(n=(t=e.sch...
  function Fo (line 297) | function Fo(e,t){let n;return function(...r){n&&window.clearTimeout(n),n...
  function c0 (line 297) | function c0(){const{explorerNavStack:e,push:t}=no({nonNull:!0,caller:c0}...
  function mu (line 297) | function mu(e){const{explorerNavStack:t}=no({nonNull:!0,caller:e||mu}),{...
  function mc (line 297) | function mc(e,t){try{const n=t.replaceAll(/[^_0-9A-Za-z]/g,r=>"\\"+r);re...
  function vu (line 297) | function vu(e){return _.jsx("span",{className:"graphiql-doc-explorer-sea...
  function Qh (line 297) | function Qh({field:e,argument:t}){return _.jsxs(_.Fragment,{children:[_....
  function l2 (line 297) | function l2(e){const{push:t}=no({nonNull:!0});return _.jsx("a",{classNam...
  function c2 (line 297) | function c2(e){return Zm(e.type)?_.jsxs(_.Fragment,{children:[e.type.des...
  function u2 (line 297) | function u2({type:e}){return Ae(e)&&e.getInterfaces().length>0?_.jsx(zt,...
  function f2 (line 297) | function f2({type:e}){const[t,n]=h.useState(!1),r=h.useCallback(()=>{n(!...
  function Yh (line 297) | function Yh({field:e}){const t="args"in e?e.args.filter(n=>!n.deprecatio...
  function d2 (line 297) | function d2({type:e}){const[t,n]=h.useState(!1),r=h.useCallback(()=>{n(!...
  function Zh (line 297) | function Zh({value:e}){return _.jsxs("div",{className:"graphiql-doc-expl...
  function p2 (line 297) | function p2({type:e}){const{schema:t}=Wn({nonNull:!0});return!t||!jr(e)?...
  function gu (line 297) | function gu(){const{fetchError:e,isFetching:t,schema:n,validationErrors:...
  function m2 (line 297) | function m2(e){const t=to(),n=no(),r=bf(),o=!!n,i=!!r,s=h.useMemo(()=>{c...
  function v2 (line 297) | function v2(e,t,n,r,o,i){as([],{useCommonAddons:!1}).then(a=>{let l,c,u,...
  function ks (line 297) | function ks(e,t){h.useEffect(()=>{e&&typeof t=="string"&&t!==e.getValue(...
  function rl (line 297) | function rl(e,t,n){h.useEffect(()=>{e&&e.setOption(t,n)},[e,t,n])}
  function u0 (line 297) | function u0(e,t,n,r,o){const{updateActiveTabValues:i}=et({nonNull:!0,cal...
  function f0 (line 297) | function f0(e,t,n){const{schema:r}=Wn({nonNull:!0,caller:n}),o=no(),i=Sf...
  function bn (line 297) | function bn(e,t,n){h.useEffect(()=>{if(e){for(const r of t)e.removeKeyMa...
  function Cf (line 297) | function Cf({caller:e,onCopyQuery:t}={}){const{queryEditor:n}=et({nonNul...
  function Mo (line 297) | function Mo({caller:e}={}){const{queryEditor:t}=et({nonNull:!0,caller:e|...
  function ls (line 297) | function ls({caller:e}={}){const{queryEditor:t,headerEditor:n,variableEd...
  function yu (line 297) | function yu({getDefaultFieldNames:e,caller:t}={}){const{schema:n}=Wn({no...
  function Iwe (line 297) | function Iwe(){const{queryEditor:e}=et({nonNull:!0}),t=(e==null?void 0:e...
  function Rwe (line 297) | function Rwe(){const{variableEditor:e}=et({nonNull:!0}),t=(e==null?void ...
  function Ei (line 297) | function Ei({editorTheme:e=xf,keyMap:t=wf,onEdit:n,readOnly:r=!1}={},o){...
  function g2 (line 297) | function g2(e){return e.replace(Owe," ")}
  function _r (line 297) | function _r({editorTheme:e=xf,keyMap:t=wf,onClickReference:n,onCopyQuery...
  function y2 (line 297) | function y2(e,t,n){h.useEffect(()=>{if(!e)return;const r=e.options.lint....
  function E2 (line 297) | function E2(e,t,n){h.useEffect(()=>{if(!e)return;const r=e.options.lint....
  function b2 (line 297) | function b2(e,t,n){const r=h.useMemo(()=>[...t.values()],[t]);h.useEffec...
  function w2 (line 297) | function w2({defaultQuery:e,defaultHeaders:t,headers:n,defaultTabs:r,que...
  function _2 (line 297) | function _2(e){return e&&typeof e=="object"&&!Array.isArray(e)&&C2(e,"ac...
  function S2 (line 297) | function S2(e){return e&&typeof e=="object"&&!Array.isArray(e)&&Xh(e,"id...
  function C2 (line 297) | function C2(e,t){return t in e&&typeof e[t]=="number"}
  function Xh (line 297) | function Xh(e,t){return t in e&&typeof e[t]=="string"}
  function ni (line 297) | function ni(e,t){return t in e&&(typeof e[t]=="string"||e[t]===null)}
  function T2 (line 297) | function T2({queryEditor:e,variableEditor:t,headerEditor:n,responseEdito...
  function d0 (line 297) | function d0(e,t=!1){return JSON.stringify(e,(n,r)=>n==="hash"||n==="resp...
  function k2 (line 297) | function k2({storage:e,shouldPersistHeaders:t}){const n=h.useMemo(()=>Fo...
  function N2 (line 297) | function N2({queryEditor:e,variableEditor:t,headerEditor:n,responseEdito...
  function p0 (line 297) | function p0({query:e=null,variables:t=null,headers:n=null}={}){return{id...
  function h0 (line 297) | function h0(e,t){return{...e,tabs:e.tabs.map((n,r)=>{if(r!==e.activeTabI...
  function m0 (line 297) | function m0(){const e=F(()=>Math.floor((1+Math.random())*65536).toString...
  function Ra (line 297) | function Ra(e){return[e.query??"",e.variables??"",e.headers??""].join("|")}
  function Tf (line 297) | function Tf(e){const t=/^(?!#).*(query|subscription|mutation)\s+([a-zA-Z...
  function A2 (line 297) | function A2(e){const t=e==null?void 0:e.get(La);if(t){const n=JSON.parse...
  function fo (line 297) | function fo({editorTheme:e=xf,keyMap:t=wf,onClickReference:n,onEdit:r,re...
  function R2 (line 297) | function R2(e){const t=to(),[n,r]=h.useState(null),[o,i]=h.useState(null...
  function Eu (line 328) | function Eu({isHidden:e,...t}){const{headerEditor:n}=et({nonNull:!0,call...
  function bu (line 328) | function bu(e){var t;const[n,r]=h.useState({width:null,height:null}),[o,...
  function g0 (line 328) | function g0(e){if(e.type!=="string")return;const t=e.string.slice(1).sli...
  function L2 (line 328) | function L2(e){return/(bmp|gif|jpeg|jpg|png|svg)$/.test(e.pathname)}
  function y0 (line 328) | function y0(e){const t=_r(e,y0);return _.jsx("div",{className:"graphiql-...
  function xu (line 328) | function xu({responseTooltip:e,editorTheme:t=xf,keyMap:n=wf}={},r){const...
  function E0 (line 328) | function E0(e){const t=xu(e,E0);return _.jsx("section",{className:"resul...
  function wu (line 328) | function wu({isHidden:e,...t}){const{variableEditor:n}=et({nonNull:!0,ca...
  function O2 (line 328) | function O2({children:e,dangerouslyAssumeSchemaIsValid:t,defaultQuery:n,...
  function P2 (line 328) | function P2(){const e=to(),[t,n]=h.useState(()=>{if(!e)return null;const...
  function gc (line 328) | function gc({defaultSizeRelation:e=Mwe,direction:t,initiallyHidden:n,onH...
  function _u (line 328) | function _u(){const{queryEditor:e,setOperationName:t}=et({nonNull:!0,cal...
  function Ir (line 329) | function Ir(e){var t=e.dangerouslyAssumeSchemaIsValid,n=e.defaultQuery,r...
  function Uwe (line 329) | function Uwe(e){var t,n,r,o=(t=e.isHeadersEditorEnabled)!==null&&t!==voi...
  function zwe (line 329) | function zwe(e){var t=e.keyMap;return $.createElement("div",null,$.creat...
  function $2 (line 329) | function $2(e){return $.createElement("div",{className:"graphiql-logo"},...
  function F2 (line 329) | function F2(e){return $.createElement($.Fragment,null,e.children)}
  function M2 (line 329) | function M2(e){return $.createElement("div",{className:"graphiql-footer"...
  function Gd (line 329) | function Gd(e,t){var n;return!((n=e==null?void 0:e.type)===null||n===voi...
  function Gwe (line 329) | function Gwe(){{const e=new URL(window.location.href);return`${e.protoco...
  function Wwe (line 329) | function Wwe({onLogin:e}){const[t,n]=h.useState({username:"",password:""...
  function Ct (line 329) | function Ct(e){return e===null?"null":Array.isArray(e)?"array":typeof e}
  function uo (line 329) | function uo(e){return Ct(e)==="object"}
  function Qwe (line 329) | function Qwe(e){return Array.isArray(e)&&e.length>0&&e.every(t=>"message...
  function wb (line 329) | function wb(e,t){return e.length<124?e:t}
  function U2 (line 329) | function U2(e){if(!uo(e))throw new Error(`Message is expected to be an o...
  function Zwe (line 329) | function Zwe(e,t){return U2(typeof e=="string"?JSON.parse(e,t):e)}
  function Es (line 329) | function Es(e,t){return
Condensed preview — 349 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,496K chars).
[
  {
    "path": ".gitattributes",
    "chars": 25,
    "preview": "*.ai binary\n*.eps binary\n"
  },
  {
    "path": ".github/workflows/build-app.yml",
    "chars": 5521,
    "preview": "on:\n  - push\n\njobs:\n  petclinic-graphiql:\n    runs-on: ubuntu-latest\n    defaults:\n      run:\n        working-directory:"
  },
  {
    "path": ".gitignore",
    "chars": 226,
    "preview": "target/*\n.settings/*\n.classpath\n.project\n.idea\n*.iml\n/target\n*/target/\n\ngenerated/\n\n# Easier branch switching\nspringboot"
  },
  {
    "path": ".gitpod.Dockerfile",
    "chars": 479,
    "preview": "FROM gitpod/workspace-full\n\nUSER gitpod\n\nRUN bash -c \". /home/gitpod/.sdkman/bin/sdkman-init.sh && \\\n sdk install java 2"
  },
  {
    "path": ".gitpod.yml",
    "chars": 979,
    "preview": "image:\n  file: .gitpod.Dockerfile\ntasks:\n  - name: Build\n    init: |\n      ./mvnw package -Dmaven.test.skip=true -pl bac"
  },
  {
    "path": ".mvn/wrapper/MavenWrapperDownloader.java",
    "chars": 4941,
    "preview": "/*\n * Copyright 2007-present the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \""
  },
  {
    "path": ".mvn/wrapper/maven-wrapper.properties",
    "chars": 218,
    "preview": "distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip\nwrap"
  },
  {
    "path": ".run/Frontend.run.xml",
    "chars": 383,
    "preview": "<component name=\"ProjectRunConfigurationManager\">\n  <configuration default=\"false\" name=\"Frontend\" type=\"js.build_tools."
  },
  {
    "path": "LICENCE",
    "chars": 578,
    "preview": "Copyright 2002-2020 the original author or authors.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou"
  },
  {
    "path": "backend/.editorconfig",
    "chars": 192,
    "preview": "# top-most EditorConfig file\nroot = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style "
  },
  {
    "path": "backend/.gitignore",
    "chars": 7,
    "preview": "target/"
  },
  {
    "path": "backend/pom.xml",
    "chars": 4520,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "backend/sample-queries.graphql",
    "chars": 73,
    "preview": "query {\n    owners {\n       owners {\n           id\n       }\n    }\n}\n\n\n\n\n\n"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/FakeDataSqlCreator.java",
    "chars": 3981,
    "preview": "package org.springframework.samples.petclinic;\n\nimport org.springframework.samples.petclinic.model.*;\n\nimport java.io.Bu"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java",
    "chars": 921,
    "preview": "package org.springframework.samples.petclinic;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springfram"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/auth/Role.java",
    "chars": 1205,
    "preview": "package org.springframework.samples.petclinic.auth;\n\nimport org.springframework.security.core.GrantedAuthority;\n\nimport "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/auth/User.java",
    "chars": 2501,
    "preview": "package org.springframework.samples.petclinic.auth;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport org.slf4"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/auth/UserRepository.java",
    "chars": 285,
    "preview": "package org.springframework.samples.petclinic.auth;\n\nimport org.springframework.data.repository.Repository;\n\nimport java"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractOwnerInput.java",
    "chars": 1378,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\n/**\n * @author Nils Hartmann (nils@nilshartmann.net)\n */\npublic "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractOwnerPayload.java",
    "chars": 383,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Owner;\n\n/**\n "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractPetInput.java",
    "chars": 922,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport java.time.LocalDate;\n\n/**\n * @author Nils Hartmann (nils@"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AbstractPetPayload.java",
    "chars": 359,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Pet;\n\n/**\n * "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddOwnerInput.java",
    "chars": 277,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\n/**\n * @author Nils Hartmann (nils@nilshartmann.net)\n */\npublic "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddOwnerPayload.java",
    "chars": 305,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Owner;\n\n/**\n "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddPetInput.java",
    "chars": 503,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\n/**\n * @author Nils Hartmann (nils@nilshartmann.net)\n */\npublic "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddPetPayload.java",
    "chars": 211,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Pet;\n\n/**\n * "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddSpecialtyPayload.java",
    "chars": 236,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Specialty;\n\n/"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetErrorPayload.java",
    "chars": 132,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\npublic record AddVetErrorPayload(String error) implements AddVet"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetInput.java",
    "chars": 1157,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport java.util.List;\nimport java.util.Map;\n\n/**\n * @author Nil"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetPayload.java",
    "chars": 126,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\n/**\n * @author Nils Hartmann\n */\npublic interface AddVetPayload "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVetSuccessPayload.java",
    "chars": 219,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Vet;\n\n/**\n * "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVisitInput.java",
    "chars": 957,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport java.time.LocalDate;\nimport java.util.Map;\nimport java.ut"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AddVisitPayload.java",
    "chars": 219,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Visit;\n\n/**\n "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/AuthController.java",
    "chars": 1432,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/OwnerController.java",
    "chars": 3795,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport graphql.schema.DataFetchingEnvironment;\nimport org.slf4j."
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/PageInfo.java",
    "chars": 994,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.data.domain.Page;\nimport org.springfr"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/PetController.java",
    "chars": 2297,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.graphql.data.method.annotation.Argume"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/PetTypeController.java",
    "chars": 926,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport graphql.schema.idl.RuntimeWiring;\nimport org.springframew"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/RemoveSpecialtyPayload.java",
    "chars": 271,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Specialty;\n\ni"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/SpecialtyController.java",
    "chars": 2559,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport graphql.schema.DataFetchingEnvironment;\nimport org.slf4j."
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateOwnerInput.java",
    "chars": 342,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\n/**\n * @author Nils Hartmann (nils@nilshartmann.net)\n */\npublic "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateOwnerPayload.java",
    "chars": 310,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Owner;\n\n/**\n "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdatePetInput.java",
    "chars": 324,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\n/**\n * @author Nils Hartmann (nils@nilshartmann.net)\n */\npublic "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdatePetPayload.java",
    "chars": 214,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Pet;\n\n/**\n * "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateSpecialtyInput.java",
    "chars": 530,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport jakarta.validation.constraints.NotNull;\n\npublic class Upd"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/UpdateSpecialtyPayload.java",
    "chars": 239,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Specialty;\n\n/"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/VetController.java",
    "chars": 3010,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/VisitConnection.java",
    "chars": 491,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.samples.petclinic.model.Visit;\n\nimpor"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/VisitController.java",
    "chars": 1925,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.graphql.data.method.annotation.Argume"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/VisitPublisher.java",
    "chars": 1818,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/runtime/DateCoercing.java",
    "chars": 1731,
    "preview": "package org.springframework.samples.petclinic.graphql.runtime;\n\nimport graphql.language.StringValue;\nimport graphql.sche"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/runtime/GraphiQlConfiguration.java",
    "chars": 1723,
    "preview": "package org.springframework.samples.petclinic.graphql.runtime;\n\nimport org.springframework.beans.factory.annotation.Auto"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/graphql/runtime/PetClinicRuntimeWiringConfiguration.java",
    "chars": 1655,
    "preview": "package org.springframework.samples.petclinic.graphql.runtime;\n\nimport graphql.schema.GraphQLScalarType;\nimport graphql."
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java",
    "chars": 1344,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/InvalidVetDataException.java",
    "chars": 225,
    "preview": "package org.springframework.samples.petclinic.model;\n\npublic class InvalidVetDataException extends Exception {\n    publi"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java",
    "chars": 1253,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/OrderField.java",
    "chars": 211,
    "preview": "package org.springframework.samples.petclinic.model;\n\n\n/**\n * @author Xiangbin HAN (hanxb2001@163.com)\n *\n */\npublic enu"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/Owner.java",
    "chars": 3429,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/OwnerFilter.java",
    "chars": 2968,
    "preview": "package org.springframework.samples.petclinic.model;\n\nimport org.springframework.data.jpa.domain.Specification;\n\nimport "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/OwnerOrder.java",
    "chars": 714,
    "preview": "package org.springframework.samples.petclinic.model;\n\nimport org.springframework.data.domain.Sort;\n\nimport java.util.Lis"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/OwnerService.java",
    "chars": 1796,
    "preview": "package org.springframework.samples.petclinic.model;\n\nimport org.springframework.samples.petclinic.repository.OwnerRepos"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/Person.java",
    "chars": 1368,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/Pet.java",
    "chars": 2511,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/PetService.java",
    "chars": 2198,
    "preview": "package org.springframework.samples.petclinic.model;\n\nimport org.springframework.samples.petclinic.repository.OwnerRepos"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/PetType.java",
    "chars": 886,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/PetValidator.java",
    "chars": 1809,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/Specialty.java",
    "chars": 988,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/SpecialtyService.java",
    "chars": 1352,
    "preview": "package org.springframework.samples.petclinic.model;\n\nimport org.springframework.samples.petclinic.repository.SpecialtyR"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/Vet.java",
    "chars": 2013,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/VetService.java",
    "chars": 1679,
    "preview": "package org.springframework.samples.petclinic.model;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\nimport or"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/Vets.java",
    "chars": 1089,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/Visit.java",
    "chars": 2093,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/VisitCreatedEvent.java",
    "chars": 419,
    "preview": "package org.springframework.samples.petclinic.model;\n\npublic class VisitCreatedEvent {\n\n    private final Integer visitI"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/VisitService.java",
    "chars": 1643,
    "preview": "package org.springframework.samples.petclinic.model;\n\nimport org.springframework.context.ApplicationEventPublisher;\nimpo"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/model/package-info.java",
    "chars": 755,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/repository/OwnerRepository.java",
    "chars": 2329,
    "preview": "/*\n * Copyright 2002-2017 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/repository/PetRepository.java",
    "chars": 2560,
    "preview": "/*\n * Copyright 2002-2017 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/repository/PetTypeRepository.java",
    "chars": 1152,
    "preview": "/*\n * Copyright 2016-2017 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/repository/SpecialtyRepository.java",
    "chars": 1202,
    "preview": "/*\n * Copyright 2016-2017 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/repository/VetRepository.java",
    "chars": 1535,
    "preview": "/*\n * Copyright 2002-2017 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/repository/VisitRepository.java",
    "chars": 1689,
    "preview": "/*\n * Copyright 2002-2017 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/security/JwtTokenService.java",
    "chars": 1697,
    "preview": "package org.springframework.samples.petclinic.security;\n\nimport org.springframework.security.core.Authentication;\nimport"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/security/LoginController.java",
    "chars": 2243,
    "preview": "package org.springframework.samples.petclinic.security;\n\nimport jakarta.validation.Valid;\nimport org.slf4j.Logger;\nimpor"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/security/LoginRequest.java",
    "chars": 454,
    "preview": "package org.springframework.samples.petclinic.security;\n\npublic class LoginRequest {\n\n    private String username;\n    p"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/security/LoginResponse.java",
    "chars": 256,
    "preview": "package org.springframework.samples.petclinic.security;\n\npublic class LoginResponse {\n    private final String token;\n\n "
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/security/NeverExpiringTokenGenerator.java",
    "chars": 2499,
    "preview": "package org.springframework.samples.petclinic.security;\n\nimport jakarta.annotation.PostConstruct;\nimport org.slf4j.Logge"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/security/RSAKeyProvider.java",
    "chars": 3686,
    "preview": "package org.springframework.samples.petclinic.security;\n\nimport com.nimbusds.jose.jwk.RSAKey;\nimport jakarta.annotation."
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/security/SecurityConfig.java",
    "chars": 5284,
    "preview": "package org.springframework.samples.petclinic.security;\n\nimport com.nimbusds.jose.JOSEException;\nimport com.nimbusds.jos"
  },
  {
    "path": "backend/src/main/java/org/springframework/samples/petclinic/util/EntityUtils.java",
    "chars": 2157,
    "preview": "/*\n * Copyright 2002-2013 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/main/resources/application.properties",
    "chars": 2009,
    "preview": "# DataSource configuration omitted,\n# as Spring Boot 3.1+ uses configuration from\n# docker-compose/TestContainer automat"
  },
  {
    "path": "backend/src/main/resources/db/migration/V100_1__create_schema.sql",
    "chars": 2664,
    "preview": "DROP TABLE IF EXISTS visits CASCADE;\nDROP TABLE IF EXISTS specialties CASCADE;\nDROP TABLE IF EXISTS vet_specialties CASC"
  },
  {
    "path": "backend/src/main/resources/db/migration/V100_2__fill_db.sql",
    "chars": 25226,
    "preview": "INSERT INTO users (USERNAME, PASSWORD, ENABLED, FULLNAME) VALUES ('joe', '{noop}joe', true, 'Joe Hill');\nINSERT INTO use"
  },
  {
    "path": "backend/src/main/resources/graphql/petclinic.graphqls",
    "chars": 7407,
    "preview": "# This file was generated. Do not edit manually.\n\nschema {\n    query: Query\n    mutation: Mutation\n    subscription: Sub"
  },
  {
    "path": "backend/src/main/resources/keys/private_key.pem",
    "chars": 3272,
    "preview": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQCml29+AGtlMg4w\nMl4egtS3lmYpNn8ClK4gEdTPT5U"
  },
  {
    "path": "backend/src/main/resources/keys/public_key.pem",
    "chars": 800,
    "preview": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAppdvfgBrZTIOMDJeHoLU\nt5ZmKTZ/ApSuIBHUz0+VJBKikwsM"
  },
  {
    "path": "backend/src/main/resources/readme-graphiql.md",
    "chars": 583,
    "preview": "# Custom GraphiQL build\n\nInside `graphiql` is a custom graphiql build that is built from `petclinic-graphiql` and then c"
  },
  {
    "path": "backend/src/main/resources/testdata/owners.csv",
    "chars": 2809,
    "preview": "FirstName,LastName,Street,City,PhoneNumber\nJohn,Smith,123 Main Street,New York,+1 (555) 123-4567\nSophie,Dubois,456 Rue d"
  },
  {
    "path": "backend/src/main/resources/testdata/pets.csv",
    "chars": 975,
    "preview": "birthdate,name\n1992-06-20,Bella\n2002-10-29,Luna\n2017-08-13,Charlie\n2016-09-29,Lucy\n1984-02-27,Cooper\n1975-01-25,Max\n2007"
  },
  {
    "path": "backend/src/main/resources/testdata/visits.csv",
    "chars": 2951,
    "preview": "Date,Treatment\n2022-01-15,Vaccination Checkup\n2022-03-27,Teeth Cleaning\n2022-05-10,Orthopedic X-rays\n2022-07-18,Blood Te"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/Range-52ddcb6a.js",
    "chars": 530,
    "preview": "class h{constructor(t,r){this.containsPosition=e=>this.start.line===e.line?this.start.character<=e.character:this.end.li"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/SchemaReference.es-0ccab37b.js",
    "chars": 3040,
    "preview": "import{s as b}from\"./forEachState.es-b2033c2b.js\";import{l,X as k,F,W as h,Y as S,Z as g,_ as D,$ as T,c as Q}from\"./ind"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/brace-fold.es-f2e3735d.js",
    "chars": 2744,
    "preview": "import{c as I,h as L}from\"./codemirror.es2-5884f31a.js\";var S=Object.defineProperty,b=(k,T)=>S(k,\"name\",{value:T,configu"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/closebrackets.es-e969742b.js",
    "chars": 4279,
    "preview": "import{c as N,h as q}from\"./codemirror.es2-5884f31a.js\";var F=Object.defineProperty,f=(P,k)=>F(P,\"name\",{value:k,configu"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/codemirror.es-52e8b92d.js",
    "chars": 579,
    "preview": "import{c as f,h as s}from\"./codemirror.es2-5884f31a.js\";var u=Object.defineProperty,l=(e,n)=>u(e,\"name\",{value:n,configu"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/codemirror.es2-5884f31a.js",
    "chars": 183550,
    "preview": "var su=Object.defineProperty,u=(Et,Nl)=>su(Et,\"name\",{value:Nl,configurable:!0}),uu=typeof globalThis<\"u\"?globalThis:typ"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/comment.es-39699bae.js",
    "chars": 4634,
    "preview": "import{c as K,h as Q}from\"./codemirror.es2-5884f31a.js\";var X=Object.defineProperty,I=(S,A)=>X(S,\"name\",{value:A,configu"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/dialog.es-b2776d29.js",
    "chars": 2903,
    "preview": "import{c as b,h as O}from\"./codemirror.es2-5884f31a.js\";var T=Object.defineProperty,g=(p,m)=>T(p,\"name\",{value:m,configu"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/foldgutter.es-b6cee46a.js",
    "chars": 5920,
    "preview": "import{c as P,h as A}from\"./codemirror.es2-5884f31a.js\";var j=Object.defineProperty,d=(C,y)=>j(C,\"name\",{value:y,configu"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/forEachState.es-b2033c2b.js",
    "chars": 230,
    "preview": "var a=Object.defineProperty,l=(t,n)=>a(t,\"name\",{value:n,configurable:!0});function f(t,n){const r=[];let e=t;for(;e!=nu"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/hint.es-1418191b.js",
    "chars": 769,
    "preview": "import{C as n}from\"./codemirror.es-52e8b92d.js\";import\"./show-hint.es-b981493e.js\";import{g as c}from\"./index-27dc12ba.j"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/hint.es2-598d3bfe.js",
    "chars": 3165,
    "preview": "import{C as f}from\"./codemirror.es-52e8b92d.js\";import{s as L}from\"./forEachState.es-b2033c2b.js\";import\"./codemirror.es"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/index-27dc12ba.js",
    "chars": 739253,
    "preview": "function G2(e,t){for(var n=0;n<t.length;n++){const r=t[n];if(typeof r!=\"string\"&&!Array.isArray(r)){for(const o in r)if("
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/index-928ba5be.css",
    "chars": 410395,
    "preview": "/*!*********************************************************************************************!*\\\n  !*** css ../../../"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/info-addon.es-c9b2027b.js",
    "chars": 2609,
    "preview": "import{C as i}from\"./codemirror.es-52e8b92d.js\";import\"./codemirror.es2-5884f31a.js\";var y=Object.defineProperty,u=(o,t)"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/info.es-3175bfab.js",
    "chars": 3757,
    "preview": "import{C as g}from\"./codemirror.es-52e8b92d.js\";import{E as L,L as C,R as M,_ as V,G as x,O as l}from\"./SchemaReference."
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/javascript.es-3c6957c5.js",
    "chars": 20320,
    "preview": "import{c as gt,h as wt}from\"./codemirror.es2-5884f31a.js\";var ht=Object.defineProperty,i=(R,X)=>ht(R,\"name\",{value:X,con"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/jump-to-line.es-3afd5e0a.js",
    "chars": 1728,
    "preview": "import{c as d,h as g}from\"./codemirror.es2-5884f31a.js\";import{a as h}from\"./dialog.es-b2776d29.js\";var b=Object.defineP"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/jump.es-7b275cf1.js",
    "chars": 2916,
    "preview": "import{C as u}from\"./codemirror.es-52e8b92d.js\";import{E as g,L as M,R as k,_ as v,G as y,O}from\"./SchemaReference.es-0c"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/lint.es-fe7166bb.js",
    "chars": 5930,
    "preview": "import{c as U,h as V}from\"./codemirror.es2-5884f31a.js\";var W=Object.defineProperty,s=(d,h)=>W(d,\"name\",{value:h,configu"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/lint.es2-97c4a6f4.js",
    "chars": 32634,
    "preview": "import{C as q}from\"./codemirror.es-52e8b92d.js\";import{K as u,G as p,d as _,i as ue,a as S,n as fe,b as w,s as F,t as h,"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/lint.es3-bcaf3718.js",
    "chars": 4764,
    "preview": "import{C as H}from\"./codemirror.es-52e8b92d.js\";import\"./codemirror.es2-5884f31a.js\";import{V,W as J,X as P,Y as U,a4 as"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/matchbrackets.es-97d2e827.js",
    "chars": 617,
    "preview": "import{h as c}from\"./codemirror.es2-5884f31a.js\";import{j as p}from\"./matchbrackets.es2-f53f57e6.js\";var s=Object.define"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/matchbrackets.es2-f53f57e6.js",
    "chars": 3354,
    "preview": "import{c as N}from\"./codemirror.es2-5884f31a.js\";var j=Object.defineProperty,u=(M,b)=>j(M,\"name\",{value:b,configurable:!"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/mode-indent.es-057a4f6a.js",
    "chars": 326,
    "preview": "var o=Object.defineProperty,v=(e,n)=>o(e,\"name\",{value:n,configurable:!0});function d(e,n){var t,i;const{levels:l,indent"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/mode.es-8c5bcfbd.js",
    "chars": 608,
    "preview": "import{C as r}from\"./codemirror.es-52e8b92d.js\";import{U as o,a0 as s,a1 as i,a2 as n}from\"./index-27dc12ba.js\";import{r"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/mode.es2-8a6e8f8c.js",
    "chars": 1571,
    "preview": "import{C as s}from\"./codemirror.es-52e8b92d.js\";import{U as o,a5 as e,a6 as l,a7 as n,a8 as r}from\"./index-27dc12ba.js\";"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/mode.es3-fa110728.js",
    "chars": 1370,
    "preview": "import{C as n}from\"./codemirror.es-52e8b92d.js\";import{U as s,a5 as e,a6 as a,a8 as r}from\"./index-27dc12ba.js\";import{r"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/search.es-2e392dd0.js",
    "chars": 6773,
    "preview": "import{c as I,h as V}from\"./codemirror.es2-5884f31a.js\";import{K}from\"./searchcursor.es2-cbfe7cae.js\";import{a as L}from"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/searchcursor.es-b1a352a2.js",
    "chars": 616,
    "preview": "import{h as c}from\"./codemirror.es2-5884f31a.js\";import{K as p}from\"./searchcursor.es2-cbfe7cae.js\";var l=Object.defineP"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/searchcursor.es2-cbfe7cae.js",
    "chars": 5800,
    "preview": "import{c as B}from\"./codemirror.es2-5884f31a.js\";var A=Object.defineProperty,u=(R,S)=>A(R,\"name\",{value:S,configurable:!"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/show-hint.es-b981493e.js",
    "chars": 11543,
    "preview": "import{c as rt,h as lt}from\"./codemirror.es2-5884f31a.js\";var ht=Object.defineProperty,d=(A,H)=>ht(A,\"name\",{value:H,con"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/assets/sublime.es-e2a3eb60.js",
    "chars": 16115,
    "preview": "import{c as _,h as Y}from\"./codemirror.es2-5884f31a.js\";import{K as q}from\"./searchcursor.es2-cbfe7cae.js\";import{j as z"
  },
  {
    "path": "backend/src/main/resources/ui/graphiql/index.html",
    "chars": 496,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/PetClinicTestDbConfiguration.java",
    "chars": 732,
    "preview": "package org.springframework.samples.petclinic;\n\nimport org.springframework.boot.test.context.TestConfiguration;\nimport o"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/AbstractClinicGraphqlTests.java",
    "chars": 2062,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport com.github.dockerjava.api.model.ContainerConfig;\nimport o"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/AuthControllerTests.java",
    "chars": 855,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.junit.jupiter.api.Test;\n\nimport static org.assertj.co"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/GraphQlTokenProvider.java",
    "chars": 755,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.springframework.beans.factory.annotation.Autowired;\ni"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/OwnerControllerTests.java",
    "chars": 4837,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.gr"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/PetControllerTests.java",
    "chars": 4363,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.be"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/PetTypeControllerTests.java",
    "chars": 518,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.junit.jupiter.api.Test;\n\npublic class PetTypeControll"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/SpecialtyControllerTests.java",
    "chars": 3565,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.junit.jupiter.api.Assertions;\nimport org.junit.jupite"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/VetControllerTests.java",
    "chars": 5379,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.junit.jupiter.api.Test;\nimport org.springframework.gr"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/VisitControllerTests.java",
    "chars": 4066,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.junit.jupiter.api.Test;\nimport org.slf4j.Logger;\nimpo"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/graphql/VisitSubscriptionTest.java",
    "chars": 3460,
    "preview": "package org.springframework.samples.petclinic.graphql;\n\nimport org.junit.jupiter.api.Test;\nimport org.slf4j.Logger;\nimpo"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java",
    "chars": 2157,
    "preview": "/*\n * Copyright 2012-2019 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/repository/ApplicationTestConfig.java",
    "chars": 297,
    "preview": "package org.springframework.samples.petclinic.repository;\n\nimport org.mockito.MockitoAnnotations;\nimport org.springframe"
  },
  {
    "path": "backend/src/test/java/org/springframework/samples/petclinic/repository/ClinicRepositorySpringDataJpaTests.java",
    "chars": 18228,
    "preview": "/*\n * Copyright 2002-2017 the original author or authors.\n *\n * Licensed under the Apache License, Version 2.0 (the \"Lic"
  },
  {
    "path": "backend/src/test/resources/graphql-test/addPetMutation.graphql",
    "chars": 388,
    "preview": "mutation {\n    addPet(input: {\n        name: \"Susi\",\n        birthDate: \"2019/03/17\",\n        ownerId: 2,\n        typeId"
  },
  {
    "path": "backend/src/test/resources/graphql-test/addVetMutation.graphql",
    "chars": 465,
    "preview": "mutation($specialtyIds: [Int!]!) {\n    addVet(input: {\n        firstName: \"Klaus\", lastName: \"Smith\"\n        specialtyId"
  },
  {
    "path": "backend/src/test/resources/graphql-test/addVisitMutation.graphql",
    "chars": 257,
    "preview": "mutation {\n    addVisit(input:{\n        petId:1,\n        description:\"hurray\",\n        date:\"2020/12/31\",\n    }) {\n     "
  },
  {
    "path": "backend/src/test/resources/graphql-test/addVisitMutationWithVariables.graphql",
    "chars": 282,
    "preview": "mutation($addVisitInput: AddVisitInput!) {\n    addVisit(input:$addVisitInput) {\n        visit {\n            date\n       "
  },
  {
    "path": "backend/src/test/resources/graphql-test/meQuery.graphql",
    "chars": 59,
    "preview": "query {\n    me {\n        username\n        fullname\n    }\n}\n"
  },
  {
    "path": "backend/src/test/resources/graphql-test/updatePetMutation.graphql",
    "chars": 340,
    "preview": "mutation($updatePetInput: UpdatePetInput!) {\n    updatePet(input: $updatePetInput) {\n        pet {\n            birthDate"
  },
  {
    "path": "build-local.sh",
    "chars": 515,
    "preview": "#! /bin/bash\n\ncd petclinic-graphiql && rm -rf ./dist && pnpm build && pnpm copy-to-backend && cd ..\n\n./mvnw -DskipTests "
  },
  {
    "path": "docker-compose-petclinic.yml",
    "chars": 988,
    "preview": "version: \"3\"\nservices:\n  petclinic_graphql_db:\n    image: postgres:16.1-alpine\n    command: [\"postgres\", \"-c\", \"log_stat"
  },
  {
    "path": "docker-compose.yml",
    "chars": 438,
    "preview": "version: \"3\"\nservices:\n  petclinic_graphql_db:\n    image: postgres:16.1-alpine\n    command: [\"postgres\", \"-c\", \"log_stat"
  },
  {
    "path": "e2e-tests/.github/workflows/playwright.yml",
    "chars": 673,
    "preview": "name: Playwright Tests\non:\n  push:\n    branches: [ main, master ]\n  pull_request:\n    branches: [ main, master ]\njobs:\n "
  },
  {
    "path": "e2e-tests/.gitignore",
    "chars": 69,
    "preview": "node_modules/\n/test-results/\n/playwright-report/\n/playwright/.cache/\n"
  },
  {
    "path": "e2e-tests/.prettierrc",
    "chars": 24,
    "preview": "{\n  \"printWidth\": 130\n}\n"
  },
  {
    "path": "e2e-tests/package.json",
    "chars": 560,
    "preview": "{\n  \"name\": \"e2e-tests\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"pl"
  },
  {
    "path": "e2e-tests/playwright.config.ts",
    "chars": 2213,
    "preview": "import { defineConfig, devices } from \"@playwright/test\";\n\n/**\n * Read environment variables from file.\n * https://githu"
  },
  {
    "path": "e2e-tests/pom.xml",
    "chars": 561,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "e2e-tests/tests/graphiql.spec.ts",
    "chars": 1560,
    "preview": "import os from \"os\";\nimport { test, expect } from \"@playwright/test\";\n\nconst graphiqlUrl = process.env.PW_GRAPHIQL_URL |"
  },
  {
    "path": "e2e-tests/tests/owner-detail.spec.ts",
    "chars": 2629,
    "preview": "import { expect } from \"@playwright/test\";\nimport { petclinicTest } from \"./petclinic.fixtures\";\nimport { v4 as uuidv4 }"
  },
  {
    "path": "e2e-tests/tests/owner-search-page.spec.ts",
    "chars": 3335,
    "preview": "import { Locator, Page, expect } from \"@playwright/test\";\nimport { TableModel, petclinicTest } from \"./petclinic.fixture"
  },
  {
    "path": "e2e-tests/tests/petclinic.fixtures.ts",
    "chars": 1698,
    "preview": "import { test as base } from \"@playwright/test\";\n\nimport { expect, type Locator, type Page } from \"@playwright/test\";\n\nc"
  },
  {
    "path": "e2e-tests/tests/vets.spec.ts",
    "chars": 2606,
    "preview": "import { expect } from \"@playwright/test\";\nimport { petclinicTest } from \"./petclinic.fixtures\";\n\npetclinicTest(\"vet lis"
  },
  {
    "path": "frontend/.eslintrc.cjs",
    "chars": 604,
    "preview": "module.exports = {\n  root: true,\n  env: { browser: true, es2020: true },\n  extends: [\n    \"eslint:recommended\",\n    \"plu"
  },
  {
    "path": "frontend/.gitignore",
    "chars": 253,
    "preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
  },
  {
    "path": "frontend/.prettierignore",
    "chars": 57,
    "preview": ".eslintrc.jcs\npnpm-lock.yaml\n./src/assets/*\nsrc/fonts/**\n"
  },
  {
    "path": "frontend/Dockerfile",
    "chars": 163,
    "preview": "FROM nginx:stable-alpine\nWORKDIR frontend\nCOPY dist /frontend\nCOPY docker/nginx.conf /etc/nginx/conf.d/default.conf\n\nEXP"
  },
  {
    "path": "frontend/README.md",
    "chars": 1263,
    "preview": "# React + TypeScript + Vite\n\nThis template provides a minimal setup to get React working in Vite with HMR and some ESLin"
  },
  {
    "path": "frontend/codegen.ts",
    "chars": 625,
    "preview": "import type { CodegenConfig } from \"@graphql-codegen/cli\";\n\nconst config: CodegenConfig = {\n  overwrite: true,\n  schema:"
  },
  {
    "path": "frontend/docker/nginx.conf",
    "chars": 1717,
    "preview": "server {\n    listen 3090;\n    server_name localhost;\n\n    root /frontend;\n\n    access_log /var/log/nginx/access.log;\n   "
  },
  {
    "path": "frontend/index.html",
    "chars": 385,
    "preview": "<!doctype html>\n<html lang=\"en\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" type=\"image/svg+xml\" href=\"/"
  },
  {
    "path": "frontend/package.json",
    "chars": 1670,
    "preview": "{\n  \"name\": \"frontend-vite\",\n  \"private\": true,\n  \"version\": \"0.0.0\",\n  \"type\": \"module\",\n  \"scripts\": {\n    \"dev\": \"vit"
  },
  {
    "path": "frontend/pom.xml",
    "chars": 569,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
  },
  {
    "path": "frontend/postcss.config.js",
    "chars": 81,
    "preview": "export default {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n};\n"
  },
  {
    "path": "frontend/prettier.config.cjs",
    "chars": 163,
    "preview": "/** @type {import(\"prettier\").Options} */\nconst config = {\n  plugins: [\"prettier-plugin-tailwindcss\"],\n  tailwindFunctio"
  },
  {
    "path": "frontend/src/App.css",
    "chars": 606,
    "preview": "#root {\n  max-width: 1280px;\n  margin: 0 auto;\n  padding: 2rem;\n  text-align: center;\n}\n\n.logo {\n  height: 6em;\n  paddin"
  },
  {
    "path": "frontend/src/App.tsx",
    "chars": 1427,
    "preview": "import { useAuthToken } from \"@/login/AuthTokenProvider.tsx\";\nimport { useMeLazyQuery } from \"@/generated/graphql-types."
  },
  {
    "path": "frontend/src/NotFoundPage.tsx",
    "chars": 277,
    "preview": "import Heading from \"./components/Heading\";\nimport PageLayout from \"./components/PageLayout\";\n\nexport default function N"
  },
  {
    "path": "frontend/src/WelcomePage.tsx",
    "chars": 335,
    "preview": "import Heading from \"./components/Heading\";\nimport PageLayout from \"./components/PageLayout\";\nimport petsImage from \"@/a"
  },
  {
    "path": "frontend/src/assets/readme.md",
    "chars": 111,
    "preview": "Source of Spring Logo SVG:\n\nhttps://upload.wikimedia.org/wikipedia/commons/4/44/Spring_Framework_Logo_2018.svg\n"
  },
  {
    "path": "frontend/src/components/Button.tsx",
    "chars": 1598,
    "preview": "import * as React from \"react\";\nimport clsx from \"clsx\";\n\ntype ButtonProps = {\n  children: React.ReactNode;\n  disabled?:"
  },
  {
    "path": "frontend/src/components/ButtonBar.tsx",
    "chars": 441,
    "preview": "import * as React from \"react\";\n\ntype ButtonBarProps = {\n  align?: \"left\" | \"right\" | \"center\";\n  children: React.ReactN"
  },
  {
    "path": "frontend/src/components/Card.tsx",
    "chars": 389,
    "preview": "import * as React from \"react\";\n\ntype CardProps = {\n  children: React.ReactNode;\n  fullWidth?: boolean;\n};\nexport defaul"
  },
  {
    "path": "frontend/src/components/Heading.tsx",
    "chars": 686,
    "preview": "import * as React from \"react\";\n\ntype HeadingProps = {\n  children: React.ReactNode;\n  level?: \"2\" | \"3\" | \"4\";\n  id?: st"
  },
  {
    "path": "frontend/src/components/Input.tsx",
    "chars": 1090,
    "preview": "import * as React from \"react\";\n\ntype InputProps = {\n  action?: React.ReactNode;\n  disabled?: boolean;\n  error?: string "
  },
  {
    "path": "frontend/src/components/Label.tsx",
    "chars": 300,
    "preview": "import * as React from \"react\";\n\ntype LabelProps = {\n  children: React.ReactNode;\n  type?: \"error\" | \"info\";\n};\nexport d"
  },
  {
    "path": "frontend/src/components/Link.tsx",
    "chars": 343,
    "preview": "import * as React from \"react\";\nimport { Link as RouterLink } from \"react-router-dom\";\n\ntype LinkProps = {\n  to: string;"
  },
  {
    "path": "frontend/src/components/Nav.tsx",
    "chars": 6301,
    "preview": "import * as React from \"react\";\nimport { NavLink as RouterNavLink } from \"react-router-dom\";\nimport SpringLogo from \"@/a"
  },
  {
    "path": "frontend/src/components/PageHeader.tsx",
    "chars": 421,
    "preview": "import * as React from \"react\";\n\ntype PageHeaderProps = {\n  children: React.ReactNode;\n};\n\nexport default function PageH"
  },
  {
    "path": "frontend/src/components/PageLayout.tsx",
    "chars": 932,
    "preview": "import * as React from \"react\";\nimport PageHeader from \"./PageHeader\";\nimport { DefaultNavBar, NavBar } from \"./Nav\";\n\nt"
  },
  {
    "path": "frontend/src/components/Section.tsx",
    "chars": 731,
    "preview": "import * as React from \"react\";\nimport clsx from \"clsx\";\n\ntype SectionProps = {\n  invert?: boolean;\n  narrow?: boolean;\n"
  },
  {
    "path": "frontend/src/components/Select.tsx",
    "chars": 1295,
    "preview": "import * as React from \"react\";\n\ntype SelectOption = {\n  value: string | number;\n  label: string;\n};\n\ntype SelectProps ="
  },
  {
    "path": "frontend/src/components/Table.tsx",
    "chars": 1229,
    "preview": "import * as React from \"react\";\nimport Heading from \"./Heading\";\nimport { useId } from \"react\";\n\ntype TableProps = {\n  t"
  },
  {
    "path": "frontend/src/create-graphql-client.ts",
    "chars": 2786,
    "preview": "import {\n  ApolloClient,\n  createHttpLink,\n  InMemoryCache,\n  split,\n} from \"@apollo/client\";\nimport { graphqlApiUrl, gr"
  },
  {
    "path": "frontend/src/fonts/README.txt",
    "chars": 81,
    "preview": "TAKEN FROM https://github.com/spring-io/sagan/tree/master/sagan-client/src/fonts\n"
  },
  {
    "path": "frontend/src/fonts/generator_config.txt",
    "chars": 608,
    "preview": "# Font Squirrel Font-face Generator Configuration File\n# Upload this file to the generator to recreate the settings\n# yo"
  }
]

// ... and 149 more files (download for full content)

About this extraction

This page contains the full source code of the spring-petclinic/spring-petclinic-graphql GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 349 files (3.1 MB), approximately 842.9k tokens, and a symbol index with 2916 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!