From 8722f4bb936a32c8bd1c760116c64047fa764715 Mon Sep 17 00:00:00 2001 From: Jash2606 Date: Tue, 30 Jul 2024 20:30:04 +0530 Subject: [PATCH 1/3] Remove duplicate trailingComma setting from .prettierrc.js #1836 Fixed issue with .prettierrc.js containing trailingComma twice by removing 'none' value. --- web/.prettierrc.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/web/.prettierrc.js b/web/.prettierrc.js index 4d786d3d5cb..1c02ea995c7 100644 --- a/web/.prettierrc.js +++ b/web/.prettierrc.js @@ -33,6 +33,5 @@ module.exports = { htmlWhitespaceSensitivity: 'css', insertPragma: false, bracketSameLine: false, - proseWrap: 'preserve', - trailingComma: 'none' + proseWrap: 'preserve' } From 56c05fca52d1eb48a09af0f2b1e7bce08bc8980f Mon Sep 17 00:00:00 2001 From: Jash2606 Date: Tue, 30 Jul 2024 20:52:46 +0530 Subject: [PATCH 2/3] Fix syntax issue in tables.yaml and format with Prettier --- docs/open-api/tables.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/open-api/tables.yaml b/docs/open-api/tables.yaml index 1de4fc2d785..f5729f535c2 100644 --- a/docs/open-api/tables.yaml +++ b/docs/open-api/tables.yaml @@ -882,7 +882,7 @@ components: "properties": { "format": "ORC" }, - indexes:[ ] + indexes: [ ] } MysqlTableCreate: From d3d2f723c3360e4878d7d084a4a992145bfcdb69 Mon Sep 17 00:00:00 2001 From: Jash2606 Date: Tue, 30 Jul 2024 22:21:21 +0530 Subject: [PATCH 3/3] Fixing Indentation error . --- .github/ISSUE_TEMPLATE/bug-report.yml | 3 +- .github/ISSUE_TEMPLATE/epic.yml | 3 +- .github/ISSUE_TEMPLATE/feature-request.yml | 3 +- .github/ISSUE_TEMPLATE/improvement.yml | 3 +- .github/ISSUE_TEMPLATE/subtask.yml | 3 +- .../workflows/backend-integration-test.yml | 16 +- .github/workflows/build.yml | 14 +- .github/workflows/cron-integration-test.yml | 11 +- .github/workflows/docker-image.yml | 32 +- .github/workflows/flink-integration-test.yml | 12 +- .../workflows/frontend-integration-test.yml | 12 +- .github/workflows/python-integration-test.yml | 12 +- .github/workflows/spark-integration-test.yml | 16 +- CODE_OF_CONDUCT.md | 22 +- CONTRIBUTING.md | 39 +- GOVERNANCE.md | 2 +- MAINTAINERS.md | 54 +- README.md | 8 +- .../catalog/hive/ImmutableConfElement.java | 225 ++ .../gravitino/catalog/hive/ImmutableKey.java | 215 ++ dev/docker/tools/README.md | 2 + docs/apache-hive-catalog.md | 43 +- docs/docker-image-details.md | 57 +- docs/expression.md | 8 +- docs/flink-connector/flink-catalog-hive.md | 11 +- docs/flink-connector/flink-connector.md | 19 +- docs/getting-started.md | 120 +- docs/glossary.md | 14 +- docs/gravitino-server-config.md | 88 +- docs/hadoop-catalog.md | 4 +- docs/how-to-build.md | 136 +- docs/how-to-install.md | 10 +- docs/how-to-sign-releases.md | 236 +- docs/how-to-test.md | 78 +- docs/how-to-upgrade.md | 20 +- docs/how-to-use-gvfs.md | 206 +- docs/how-to-use-python-client.md | 53 +- docs/how-to-use-relational-backend-storage.md | 6 +- docs/how-to-use-the-playground.md | 6 +- docs/iceberg-rest-service.md | 20 +- docs/index.md | 70 +- docs/jdbc-doris-catalog.md | 60 +- docs/jdbc-mysql-catalog.md | 29 +- docs/jdbc-postgresql-catalog.md | 28 +- docs/kafka-catalog.md | 6 +- docs/lakehouse-iceberg-catalog.md | 47 +- docs/lakehouse-paimon-catalog.md | 79 +- ...manage-fileset-metadata-using-gravitino.md | 55 +- ...nage-messaging-metadata-using-gravitino.md | 16 +- docs/manage-metalake-using-gravitino.md | 20 +- ...age-relational-metadata-using-gravitino.md | 120 +- .../manage-table-partition-using-gravitino.md | 33 +- docs/open-api/catalogs.yaml | 264 +- docs/open-api/datatype.yaml | 77 +- docs/open-api/expression.yaml | 3 +- docs/open-api/filesets.yaml | 110 +- docs/open-api/indexes.yaml | 1 - docs/open-api/metalakes.yaml | 150 +- docs/open-api/openapi.yaml | 34 +- docs/open-api/partitioning.yaml | 3 +- docs/open-api/partitions.yaml | 222 +- docs/open-api/schemas.yaml | 127 +- docs/open-api/tables.yaml | 998 +++--- docs/open-api/topics.yaml | 93 +- docs/overview.md | 26 +- docs/publish-docker-images.md | 13 +- docs/security.md | 65 +- docs/spark-connector/spark-catalog-hive.md | 13 +- docs/spark-connector/spark-catalog-iceberg.md | 10 +- docs/spark-connector/spark-connector.md | 24 +- ...rtitioning-bucketing-sort-order-indexes.md | 28 +- docs/trino-connector/catalog-hive.md | 28 +- docs/trino-connector/catalog-iceberg.md | 32 +- docs/trino-connector/catalog-mysql.md | 14 +- docs/trino-connector/catalog-postgresql.md | 13 +- docs/trino-connector/configuration.md | 14 +- docs/trino-connector/development.md | 25 +- docs/trino-connector/installation.md | 5 +- docs/trino-connector/sql-support.md | 2 +- docs/trino-connector/supported-catalog.md | 10 +- docs/trino-connector/trino-connector.md | 10 +- docs/webui.md | 10 +- integration-test/trino-it/docker-compose.yaml | 11 +- rfc/rfc-1/rfc-1.md | 61 +- rfc/rfc-2/Entity-key-encoding-for-kv-store.md | 36 +- rfc/rfc-3/Transaction-implementation-on-kv.md | 43 +- web/.eslintrc.js | 14 +- web/.prettierrc.js | 2 +- web/next.config.js | 16 +- web/pnpm-lock.yaml | 2797 ++++++++++------- web/postcss.config.js | 4 +- web/src/app/layout.js | 4 +- web/src/app/login/page.js | 8 +- web/src/app/metalakes/CreateMetalakeDialog.js | 16 +- web/src/app/metalakes/TableBody.js | 22 +- .../metalakes/metalake/MetalakePageLeftBar.js | 2 +- .../app/metalakes/metalake/MetalakeTree.js | 10 +- .../app/metalakes/metalake/MetalakeView.js | 6 +- .../rightContent/CreateCatalogDialog.js | 28 +- .../metalake/rightContent/MetalakePath.js | 16 +- .../metalake/rightContent/RightContent.js | 2 +- .../rightContent/tabsContent/TabsContent.js | 16 +- .../tabsContent/detailsView/DetailsView.js | 10 +- .../tabsContent/tableView/TableView.js | 52 +- web/src/app/metalakes/page.js | 2 +- web/src/app/rootLayout/AppBar.js | 6 +- web/src/app/rootLayout/Layout.js | 2 +- web/src/app/rootLayout/ScrollToTop.js | 2 +- web/src/components/DetailsDrawer.js | 16 +- web/src/components/StyledToast.js | 4 +- web/src/configs/themeConfig.js | 2 +- web/src/lib/api/auth/index.js | 4 +- web/src/lib/api/catalogs/index.js | 12 +- web/src/lib/api/filesets/index.js | 6 +- web/src/lib/api/metalakes/index.js | 14 +- web/src/lib/api/schemas/index.js | 6 +- web/src/lib/api/tables/index.js | 6 +- web/src/lib/api/topics/index.js | 6 +- web/src/lib/api/version/index.js | 4 +- web/src/lib/enums/columnTypeEnum.js | 2 +- web/src/lib/enums/httpEnum.js | 6 +- web/src/lib/icons/iconify-icons.js | 6 +- web/src/lib/provider/emotion.js | 6 +- web/src/lib/provider/session.js | 4 +- web/src/lib/settings/index.js | 2 +- web/src/lib/store/auth/index.js | 8 +- web/src/lib/store/index.js | 6 +- web/src/lib/store/metalakes/index.js | 94 +- web/src/lib/store/sys/index.js | 6 +- web/src/lib/theme/colors.js | 16 +- web/src/lib/theme/mui.js | 440 +-- web/src/lib/theme/screens.js | 2 +- web/src/lib/theme/tailwind.js | 2 +- web/src/lib/utils/axios/Axios.js | 8 +- web/src/lib/utils/axios/index.js | 10 +- web/src/lib/utils/index.js | 4 +- web/src/lib/utils/initial.js | 78 +- web/tailwind.config.js | 8 +- 138 files changed, 4920 insertions(+), 3885 deletions(-) create mode 100644 catalogs/catalog-hive/bin/generated-sources/annotations/org/apache/gravitino/catalog/hive/ImmutableConfElement.java create mode 100644 catalogs/catalog-hive/bin/generated-sources/annotations/org/apache/gravitino/catalog/hive/ImmutableKey.java diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index ce6480b059e..e519130fca6 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -1,9 +1,8 @@ name: Bug Report title: "[Bug report] " description: A bug report issue -labels: [ "bug" ] +labels: ["bug"] body: - - type: dropdown id: version attributes: diff --git a/.github/ISSUE_TEMPLATE/epic.yml b/.github/ISSUE_TEMPLATE/epic.yml index e4f992693cb..61ca11e297a 100644 --- a/.github/ISSUE_TEMPLATE/epic.yml +++ b/.github/ISSUE_TEMPLATE/epic.yml @@ -1,9 +1,8 @@ name: Epic title: "[EPIC] " description: An epic issue with multiple sub-tasks -labels: [ "epic" ] +labels: ["epic"] body: - - type: textarea attributes: label: Describe the proposal diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml index 4f96b8c23f5..995e29a610e 100644 --- a/.github/ISSUE_TEMPLATE/feature-request.yml +++ b/.github/ISSUE_TEMPLATE/feature-request.yml @@ -1,9 +1,8 @@ name: Feature Request title: "[FEATURE] " description: Suggest an idea for Gravitino -labels: [ "feature" ] +labels: ["feature"] body: - - type: textarea attributes: label: Describe the feature diff --git a/.github/ISSUE_TEMPLATE/improvement.yml b/.github/ISSUE_TEMPLATE/improvement.yml index 807659603c2..29a6aed6ac4 100644 --- a/.github/ISSUE_TEMPLATE/improvement.yml +++ b/.github/ISSUE_TEMPLATE/improvement.yml @@ -3,9 +3,8 @@ name: Improvement title: "[Improvement] " description: Suggest an improvement on performance, code quality, user experience, etc -labels: [ "improvement" ] +labels: ["improvement"] body: - - type: textarea attributes: label: What would you like to be improved? diff --git a/.github/ISSUE_TEMPLATE/subtask.yml b/.github/ISSUE_TEMPLATE/subtask.yml index 55c34ef1edf..f7c9d6760ae 100644 --- a/.github/ISSUE_TEMPLATE/subtask.yml +++ b/.github/ISSUE_TEMPLATE/subtask.yml @@ -1,9 +1,8 @@ name: Subtask title: "[Subtask] " description: A subtask issue -labels: [ "subtask" ] +labels: ["subtask"] body: - - type: textarea attributes: label: Describe the subtask diff --git a/.github/workflows/backend-integration-test.yml b/.github/workflows/backend-integration-test.yml index 2464a06e1b1..1ebf292cdfd 100644 --- a/.github/workflows/backend-integration-test.yml +++ b/.github/workflows/backend-integration-test.yml @@ -4,9 +4,9 @@ name: Backend Integration Test on: # Triggers the workflow on push or pull request events but only for the "main" branch push: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] pull_request: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -60,9 +60,9 @@ jobs: strategy: matrix: architecture: [linux/amd64] - java-version: [ 8, 11, 17 ] - test-mode: [ embedded, deploy ] - backend: [ mysql, h2] + java-version: [8, 11, 17] + test-mode: [embedded, deploy] + backend: [mysql, h2] env: PLATFORM: ${{ matrix.architecture }} steps: @@ -71,8 +71,8 @@ jobs: - uses: actions/setup-java@v4 with: java-version: ${{ matrix.java-version }} - distribution: 'temurin' - cache: 'gradle' + distribution: "temurin" + cache: "gradle" - name: Set up QEMU uses: docker/setup-qemu-action@v2 @@ -82,7 +82,7 @@ jobs: dev/ci/check_commands.sh - name: Package Gravitino - if : ${{ matrix.test-mode == 'deploy' }} + if: ${{ matrix.test-mode == 'deploy' }} run: | ./gradlew compileDistribution -x test -PjdkVersion=${{ matrix.java-version }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cbb9eaffb68..93f6ebdc95f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,9 +4,9 @@ name: build on: # Triggers the workflow on push or pull request events but only for the "main" branch push: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] pull_request: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -62,8 +62,8 @@ jobs: - uses: actions/setup-java@v4 with: java-version: 8 - distribution: 'temurin' - cache: 'gradle' + distribution: "temurin" + cache: "gradle" - name: Build with Gradle run: ./gradlew build -x test -PjdkVersion=8 @@ -73,7 +73,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - java-version: [ 8, 11, 17 ] + java-version: [8, 11, 17] timeout-minutes: 30 needs: changes if: needs.changes.outputs.source_changes == 'true' @@ -85,8 +85,8 @@ jobs: - uses: actions/setup-java@v4 with: java-version: ${{ matrix.java-version }} - distribution: 'temurin' - cache: 'gradle' + distribution: "temurin" + cache: "gradle" - name: Test publish to local run: ./gradlew publishToMavenLocal -x test -PjdkVersion=${{ matrix.java-version }} diff --git a/.github/workflows/cron-integration-test.yml b/.github/workflows/cron-integration-test.yml index 8ae27638473..f0de0c3424a 100644 --- a/.github/workflows/cron-integration-test.yml +++ b/.github/workflows/cron-integration-test.yml @@ -3,7 +3,7 @@ name: Cron Integration Test # Controls when the workflow will run on: schedule: # Runs by default on main branch - - cron: '0 19 * * *' # Runs every day at 19:00 PM UTC, equal to 03:00 AM the next day in GMT+8 time zone + - cron: "0 19 * * *" # Runs every day at 19:00 PM UTC, equal to 03:00 AM the next day in GMT+8 time zone concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -55,8 +55,8 @@ jobs: strategy: matrix: architecture: [linux/amd64] - java-version: [ 8, 11, 17 ] - test-mode: [ embedded, deploy ] + java-version: [8, 11, 17] + test-mode: [embedded, deploy] env: DOCKER_RUN_NAME: hive-amd64 PLATFORM: ${{ matrix.architecture }} @@ -66,9 +66,8 @@ jobs: - uses: actions/setup-java@v4 with: java-version: ${{ matrix.java-version }} - distribution: 'temurin' - cache: 'gradle' - + distribution: "temurin" + cache: "gradle" - name: Set up QEMU uses: docker/setup-qemu-action@v2 diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index 1993a209a4b..551172999ab 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -5,25 +5,25 @@ on: inputs: image: type: choice - description: 'Choose the image to build' + description: "Choose the image to build" required: true - default: 'gravitino' + default: "gravitino" options: - - 'gravitino' - - 'gravitino-ci-hive' - - 'gravitino-ci-kerberos-hive' - - 'gravitino-ci-trino' - - 'gravitino-ci-doris' - - 'gravitino-ci-ranger' - - 'trino' - - 'hive' - - 'ranger' + - "gravitino" + - "gravitino-ci-hive" + - "gravitino-ci-kerberos-hive" + - "gravitino-ci-trino" + - "gravitino-ci-doris" + - "gravitino-ci-ranger" + - "trino" + - "hive" + - "ranger" tag: - description: 'Docker tag to apply to this image' + description: "Docker tag to apply to this image" required: true type: string token: - description: 'Publish Docker token' + description: "Publish Docker token" required: true type: string @@ -89,11 +89,11 @@ jobs: - uses: actions/setup-java@v3 with: - java-version: '8' - distribution: 'temurin' + java-version: "8" + distribution: "temurin" - name: Build and Push the Docker image - run: | + run: | sudo rm -rf /usr/local/lib/android sudo rm -rf /opt/hostedtoolcache/CodeQL ./dev/docker/build-docker.sh --platform all --type ${image_type} --image ${image_name} --tag ${{ github.event.inputs.tag }} --latest diff --git a/.github/workflows/flink-integration-test.yml b/.github/workflows/flink-integration-test.yml index c59c0fd23f7..38079ede292 100644 --- a/.github/workflows/flink-integration-test.yml +++ b/.github/workflows/flink-integration-test.yml @@ -4,9 +4,9 @@ name: Flink Integration Test on: # Triggers the workflow on push or pull request events but only for the "main" branch push: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] pull_request: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -56,7 +56,7 @@ jobs: strategy: matrix: architecture: [linux/amd64] - java-version: [ 8, 11, 17 ] + java-version: [8, 11, 17] env: PLATFORM: ${{ matrix.architecture }} steps: @@ -65,8 +65,8 @@ jobs: - uses: actions/setup-java@v4 with: java-version: ${{ matrix.java-version }} - distribution: 'temurin' - cache: 'gradle' + distribution: "temurin" + cache: "gradle" - name: Set up QEMU uses: docker/setup-qemu-action@v2 @@ -101,4 +101,4 @@ jobs: distribution/package/logs/gravitino-server.out distribution/package/logs/gravitino-server.log catalogs/**/*.log - catalogs/**/*.tar \ No newline at end of file + catalogs/**/*.tar diff --git a/.github/workflows/frontend-integration-test.yml b/.github/workflows/frontend-integration-test.yml index 2d730f392ff..f262d453470 100644 --- a/.github/workflows/frontend-integration-test.yml +++ b/.github/workflows/frontend-integration-test.yml @@ -4,9 +4,9 @@ name: Frontend Integration Test on: # Triggers the workflow on push or pull request events but only for the "main" branch push: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] pull_request: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -59,7 +59,7 @@ jobs: strategy: matrix: architecture: [linux/amd64] - java-version: [ 8 ] + java-version: [8] env: PLATFORM: ${{ matrix.architecture }} steps: @@ -68,8 +68,8 @@ jobs: - uses: actions/setup-java@v4 with: java-version: ${{ matrix.java-version }} - distribution: 'temurin' - cache: 'gradle' + distribution: "temurin" + cache: "gradle" - name: Set up QEMU uses: docker/setup-qemu-action@v2 @@ -104,4 +104,4 @@ jobs: distribution/package/logs/gravitino-server.out distribution/package/logs/gravitino-server.log catalogs/**/*.log - catalogs/**/*.tar \ No newline at end of file + catalogs/**/*.tar diff --git a/.github/workflows/python-integration-test.yml b/.github/workflows/python-integration-test.yml index a7ffacfd72a..4d00fb090f9 100644 --- a/.github/workflows/python-integration-test.yml +++ b/.github/workflows/python-integration-test.yml @@ -4,9 +4,9 @@ name: Python Client Integration Test on: # Triggers the workflow on push or pull request events but only for the "main" branch push: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] pull_request: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -43,7 +43,7 @@ jobs: strategy: matrix: architecture: [linux/amd64] - java-version: [ 8 ] + java-version: [8] env: PLATFORM: ${{ matrix.architecture }} steps: @@ -52,8 +52,8 @@ jobs: - uses: actions/setup-java@v4 with: java-version: ${{ matrix.java-version }} - distribution: 'temurin' - cache: 'gradle' + distribution: "temurin" + cache: "gradle" - name: Set up QEMU uses: docker/setup-qemu-action@v2 @@ -82,4 +82,4 @@ jobs: distribution/package/logs/gravitino-server.out distribution/package/logs/gravitino-server.log catalogs/**/*.log - catalogs/**/*.tar \ No newline at end of file + catalogs/**/*.tar diff --git a/.github/workflows/spark-integration-test.yml b/.github/workflows/spark-integration-test.yml index a2f11061cda..8e09a4f5c70 100644 --- a/.github/workflows/spark-integration-test.yml +++ b/.github/workflows/spark-integration-test.yml @@ -4,9 +4,9 @@ name: Spark Integration Test on: # Triggers the workflow on push or pull request events but only for the "main" branch push: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] pull_request: - branches: [ "main", "branch-*" ] + branches: ["main", "branch-*"] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} @@ -57,9 +57,9 @@ jobs: strategy: matrix: architecture: [linux/amd64] - java-version: [ 8, 11, 17 ] - scala-version: [ 2.12 ] - test-mode: [ embedded, deploy ] + java-version: [8, 11, 17] + scala-version: [2.12] + test-mode: [embedded, deploy] env: PLATFORM: ${{ matrix.architecture }} steps: @@ -68,8 +68,8 @@ jobs: - uses: actions/setup-java@v4 with: java-version: ${{ matrix.java-version }} - distribution: 'temurin' - cache: 'gradle' + distribution: "temurin" + cache: "gradle" - name: Set up QEMU uses: docker/setup-qemu-action@v2 @@ -79,7 +79,7 @@ jobs: dev/ci/check_commands.sh - name: Package Gravitino - if : ${{ matrix.test-mode == 'deploy' }} + if: ${{ matrix.test-mode == 'deploy' }} run: | ./gradlew compileDistribution -x test -PjdkVersion=${{ matrix.java-version }} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 7c9052a606f..975d929415a 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -31,19 +31,19 @@ We pledge to act and interact in ways that contribute to an open, welcoming, div Examples of behavior that contributes to a positive environment for our community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the overall community +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting +- The use of sexualized language or imagery, and sexual attention or advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities @@ -102,4 +102,4 @@ For answers to common questions about this code of conduct, see the FAQ at [http [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html [Mozilla CoC]: https://github.com/mozilla/diversity [FAQ]: https://www.contributor-covenant.org/faq -[translations]: https://www.contributor-covenant.org/translations \ No newline at end of file +[translations]: https://www.contributor-covenant.org/translations diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 89a63d79db4..7b352b81c17 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -77,10 +77,11 @@ To stop and start a local Gravitino server via `bin/gravitino.sh start` and `bin 4. To find the SDK location, run this command in WSL: - **On Ubuntu (WSL):** - ```sh - which java - ``` + **On Ubuntu (WSL):** + + ```sh + which java + ``` IntelliJ IDEA is an integrated development environment (IDE) for Java development. Setting the project SDK ensures that IntelliJ uses the correct Java version for building and running the project. @@ -104,17 +105,17 @@ Installing the WSL extension in VSCode allows you to open and edit files in your 1. Add VSCode path to the environment variables. The default installation path for VSCode is usually: - ```plaintext - C:\Users\\AppData\Local\Programs\Microsoft VS Code\bin - ``` + ```plaintext + C:\Users\\AppData\Local\Programs\Microsoft VS Code\bin + ``` - Replace `` with your actual Windows username. + Replace `` with your actual Windows username. - Example: + Example: - ```plaintext - C:\Users\epic\AppData\Local\Programs\Microsoft VS Code\bin - ``` + ```plaintext + C:\Users\epic\AppData\Local\Programs\Microsoft VS Code\bin + ``` Adding VSCode to the environment variables ensures that you can open VSCode from any command prompt or terminal window. @@ -148,7 +149,7 @@ Running `code --version` verifies that the `code` command is available. Using `c code . ``` - This command will open the current WSL directory in VSCode on Windows. If you haven't added `code` to your path, follow these steps: +This command will open the current WSL directory in VSCode on Windows. If you haven't added `code` to your path, follow these steps: - Open VSCode on Windows. @@ -169,19 +170,19 @@ Running `code --version` verifies that the `code` command is available. Using `c If you ran into a memory issue when using WSL, here are some solutions to resolve it. 1. **Shut down WSL** - If your WSL is open, you can shut it down in Windows PowerShell using the following command: + If your WSL is open, you can shut it down in Windows PowerShell using the following command: ```powershell wsl --shutdown ``` -2. **Navigate to user folder** +2. **Navigate to user folder** Open up File Explorer and navigate to `C:\Users\`. -3. **Create the `.wslconfig` file** +3. **Create the `.wslconfig` file** - Open up Notepad or another text editor and input the following: + Open up Notepad or another text editor and input the following: ```plaintext [wsl2] @@ -189,9 +190,9 @@ If you ran into a memory issue when using WSL, here are some solutions to resolv processors=4 # Makes the WSL 2 VM use four virtual processors ``` - *The memory and processor usage can be changed depending on your system's hardware.* + _The memory and processor usage can be changed depending on your system's hardware._ -4. **Save the file** +4. **Save the file** Save the file as `".wslconfig"`. Be sure to include the quotes to let Windows know that this isn't a text file. diff --git a/GOVERNANCE.md b/GOVERNANCE.md index 37418d6080e..e866221e981 100644 --- a/GOVERNANCE.md +++ b/GOVERNANCE.md @@ -19,4 +19,4 @@ # Governance Policy -The Apache Gravitino project follows the standard [ASF governance model](https://www.apache.org/foundation/governance/) and [ASF policies](https://www.apache.org/foundation/policies/) and [ASF Incubator policies] (https://incubator.apache.org/policy/incubation.html). \ No newline at end of file +The Apache Gravitino project follows the standard [ASF governance model](https://www.apache.org/foundation/governance/) and [ASF policies](https://www.apache.org/foundation/policies/) and [ASF Incubator policies] (https://incubator.apache.org/policy/incubation.html). diff --git a/MAINTAINERS.md b/MAINTAINERS.md index f9b693345dc..a5f68bd7f7a 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -92,7 +92,7 @@ Maintainers of the project are now called committers. All contributions from the people listed are licensed under the Apache License version 2. | **NAME** | **GitHub Username** | **Organization** | -|---------------|---------------------|------------------| +| ------------- | ------------------- | ---------------- | | Justin Mclean | justinmclean | Datastrato | | He Qi | qqqttt123 | Datastrato | | Minghuang Li | mchades | Datastrato | @@ -111,29 +111,29 @@ All contributions from the people listed are licensed under the Apache License v All contributions from the people listed are licensed under the Apache License version 2. -| **NAME** | **GitHub Username** | **Organization** | -|----------------|---------------------|------------------| -| Kuan-Po Tseng | brandboat | SUSE | -| Nicholas Jiang | SteNicholas | Bilibili | -| Eric Chang | unknowntpo | Lawsnote | -| Sophie Sun | SophieTech88 | ExtraHop Network | -| Xing Yong | YxAc | Xiaomi | -| Liwei Yang | lw-yang | Xiaomi | -| Yu-Ting Wang | noidname01 | opensource4you | -| Ziva Li | zivali | Yahoo | -| Kang Zhou | zhoukangcn | Xiaomi | -| Han Zhang | xiaozcy | Xiaomi | -| Yu-Hsin Lai | laiyousin | Virginia Tech | -| Charlie Cheng | charliecheng630 | cacaFly | -| PoAn Yang | FrankYang0592 | SUSE | -| Congling Xia | xiacongling | Xiaomi | -| JieBao Xiao | xloya | Xiaomi | -| Can Cai | caican00 | Xiaomi | -| Peidian Li | coolderli | Xiaomi | -| Brandon Lu | Lanznx | LINE | -| Lewis Jackson | xnge | opensource4you | -| Li-Hsing Liu | austin362667 | opensource4you | -| Tianhang Li | TEOTEO520 | Bilibili | -| Hiren Sharma | hiirrxnn | opensource4you | -| Chun-Hung Tseng| henrybear327 | opensource4you | -| Carl Chang | ichuniq | opensource4you | +| **NAME** | **GitHub Username** | **Organization** | +| --------------- | ------------------- | ---------------- | +| Kuan-Po Tseng | brandboat | SUSE | +| Nicholas Jiang | SteNicholas | Bilibili | +| Eric Chang | unknowntpo | Lawsnote | +| Sophie Sun | SophieTech88 | ExtraHop Network | +| Xing Yong | YxAc | Xiaomi | +| Liwei Yang | lw-yang | Xiaomi | +| Yu-Ting Wang | noidname01 | opensource4you | +| Ziva Li | zivali | Yahoo | +| Kang Zhou | zhoukangcn | Xiaomi | +| Han Zhang | xiaozcy | Xiaomi | +| Yu-Hsin Lai | laiyousin | Virginia Tech | +| Charlie Cheng | charliecheng630 | cacaFly | +| PoAn Yang | FrankYang0592 | SUSE | +| Congling Xia | xiacongling | Xiaomi | +| JieBao Xiao | xloya | Xiaomi | +| Can Cai | caican00 | Xiaomi | +| Peidian Li | coolderli | Xiaomi | +| Brandon Lu | Lanznx | LINE | +| Lewis Jackson | xnge | opensource4you | +| Li-Hsing Liu | austin362667 | opensource4you | +| Tianhang Li | TEOTEO520 | Bilibili | +| Hiren Sharma | hiirrxnn | opensource4you | +| Chun-Hung Tseng | henrybear327 | opensource4you | +| Carl Chang | ichuniq | opensource4you | diff --git a/README.md b/README.md index b7e3a9cc2c9..f22f5a686e4 100644 --- a/README.md +++ b/README.md @@ -36,10 +36,10 @@ Apache Gravitino is a high-performance, geo-distributed, and federated metadata Gravitino aims to provide several key features: -* Single Source of Truth for multi-regional data with geo-distributed architecture support. -* Unified Data and AI asset management for both users and engines. -* Security in one place, centralizing the security for different sources. -* Built-in data management and data access management. +- Single Source of Truth for multi-regional data with geo-distributed architecture support. +- Unified Data and AI asset management for both users and engines. +- Security in one place, centralizing the security for different sources. +- Built-in data management and data access management. ## Contributing to Apache Gravitino diff --git a/catalogs/catalog-hive/bin/generated-sources/annotations/org/apache/gravitino/catalog/hive/ImmutableConfElement.java b/catalogs/catalog-hive/bin/generated-sources/annotations/org/apache/gravitino/catalog/hive/ImmutableConfElement.java new file mode 100644 index 00000000000..47cc8984a94 --- /dev/null +++ b/catalogs/catalog-hive/bin/generated-sources/annotations/org/apache/gravitino/catalog/hive/ImmutableConfElement.java @@ -0,0 +1,225 @@ +package org.apache.gravitino.catalog.hive; + +import com.google.common.base.MoreObjects; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import com.google.errorprone.annotations.Var; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import javax.annotation.CheckReturnValue; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.NotThreadSafe; +import org.immutables.value.Generated; + +/** + * Immutable implementation of {@link CachedClientPool.ConfElement}. + *

+ * Use the builder to create immutable instances: + * {@code ImmutableConfElement.builder()}. + */ +@Generated(from = "CachedClientPool.ConfElement", generator = "Immutables") +@SuppressWarnings({"all"}) +@ParametersAreNonnullByDefault +@javax.annotation.Generated("org.immutables.processor.ProxyProcessor") +@Immutable +@CheckReturnValue +final class ImmutableConfElement extends CachedClientPool.ConfElement { + private final String key; + private final @Nullable String value; + + private ImmutableConfElement(String key, @Nullable String value) { + this.key = key; + this.value = value; + } + + /** + * @return The value of the {@code key} attribute + */ + @Override + String key() { + return key; + } + + /** + * @return The value of the {@code value} attribute + */ + @Override + @Nullable String value() { + return value; + } + + /** + * Copy the current immutable object by setting a value for the {@link CachedClientPool.ConfElement#key() key} attribute. + * An equals check used to prevent copying of the same value by returning {@code this}. + * @param value A new value for key + * @return A modified copy of the {@code this} object + */ + public final ImmutableConfElement withKey(String value) { + String newValue = Objects.requireNonNull(value, "key"); + if (this.key.equals(newValue)) return this; + return new ImmutableConfElement(newValue, this.value); + } + + /** + * Copy the current immutable object by setting a value for the {@link CachedClientPool.ConfElement#value() value} attribute. + * An equals check used to prevent copying of the same value by returning {@code this}. + * @param value A new value for value (can be {@code null}) + * @return A modified copy of the {@code this} object + */ + public final ImmutableConfElement withValue(@Nullable String value) { + if (Objects.equals(this.value, value)) return this; + return new ImmutableConfElement(this.key, value); + } + + /** + * This instance is equal to all instances of {@code ImmutableConfElement} that have equal attribute values. + * @return {@code true} if {@code this} is equal to {@code another} instance + */ + @Override + public boolean equals(@Nullable Object another) { + if (this == another) return true; + return another instanceof ImmutableConfElement + && equalTo(0, (ImmutableConfElement) another); + } + + private boolean equalTo(int synthetic, ImmutableConfElement another) { + return key.equals(another.key) + && Objects.equals(value, another.value); + } + + /** + * Computes a hash code from attributes: {@code key}, {@code value}. + * @return hashCode value + */ + @Override + public int hashCode() { + @Var int h = 5381; + h += (h << 5) + key.hashCode(); + h += (h << 5) + Objects.hashCode(value); + return h; + } + + /** + * Prints the immutable value {@code ConfElement} with attribute values. + * @return A string representation of the value + */ + @Override + public String toString() { + return MoreObjects.toStringHelper("ConfElement") + .omitNullValues() + .add("key", key) + .add("value", value) + .toString(); + } + + /** + * Creates an immutable copy of a {@link CachedClientPool.ConfElement} value. + * Uses accessors to get values to initialize the new immutable instance. + * If an instance is already immutable, it is returned as is. + * @param instance The instance to copy + * @return A copied immutable ConfElement instance + */ + public static ImmutableConfElement copyOf(CachedClientPool.ConfElement instance) { + if (instance instanceof ImmutableConfElement) { + return (ImmutableConfElement) instance; + } + return ImmutableConfElement.builder() + .from(instance) + .build(); + } + + /** + * Creates a builder for {@link ImmutableConfElement ImmutableConfElement}. + *

+   * ImmutableConfElement.builder()
+   *    .key(String) // required {@link CachedClientPool.ConfElement#key() key}
+   *    .value(String | null) // nullable {@link CachedClientPool.ConfElement#value() value}
+   *    .build();
+   * 
+ * @return A new ImmutableConfElement builder + */ + public static ImmutableConfElement.Builder builder() { + return new ImmutableConfElement.Builder(); + } + + /** + * Builds instances of type {@link ImmutableConfElement ImmutableConfElement}. + * Initialize attributes and then invoke the {@link #build()} method to create an + * immutable instance. + *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, + * but instead used immediately to create instances. + */ + @Generated(from = "CachedClientPool.ConfElement", generator = "Immutables") + @NotThreadSafe + public static final class Builder { + private static final long INIT_BIT_KEY = 0x1L; + private long initBits = 0x1L; + + private @Nullable String key; + private @Nullable String value; + + private Builder() { + } + + /** + * Fill a builder with attribute values from the provided {@code ConfElement} instance. + * Regular attribute values will be replaced with those from the given instance. + * Absent optional values will not replace present values. + * @param instance The instance from which to copy values + * @return {@code this} builder for use in a chained invocation + */ + @CanIgnoreReturnValue + public final Builder from(CachedClientPool.ConfElement instance) { + Objects.requireNonNull(instance, "instance"); + key(instance.key()); + @Nullable String valueValue = instance.value(); + if (valueValue != null) { + value(valueValue); + } + return this; + } + + /** + * Initializes the value for the {@link CachedClientPool.ConfElement#key() key} attribute. + * @param key The value for key + * @return {@code this} builder for use in a chained invocation + */ + @CanIgnoreReturnValue + public final Builder key(String key) { + this.key = Objects.requireNonNull(key, "key"); + initBits &= ~INIT_BIT_KEY; + return this; + } + + /** + * Initializes the value for the {@link CachedClientPool.ConfElement#value() value} attribute. + * @param value The value for value (can be {@code null}) + * @return {@code this} builder for use in a chained invocation + */ + @CanIgnoreReturnValue + public final Builder value(@Nullable String value) { + this.value = value; + return this; + } + + /** + * Builds a new {@link ImmutableConfElement ImmutableConfElement}. + * @return An immutable instance of ConfElement + * @throws java.lang.IllegalStateException if any required attributes are missing + */ + public ImmutableConfElement build() { + if (initBits != 0) { + throw new IllegalStateException(formatRequiredAttributesMessage()); + } + return new ImmutableConfElement(key, value); + } + + private String formatRequiredAttributesMessage() { + List attributes = new ArrayList<>(); + if ((initBits & INIT_BIT_KEY) != 0) attributes.add("key"); + return "Cannot build ConfElement, some of required attributes are not set " + attributes; + } + } +} diff --git a/catalogs/catalog-hive/bin/generated-sources/annotations/org/apache/gravitino/catalog/hive/ImmutableKey.java b/catalogs/catalog-hive/bin/generated-sources/annotations/org/apache/gravitino/catalog/hive/ImmutableKey.java new file mode 100644 index 00000000000..9876ee22fd4 --- /dev/null +++ b/catalogs/catalog-hive/bin/generated-sources/annotations/org/apache/gravitino/catalog/hive/ImmutableKey.java @@ -0,0 +1,215 @@ +package org.apache.gravitino.catalog.hive; + +import com.google.common.base.MoreObjects; +import com.google.common.collect.ImmutableList; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import com.google.errorprone.annotations.Var; +import java.util.Objects; +import javax.annotation.CheckReturnValue; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; +import javax.annotation.concurrent.Immutable; +import javax.annotation.concurrent.NotThreadSafe; +import org.immutables.value.Generated; + +/** + * Immutable implementation of {@link CachedClientPool.Key}. + *

+ * Use the builder to create immutable instances: + * {@code ImmutableKey.builder()}. + */ +@Generated(from = "CachedClientPool.Key", generator = "Immutables") +@SuppressWarnings({"all"}) +@ParametersAreNonnullByDefault +@javax.annotation.Generated("org.immutables.processor.ProxyProcessor") +@Immutable +@CheckReturnValue +final class ImmutableKey extends CachedClientPool.Key { + private final ImmutableList elements; + + private ImmutableKey(ImmutableList elements) { + this.elements = elements; + } + + /** + * @return The value of the {@code elements} attribute + */ + @Override + ImmutableList elements() { + return elements; + } + + /** + * Copy the current immutable object with elements that replace the content of {@link CachedClientPool.Key#elements() elements}. + * @param elements The elements to set + * @return A modified copy of {@code this} object + */ + public final ImmutableKey withElements(Object... elements) { + ImmutableList newValue = ImmutableList.copyOf(elements); + return new ImmutableKey(newValue); + } + + /** + * Copy the current immutable object with elements that replace the content of {@link CachedClientPool.Key#elements() elements}. + * A shallow reference equality check is used to prevent copying of the same value by returning {@code this}. + * @param elements An iterable of elements elements to set + * @return A modified copy of {@code this} object + */ + public final ImmutableKey withElements(Iterable elements) { + if (this.elements == elements) return this; + ImmutableList newValue = ImmutableList.copyOf(elements); + return new ImmutableKey(newValue); + } + + /** + * This instance is equal to all instances of {@code ImmutableKey} that have equal attribute values. + * @return {@code true} if {@code this} is equal to {@code another} instance + */ + @Override + public boolean equals(@Nullable Object another) { + if (this == another) return true; + return another instanceof ImmutableKey + && equalTo(0, (ImmutableKey) another); + } + + private boolean equalTo(int synthetic, ImmutableKey another) { + return elements.equals(another.elements); + } + + /** + * Computes a hash code from attributes: {@code elements}. + * @return hashCode value + */ + @Override + public int hashCode() { + @Var int h = 5381; + h += (h << 5) + elements.hashCode(); + return h; + } + + /** + * Prints the immutable value {@code Key} with attribute values. + * @return A string representation of the value + */ + @Override + public String toString() { + return MoreObjects.toStringHelper("Key") + .omitNullValues() + .add("elements", elements) + .toString(); + } + + /** + * Creates an immutable copy of a {@link CachedClientPool.Key} value. + * Uses accessors to get values to initialize the new immutable instance. + * If an instance is already immutable, it is returned as is. + * @param instance The instance to copy + * @return A copied immutable Key instance + */ + public static ImmutableKey copyOf(CachedClientPool.Key instance) { + if (instance instanceof ImmutableKey) { + return (ImmutableKey) instance; + } + return ImmutableKey.builder() + .from(instance) + .build(); + } + + /** + * Creates a builder for {@link ImmutableKey ImmutableKey}. + *
+   * ImmutableKey.builder()
+   *    .addElements|addAllElements(Object) // {@link CachedClientPool.Key#elements() elements} elements
+   *    .build();
+   * 
+ * @return A new ImmutableKey builder + */ + public static ImmutableKey.Builder builder() { + return new ImmutableKey.Builder(); + } + + /** + * Builds instances of type {@link ImmutableKey ImmutableKey}. + * Initialize attributes and then invoke the {@link #build()} method to create an + * immutable instance. + *

{@code Builder} is not thread-safe and generally should not be stored in a field or collection, + * but instead used immediately to create instances. + */ + @Generated(from = "CachedClientPool.Key", generator = "Immutables") + @NotThreadSafe + public static final class Builder { + private ImmutableList.Builder elements = ImmutableList.builder(); + + private Builder() { + } + + /** + * Fill a builder with attribute values from the provided {@code Key} instance. + * Regular attribute values will be replaced with those from the given instance. + * Absent optional values will not replace present values. + * Collection elements and entries will be added, not replaced. + * @param instance The instance from which to copy values + * @return {@code this} builder for use in a chained invocation + */ + @CanIgnoreReturnValue + public final Builder from(CachedClientPool.Key instance) { + Objects.requireNonNull(instance, "instance"); + addAllElements(instance.elements()); + return this; + } + + /** + * Adds one element to {@link CachedClientPool.Key#elements() elements} list. + * @param element A elements element + * @return {@code this} builder for use in a chained invocation + */ + @CanIgnoreReturnValue + public final Builder addElements(Object element) { + this.elements.add(element); + return this; + } + + /** + * Adds elements to {@link CachedClientPool.Key#elements() elements} list. + * @param elements An array of elements elements + * @return {@code this} builder for use in a chained invocation + */ + @CanIgnoreReturnValue + public final Builder addElements(Object... elements) { + this.elements.add(elements); + return this; + } + + + /** + * Sets or replaces all elements for {@link CachedClientPool.Key#elements() elements} list. + * @param elements An iterable of elements elements + * @return {@code this} builder for use in a chained invocation + */ + @CanIgnoreReturnValue + public final Builder elements(Iterable elements) { + this.elements = ImmutableList.builder(); + return addAllElements(elements); + } + + /** + * Adds elements to {@link CachedClientPool.Key#elements() elements} list. + * @param elements An iterable of elements elements + * @return {@code this} builder for use in a chained invocation + */ + @CanIgnoreReturnValue + public final Builder addAllElements(Iterable elements) { + this.elements.addAll(elements); + return this; + } + + /** + * Builds a new {@link ImmutableKey ImmutableKey}. + * @return An immutable instance of Key + * @throws java.lang.IllegalStateException if any required attributes are missing + */ + public ImmutableKey build() { + return new ImmutableKey(elements.build()); + } + } +} diff --git a/dev/docker/tools/README.md b/dev/docker/tools/README.md index 61024733b7d..cb8a937159d 100644 --- a/dev/docker/tools/README.md +++ b/dev/docker/tools/README.md @@ -18,8 +18,10 @@ --> # Mac Docker Connector + Because Docker Desktop for Mac does not provide access to container IP from host(macOS). This can result in host(macOS) and containers not being able to access each other's internal services directly over IPs. The [mac-docker-connector](https://github.com/wenjunxiao/mac-docker-connector) provides the ability for the macOS host to directly access the docker container IP. Before running the integration tests, make sure to execute the `dev/docker/tools/mac-docker-connector.sh` script. + > Developing Apache Gravitino in a linux environment does not have this limitation and does not require executing the `mac-docker-connector.sh` script ahead of time. diff --git a/docs/apache-hive-catalog.md b/docs/apache-hive-catalog.md index d0287a26fa9..ec319494506 100644 --- a/docs/apache-hive-catalog.md +++ b/docs/apache-hive-catalog.md @@ -12,8 +12,8 @@ Apache Gravitino offers the capability to utilize [Apache Hive](https://hive.apa ### Requirements and limitations -* The Hive catalog requires a Hive Metastore Service (HMS), or a compatible implementation of the HMS, such as AWS Glue. -* Gravitino must have network access to the Hive metastore service using the Thrift protocol. +- The Hive catalog requires a Hive Metastore Service (HMS), or a compatible implementation of the HMS, such as AWS Glue. +- Gravitino must have network access to the Hive metastore service using the Thrift protocol. :::note The Hive catalog is available for Apache Hive **2.x** only. Support for Apache Hive 3.x is under development. @@ -30,7 +30,7 @@ The Hive catalog supports creating, updating, and deleting databases and tables Besides the [common catalog properties](./gravitino-server-config.md#gravitino-catalog-properties-configuration), the Hive catalog has the following properties: | Property Name | Description | Default Value | Required | Since Version | -|------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|------------------------------|---------------| +| ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | ---------------------------- | ------------- | | `metastore.uris` | The Hive metastore service URIs, separate multiple addresses with commas. Such as `thrift://127.0.0.1:9083` | (none) | Yes | 0.2.0 | | `client.pool-size` | The maximum number of Hive metastore clients in the pool for Gravitino. | 1 | No | 0.2.0 | | `gravitino.bypass.` | Property name with this prefix passed down to the underlying HMS client for use. Such as `gravitino.bypass.hive.metastore.failure.retries = 3` indicate 3 times of retries upon failure of Thrift metastore calls | (none) | No | 0.2.0 | @@ -46,7 +46,6 @@ When you use the Gravitino with Trino. You can pass the Trino Hive connector con When you use the Gravitino with Spark. You can pass the Spark Hive connector configuration using prefix `spark.bypass.`. For example, using `spark.bypass.hive.exec.dynamic.partition.mode` to pass the `hive.exec.dynamic.partition.mode` to the Spark Hive connector in Spark runtime. - ### Catalog operations Refer to [Manage Relational Metadata Using Gravitino](./manage-relational-metadata-using-gravitino.md#catalog-operations) for more details. @@ -63,7 +62,7 @@ Schema properties supply or set metadata for the underlying Hive database. The following table lists predefined schema properties for the Hive database. Additionally, you can define your own key-value pair properties and transmit them to the underlying Hive database. | Property name | Description | Default value | Required | Since Version | -|---------------|--------------------------------------------------------------------------|-----------------------------------------------------------------------------------------|----------|---------------| +| ------------- | ------------------------------------------------------------------------ | --------------------------------------------------------------------------------------- | -------- | ------------- | | `location` | The directory for Hive database storage, such as `/user/hive/warehouse`. | HMS uses the value of `hive.metastore.warehouse.dir` in the `hive-site.xml` by default. | No | 0.1.0 | ### Schema operations @@ -101,7 +100,7 @@ The Hive catalog supports all data types defined in the [Hive Language Manual](h The following table lists the data types mapped from the Hive catalog to Gravitino. | Hive Data Type | Gravitino Data Type | Since Version | -|-----------------------------|---------------------|---------------| +| --------------------------- | ------------------- | ------------- | | `boolean` | `boolean` | 0.2.0 | | `tinyint` | `byte` | 0.2.0 | | `smallint` | `short` | 0.2.0 | @@ -132,25 +131,25 @@ Since 0.6.0, the data types other than listed above are mapped to Gravitino **[E Table properties supply or set metadata for the underlying Hive tables. The following table lists predefined table properties for a Hive table. Additionally, you can define your own key-value pair properties and transmit them to the underlying Hive database. -| Property Name | Description | Default Value | Required | Since version | -|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------------| -| `location` | The location for table storage, such as `/user/hive/warehouse/test_table`. | HMS uses the database location as the parent directory by default. | No | 0.2.0 | -| `table-type` | Type of the table. Valid values include `MANAGED_TABLE` and `EXTERNAL_TABLE`. | `MANAGED_TABLE` | No | 0.2.0 | -| `format` | The table file format. Valid values include `TEXTFILE`, `SEQUENCEFILE`, `RCFILE`, `ORC`, `PARQUET`, `AVRO`, `JSON`, `CSV`, and `REGEX`. | `TEXTFILE` | No | 0.2.0 | -| `input-format` | The input format class for the table, such as `org.apache.hadoop.hive.ql.io.orc.OrcInputFormat`. | The property `format` sets the default value `org.apache.hadoop.mapred.TextInputFormat` and can change it to a different default. | No | 0.2.0 | -| `output-format` | The output format class for the table, such as `org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat`. | The property `format` sets the default value `org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat` and can change it to a different default. | No | 0.2.0 | -| `serde-lib` | The serde library class for the table, such as `org.apache.hadoop.hive.ql.io.orc.OrcSerde`. | The property `format` sets the default value `org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe` and can change it to a different default. | No | 0.2.0 | +| Property Name | Description | Default Value | Required | Since version | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------- | +| `location` | The location for table storage, such as `/user/hive/warehouse/test_table`. | HMS uses the database location as the parent directory by default. | No | 0.2.0 | +| `table-type` | Type of the table. Valid values include `MANAGED_TABLE` and `EXTERNAL_TABLE`. | `MANAGED_TABLE` | No | 0.2.0 | +| `format` | The table file format. Valid values include `TEXTFILE`, `SEQUENCEFILE`, `RCFILE`, `ORC`, `PARQUET`, `AVRO`, `JSON`, `CSV`, and `REGEX`. | `TEXTFILE` | No | 0.2.0 | +| `input-format` | The input format class for the table, such as `org.apache.hadoop.hive.ql.io.orc.OrcInputFormat`. | The property `format` sets the default value `org.apache.hadoop.mapred.TextInputFormat` and can change it to a different default. | No | 0.2.0 | +| `output-format` | The output format class for the table, such as `org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat`. | The property `format` sets the default value `org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat` and can change it to a different default. | No | 0.2.0 | +| `serde-lib` | The serde library class for the table, such as `org.apache.hadoop.hive.ql.io.orc.OrcSerde`. | The property `format` sets the default value `org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe` and can change it to a different default. | No | 0.2.0 | | `serde.parameter.` | The prefix of the serde parameter, such as `"serde.parameter.orc.create.index" = "true"`, indicating `ORC` serde lib to create row indexes | (none) | No | 0.2.0 | Hive automatically adds and manages some reserved properties. Users aren't allowed to set these properties. -| Property Name | Description | Since Version | -|-------------------------|---------------------------------------------------|---------------| +| Property Name | Description | Since Version | +| ----------------------- | ----------------------------------------------- | ------------- | | `comment` | Used to store a table comment. | 0.2.0 | -| `numFiles` | Used to store the number of files in the table. | 0.2.0 | -| `totalSize` | Used to store the total size of the table. | 0.2.0 | -| `EXTERNAL` | Indicates whether the table is external. | 0.2.0 | -| `transient_lastDdlTime` | Used to store the last DDL time of the table. | 0.2.0 | +| `numFiles` | Used to store the number of files in the table. | 0.2.0 | +| `totalSize` | Used to store the total size of the table. | 0.2.0 | +| `EXTERNAL` | Indicates whether the table is external. | 0.2.0 | +| `transient_lastDdlTime` | Used to store the last DDL time of the table. | 0.2.0 | ### Table indexes @@ -168,7 +167,7 @@ The following table lists the mapping relationship between Hive Alter operations ##### Alter table | Hive Alter Operation | Gravitino Table Update Request | Since Version | -|-----------------------------------------------|--------------------------------|---------------| +| --------------------------------------------- | ------------------------------ | ------------- | | `Rename Table` | `Rename table` | 0.2.0 | | `Alter Table Properties` | `Set a table property` | 0.2.0 | | `Alter Table Comment` | `Update comment` | 0.2.0 | @@ -185,7 +184,7 @@ As Gravitino has a separate interface for updating the comment of a table, the H ##### Alter column | Hive Alter Operation | Gravitino Table Update Request | Since Version | -|--------------------------|-----------------------------------|---------------| +| ------------------------ | --------------------------------- | ------------- | | `Change Column Name` | `Rename a column` | 0.2.0 | | `Change Column Type` | `Update the type of a column` | 0.2.0 | | `Change Column Position` | `Update the position of a column` | 0.2.0 | diff --git a/docs/docker-image-details.md b/docs/docker-image-details.md index d9f7638e8e7..7d4e3082c9d 100644 --- a/docs/docker-image-details.md +++ b/docs/docker-image-details.md @@ -22,20 +22,20 @@ docker run --rm -d -p 8090:8090 -p 9001:9001 datastrato/gravitino Changelog - gravitino:0.5.1 - - Based on Gravitino 0.5.1, you can know more information from 0.5.1 release notes. + - Based on Gravitino 0.5.1, you can know more information from 0.5.1 release notes. - gravitino:0.5.0 - - Based on Gravitino 0.5.0, you can know more information from 0.5.0 release notes. + - Based on Gravitino 0.5.0, you can know more information from 0.5.0 release notes. - gravitino:0.4.0 - - Based on Gravitino 0.4.0, you can know more information from 0.4.0 release notes. + - Based on Gravitino 0.4.0, you can know more information from 0.4.0 release notes. - gravitino:0.3.1 - - Fix some issues + - Fix some issues - gravitino:0.3.0 - Docker image `datastrato/gravitino:0.3.0` @@ -67,20 +67,20 @@ Changelog Changelog - trino:435-gravitino-0.5.1 - - Based on Gravitino 0.5.1, you can know more information from 0.5.1 release notes. + - Based on Gravitino 0.5.1, you can know more information from 0.5.1 release notes. - trino:426-gravitino-0.5.0 - - Based on Gravitino 0.5.0, you can know more information from 0.5.0 release notes. + - Based on Gravitino 0.5.0, you can know more information from 0.5.0 release notes. - trino:426-gravitino-0.4.0 - - Based on Gravitino 0.4.0, you can know more information from 0.4.0 release notes. + - Based on Gravitino 0.4.0, you can know more information from 0.4.0 release notes. - trino:426-gravitino-0.3.1 - - Fix some issues + - Fix some issues - trino:426-gravitino-0.3.0 - Docker image `datastrato/trino:426-gravitino-0.3.0` @@ -96,30 +96,36 @@ You can use these kinds of Docker images to facilitate integration testing of al You can use this kind of image to test the catalog of Apache Hive with kerberos enable Changelog + - gravitino-ci-kerberos-hive:0.1.5 + - Start another HMS for the Hive cluster in the container with port 19083. This is to test whether Kerberos authentication works for a Kerberos-enabled Hive cluster with multiple HMS. - Refresh ssh keys in the startup script. - Add test logic to log in localhost via ssh without password. - gravitino-ci-kerberos-hive:0.1.4 + - Increase the total check time for the status of DataNode to 150s. - Output the log of the DataNode fails to start - gravitino-ci-kerberos-hive:0.1.3 + - Add more proxy users in the core-site.xml file. - fix bugs in the `start.sh` script. - gravitino-ci-kerberos-hive:0.1.2 + - Add `${HOSTNAME} >> /root/.ssh/known_hosts` to the startup script. - Add check for the status of DataNode, if the DataNode is not running or ready within 100s, the container will exit. - gravitino-ci-kerberos-hive:0.1.1 + - Add a principal for Gravitino web server named 'HTTP/localhost@HADOOPKRB'. - - Fix bugs about the configuration of proxy users. + - Fix bugs about the configuration of proxy users. - gravitino-ci-kerberos-hive:0.1.0 - - Set up a Hive cluster with kerberos enabled. - - Install a KDC server and create a principal for Hive. For more please see [kerberos-hive](../dev/docker/kerberos-hive) + - Set up a Hive cluster with kerberos enabled. + - Install a KDC server and create a principal for Hive. For more please see [kerberos-hive](../dev/docker/kerberos-hive) ## Apache Gravitino CI Apache Hive image @@ -128,6 +134,7 @@ You can use this kind of image to test the catalog of Apache Hive. Changelog - gravitino-ci-hive:0.1.13 + - Support Hive 2.3.9 and HDFS 2.7.3 - Docker environment variables: - `HIVE_RUNTIME_VERSION`: `hive2` (default) @@ -142,51 +149,63 @@ Changelog - Example: docker run -e HIVE_RUNTIME_VERSION='hive3' -e RANGER_SERVER_URL='http://ranger-server:6080' -e RANGER_HIVE_REPOSITORY_NAME='hiveDev' -e RANGER_HDFS_REPOSITORY_NAME='hdfsDev' ... datastrato/gravitino-ci-hive:0.1.13 - gravitino-ci-hive:0.1.12 + - Shrink hive Docker image size by 420MB - gravitino-ci-hive:0.1.11 + - Remove `yarn` from the startup script; Remove `yarn-site.xml` and `yarn-env.sh` files; - - Change the value of `mapreduce.framework.name` from `yarn` to `local` in the `mapred-site.xml` file. + - Change the value of `mapreduce.framework.name` from `yarn` to `local` in the `mapred-site.xml` file. - gravitino-ci-hive:0.1.10 + - Remove SSH service from the startup script. - Use `hadoop-daemon.sh` to start HDFS services. - gravitino-ci-hive:0.1.9 + - Remove cache after installing packages. - gravitino-ci-hive:0.1.8 + - Change the value of `hive.server2.enable.doAs` to `true` - gravitino-ci-hive:0.1.7 + - Download MySQL JDBC driver before building the Docker image - Set `hdfs` as HDFS superuser group - gravitino-ci-hive:0.1.6 + - No starting YARN when container startup - Removed expose ports: - `22` SSH - `8088` YARN Service - gravitino-ci-hive:0.1.5 + - Rollback `Map container hostname to 127.0.0.1 before starting Hadoop` of `datastrato/gravitino-ci-hive:0.1.4` - gravitino-ci-hive:0.1.4 + - Configure HDFS DataNode data transfer address to be `0.0.0.0:50010` - Map the container hostname to `127.0.0.1` before starting Hadoop - Expose `50010` port for the HDFS DataNode - gravitino-ci-hive:0.1.3 + - Change MySQL bind-address from `127.0.0.1` to `0.0.0.0` - Add `iceberg` to MySQL users with password `iceberg` - Export `3306` port for MySQL - gravitino-ci-hive:0.1.2 + - Based on `datastrato/gravitino-ci-hive:0.1.1` - Modify `fs.defaultFS` from `local` to `0.0.0.0` in the `core-site.xml` file. - Expose `9000` port in the `Dockerfile` file. - gravitino-ci-hive:0.1.1 + - Based on `datastrato/gravitino-ci-hive:0.1.0` - Modify HDFS/YARN/HIVE `MaxPermSize` from `8GB` to `128MB` - Modify `HADOOP_HEAPSIZE` from `8192` to `128` @@ -213,18 +232,23 @@ You can use this image to test Trino. Changelog - gravitino-ci-trino:0.1.6 + - Upgrade trino:426 to trino:435 - gravitino-ci-trino:0.1.5 + - Add check for the version of gravitino-trino-connector - gravitino-ci-trino:0.1.4 + - Change `-Xmx1G` to `-Xmx2G` in the config file `/etc/trino/jvm.config` - gravitino-ci-trino:0.1.3 + - Remove copy content in folder `gravitino-trino-connector` to plugin folder `/usr/lib/trino/plugin/gravitino` - gravitino-ci-trino:0.1.2 + - Copy JDBC driver 'mysql-connector-java' and 'postgres' to `/usr/lib/trino/iceberg/` folder - gravitino-ci-trino:0.1.0 @@ -238,20 +262,26 @@ Changelog You can use this image to test Apache Doris. Changelog + - gravitino-ci-doris:0.1.5 + - Remove the chmod command in the Dockerfile to decrease the size of the Docker image. - gravitino-ci-doris:0.1.4 + - remove chmod in start.sh to accelerate the startup speed - gravitino-ci-doris:0.1.3 - - To adapt to the CI framework, don't exit container when start failed, logs are no longer printed to stdout. + + - To adapt to the CI framework, don't exit container when start failed, logs are no longer printed to stdout. - Add `report_disk_state_interval_seconds` config to decrease report interval. - gravitino-ci-doris:0.1.2 + - Add a check for the status of Doris BE, add retry for adding BE nodes. - gravitino-ci-doris:0.1.1 + - Optimize `start.sh`, add disk space check before starting Doris, exit when FE or BE start failed, add log to stdout - gravitino-ci-doris:0.1.0 @@ -270,6 +300,7 @@ You can use this image to control Trino's permissions. Changelog - gravitino-ci-ranger:0.1.1 + - Docker image datastrato/gravitino-ci-ranger:0.1.1 - Use `ranger-admin` release from `datastrato/apache-ranger:2.4.0` to build docker image. - Remove unnecessary hack in `start-ranger-service.sh`. diff --git a/docs/expression.md b/docs/expression.md index ddc6f3fd711..2ea9a4a8fc0 100644 --- a/docs/expression.md +++ b/docs/expression.md @@ -24,9 +24,7 @@ The following is an example of creating a field reference expression, demonstrat [ { "type": "field", - "fieldName": [ - "student" - ] + "fieldName": ["student"] } ] ``` @@ -116,9 +114,7 @@ The following is an example of creating a function expression, demonstrating how }, { "type": "field", - "fieldName": [ - "birthday" - ] + "fieldName": ["birthday"] } ] } diff --git a/docs/flink-connector/flink-catalog-hive.md b/docs/flink-connector/flink-catalog-hive.md index 1ca84c105cc..c25c56d8492 100644 --- a/docs/flink-connector/flink-catalog-hive.md +++ b/docs/flink-connector/flink-catalog-hive.md @@ -11,7 +11,7 @@ With the Apache Gravitino Flink connector, accessing data or managing metadata i Supports most DDL and DML operations in Flink SQL, except such operations: -- Function operations +- Function operations - Partition operations - View operations - Querying UDF @@ -25,12 +25,11 @@ Supports most DDL and DML operations in Flink SQL, except such operations: ## Requirement -* Hive metastore 2.x -* HDFS 2.x or 3.x +- Hive metastore 2.x +- HDFS 2.x or 3.x ## SQL example - ```sql // Suppose hive_a is the Hive catalog name managed by Gravitino @@ -60,7 +59,7 @@ Gravitino catalog property names with the prefix `flink.bypass.` are passed to F The validated catalog properties are listed below. Any other properties with the prefix `flink.bypass.` in Gravitino Catalog will be ignored by Gravitino Flink Connector. | Property name in Gravitino catalog properties | Flink Hive connector configuration | Description | Since Version | -|-----------------------------------------------|------------------------------------|-----------------------|---------------| +| --------------------------------------------- | ---------------------------------- | --------------------- | ------------- | | `flink.bypass.default-database` | `default-database` | Hive default database | 0.6.0 | | `flink.bypass.hive-conf-dir` | `hive-conf-dir` | Hive conf dir | 0.6.0 | | `flink.bypass.hive-version` | `hive-version` | Hive version | 0.6.0 | @@ -70,4 +69,4 @@ The validated catalog properties are listed below. Any other properties with the :::caution You can set other hadoop properties (with the prefix `hadoop.`, `dfs.`, `fs.`, `hive.`) in Gravitino Catalog properties. If so, it will override the configuration from the `hive-conf-dir` and `hadoop-conf-dir`. -::: \ No newline at end of file +::: diff --git a/docs/flink-connector/flink-connector.md b/docs/flink-connector/flink-connector.md index c14186a2d07..9d8aac5c187 100644 --- a/docs/flink-connector/flink-connector.md +++ b/docs/flink-connector/flink-connector.md @@ -1,13 +1,13 @@ --- title: "Apache Gravitino Flink connector" slug: /flink-connector/flink-connector -keyword: flink connector federation query +keyword: flink connector federation query license: "This software is licensed under the Apache License version 2." --- ## Overview -The Apache Gravitino Flink connector implements the [Catalog Store](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/dev/table/catalogs/#catalog-store) to manage the catalogs under Gravitino. +The Apache Gravitino Flink connector implements the [Catalog Store](https://nightlies.apache.org/flink/flink-docs-release-1.18/docs/dev/table/catalogs/#catalog-store) to manage the catalogs under Gravitino. This capability allows users to perform federation queries, accessing data from various catalogs through a unified interface and consistent access control. ## Capabilities @@ -17,9 +17,9 @@ This capability allows users to perform federation queries, accessing data from ## Requirement -* Flink 1.18 -* Scala 2.12 -* JDK 8 or 11 or 17 +- Flink 1.18 +- Scala 2.12 +- JDK 8 or 11 or 17 ## How to use it @@ -27,18 +27,21 @@ This capability allows users to perform federation queries, accessing data from 2. Configure the Flink configuration to use the Gravitino flink connector. | Property | Type | Default Value | Description | Required | Since Version | -|--------------------------------------------------|--------|-------------------|----------------------------------------------------------------------|----------|---------------| +| ------------------------------------------------ | ------ | ----------------- | -------------------------------------------------------------------- | -------- | ------------- | | table.catalog-store.kind | string | generic_in_memory | The Catalog Store name, it should set to `gravitino`. | Yes | 0.6.0 | | table.catalog-store.gravitino.gravitino.metalake | string | (none) | The metalake name that flink connector used to request to Gravitino. | Yes | 0.6.0 | | table.catalog-store.gravitino.gravitino.uri | string | (none) | The uri of Gravitino server address. | Yes | 0.6.0 | Set the flink configuration in flink-conf.yaml. + ```yaml table.catalog-store.kind=gravitino table.catalog-store.gravitino.gravitino.metalake=test table.catalog-store.gravitino.gravitino.uri=http://localhost:8080 ``` + Or you can set the flink configuration in the `TableEnvironment`. + ```java final Configuration configuration = new Configuration(); configuration.setString("table.catalog-store.kind", "gravitino"); @@ -48,7 +51,7 @@ EnvironmentSettings.Builder builder = EnvironmentSettings.newInstance().withConf TableEnvironment tableEnv = TableEnvironment.create(builder.inBatchMode().build()); ``` -3. Execute the Flink SQL query. +3. Execute the Flink SQL query. Suppose there is only one hive catalog with the name hive in the metalake test. @@ -67,7 +70,7 @@ SELECT * FROM hive_students; Gravitino flink connector support the following datatype mapping between Flink and Gravitino. | Flink Type | Gravitino Type | Since Version | -|----------------------------------|-------------------------------|---------------| +| -------------------------------- | ----------------------------- | ------------- | | `array` | `array` | 0.6.0 | | `bigint` | `long` | 0.6.0 | | `binary` | `fixed` | 0.6.0 | diff --git a/docs/getting-started.md b/docs/getting-started.md index 01220ae675b..7a7f99e21ea 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -8,90 +8,98 @@ There are several options for getting started with Apache Gravitino. Installing If you want to download and install Gravitino: - - on AWS, see [Getting started on Amazon Web Services](#getting-started-on-amazon-web-services) - - Google Cloud Platform, see [Getting started on Google Cloud Platform](#getting-started-on-google-cloud-platform) - - locally, see [Getting started locally](#getting-started-locally) +- on AWS, see [Getting started on Amazon Web Services](#getting-started-on-amazon-web-services) +- Google Cloud Platform, see [Getting started on Google Cloud Platform](#getting-started-on-google-cloud-platform) +- locally, see [Getting started locally](#getting-started-locally) -If you have your own Apache Gravitino setup and want to use Apache Hive: +If you have your own Apache Gravitino setup and want to use Apache Hive: - - on AWS or Google Cloud Platform, see [Installing Apache Hive on AWS or Google Cloud Platform](#installing-apache-hive-on-aws-or-google-cloud-platform) - - locally, see [Installing Apache Hive locally](#installing-apache-hive-locally) +- on AWS or Google Cloud Platform, see [Installing Apache Hive on AWS or Google Cloud Platform](#installing-apache-hive-on-aws-or-google-cloud-platform) +- locally, see [Installing Apache Hive locally](#installing-apache-hive-locally) If you prefer to get started quickly and use Docker for Gravitino, Apache Hive, Trino, and others: - - on AWS or Google Cloud Platform, see [Installing Gravitino playground on AWS or Google Cloud Platform](#installing-gravitino-playground-on-aws-or-google-cloud-platform) - - locally, see [Installing Gravitino playground locally](#installing-gravitino-playground-locally) +- on AWS or Google Cloud Platform, see [Installing Gravitino playground on AWS or Google Cloud Platform](#installing-gravitino-playground-on-aws-or-google-cloud-platform) +- locally, see [Installing Gravitino playground locally](#installing-gravitino-playground-locally) If you are using AWS and want to access the instance remotely, be sure to read [Accessing Gravitino on AWS externally](#accessing-gravitino-on-aws-externally) ### Index 1. **Installation methods** + - Explore different installation methods, from using Docker to setting up Gravitino on cloud platforms or locally. 2. **Java Development Kit (JDK)** + - Ensure you have the required Java Development Kit (JDK) installed to run Gravitino successfully. 3. **Configuring and starting Gravitino** + - Learn how to configure Gravitino, install it from binary releases or Docker images, and start the Gravitino server. 4. **Getting started on AWS and GCP** + - Detailed steps for setting up Gravitino on Amazon Web Services (AWS) and Google Cloud Platform (GCP), including instance setup, Java installation, and Gravitino deployment. 5. **Getting started locally** + - Instructions for using Gravitino locally on macOS or Linux, covering JDK installation and Gravitino setup. 6. **Integrating with Apache Hive** + - Information on installing and configuring Apache Hive on AWS, GCP, and locally. Docker container options for quick setup are also provided. 7. **Gravitino Playground** + - Explore a bundled Docker image for a Gravitino playground, incorporating tools like Apache Hive, Apache Hadoop, Trino, MySQL, and PostgreSQL. 8. **Using REST to interact with Gravitino** + - Examples of interacting with Gravitino via REST commands, demonstrating how to create and modify metadata. 9. **Accessing Gravitino on AWS externally** + - Guidelines for accessing Gravitino externally when deployed on AWS, including necessary configurations and considerations. 10. **Next steps** - Concluding thoughts and suggested next steps for users who have completed the setup. - ## Getting started on Amazon Web Services To begin using Gravitino on AWS, follow these steps: -1. In the AWS console, launch a new instance. Select `Ubuntu` as the operating system and `t2.xlarge` as the instance type. Create a key pair named *Gravitino.pem* for SSH access and download it. Allow HTTP and HTTPS traffic if you want to connect to the instance remotely. Set the Elastic Block Store storage to 20GiB. Leave all other settings at their defaults. Other operating systems and instance types may work, but they have yet to be fully tested. +1. In the AWS console, launch a new instance. Select `Ubuntu` as the operating system and `t2.xlarge` as the instance type. Create a key pair named _Gravitino.pem_ for SSH access and download it. Allow HTTP and HTTPS traffic if you want to connect to the instance remotely. Set the Elastic Block Store storage to 20GiB. Leave all other settings at their defaults. Other operating systems and instance types may work, but they have yet to be fully tested. 2. Start the instance and connect to it via SSH using the downloaded .pem file: - ```shell - ssh ubuntu@ -i ~/Downloads/Gravitino.pem - ``` + ```shell + ssh ubuntu@ -i ~/Downloads/Gravitino.pem + ``` **Note**: you may need to adjust the permissions on your .pem file using `chmod 400` to enable SSH connections. 3. Update the Ubuntu OS to ensure it's up-to-date: - ```shell - sudo apt update - sudo apt upgrade - ``` + ```shell + sudo apt update + sudo apt upgrade + ``` - You may need to reboot the instance for all changes to take effect. + You may need to reboot the instance for all changes to take effect. 4. Install the required Java Development Kit. Gravitino supports running on Java 8, 11 and 17, so you can install any of them: - ```shell - sudo apt install openjdk--jdk-headless - ``` + ```shell + sudo apt install openjdk--jdk-headless + ``` Verify the Java version with: - ```shell - java -version - ``` + ```shell + java -version + ``` You should see information about the OpenJDK version. @@ -104,9 +112,9 @@ To begin using Gravitino on AWS, follow these steps: 6. Start Gravitino using the gravitino.sh script: - ```shell - /bin/gravitino.sh start - ``` + ```shell + /bin/gravitino.sh start + ``` ## Getting started on Google Cloud Platform @@ -118,27 +126,27 @@ To begin using Gravitino on GCP, follow these steps: 3. Update the Debian OS to ensure it's up-to-date: - ```shell - sudo apt update - sudo apt upgrade - ``` + ```shell + sudo apt update + sudo apt upgrade + ``` - You may need to reboot the instance for all changes to take effect. + You may need to reboot the instance for all changes to take effect. 4. Install the required Java Development Kit. Gravitino supports running on Java 8, 11 and 17, so you can install any of them: - ```shell - wget -O - https://apt.corretto.aws/corretto.key | sudo gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg && echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" | sudo tee /etc/apt/sources.list.d/corretto.list - sudo apt-get update - sudo apt-get install -y java--amazon-corretto-jdk - ``` + ```shell + wget -O - https://apt.corretto.aws/corretto.key | sudo gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg && echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" | sudo tee /etc/apt/sources.list.d/corretto.list + sudo apt-get update + sudo apt-get install -y java--amazon-corretto-jdk + ``` Verify the Java version with: - ```shell - java -version - ``` + ```shell + java -version + ``` You should see information about the OpenJDK version. @@ -151,9 +159,9 @@ To begin using Gravitino on GCP, follow these steps: 6. Start Gravitino using the gravitino.sh script: - ```shell - /bin/gravitino.sh start - ``` + ```shell + /bin/gravitino.sh start + ``` ## Getting started locally @@ -162,12 +170,12 @@ To use Gravitino locally on macOS or Linux, follow these similar steps: 1. Install the required Java Development Kit. Gravitino supports running on Java 8, so 11 and 17, you can install any of them. Using [sdkman](https://sdkman.io/), for example: - ```shell - sdk install java - ``` + ```shell + sdk install java + ``` - You can also use different package managers to install JDK, for example, - [Homebrew](https://brew.sh/) on macOS, `apt` on Ubuntu/Debian, and `yum` on CentOS/RedHat. + You can also use different package managers to install JDK, for example, + [Homebrew](https://brew.sh/) on macOS, `apt` on Ubuntu/Debian, and `yum` on CentOS/RedHat. 2. Install Gravitino: @@ -178,9 +186,9 @@ To use Gravitino locally on macOS or Linux, follow these similar steps: 3. Start Gravitino using the gravitino.sh script: - ```shell - /bin/gravitino.sh start - ``` + ```shell + /bin/gravitino.sh start + ``` ## Installing Apache Hive on AWS or Google Cloud Platform @@ -214,7 +222,7 @@ Gravitino provides a bundle of Docker images to launch a Gravitino playground, w includes Apache Hive, Apache Hadoop, Trino, MySQL, PostgreSQL, and Gravitino. You can use Docker Compose to start them all. -Installing Docker and Docker Compose is a requirement for using the playground. +Installing Docker and Docker Compose is a requirement for using the playground. ```shell sudo apt install docker docker-compose @@ -254,7 +262,7 @@ After starting the Gravitino distribution, issue REST commands to create and mod http://localhost:8090/api/metalakes/metalake ``` - Note that if you request a Metalake that doesn't exist, you get a *NoSuchMetalakeException* error. + Note that if you request a Metalake that doesn't exist, you get a _NoSuchMetalakeException_ error. ```shell curl -X GET -H "Accept: application/vnd.gravitino.v1+json" \ @@ -316,6 +324,7 @@ After completing these steps, you should be able to access the Gravitino REST in ## Next steps 1. **Explore documentation:** + - Delve deeper into the Gravitino documentation for advanced features and configuration options. - Check out https://datastrato.ai/docs @@ -323,14 +332,13 @@ After completing these steps, you should be able to access the Gravitino REST in - Join the Gravitino community forums to connect with other users, share experiences, and seek assistance if needed. - Check out our GitHub repository: https://github.com/apache/gravitino - Check out our Slack channel in ASF Slack: https://the-asf.slack.com - 3. **Read our blogs:** + - Check out: https://gravitino.apache.org/blog (coming soon) 4. **Continuous updates:** - - Stay informed about Gravitino updates and new releases to benefit from the latest features, optimizations, and security + - Stay informed about Gravitino updates and new releases to benefit from the latest features, optimizations, and security enhancements. - Check out our Website: https://gravitino.apache.org (coming soon) - This document is just the beginning. You're welcome to customize your Gravitino setup based on your requirements and to explore the vast possibilities this powerful tool offers. If you encounter any issues or have questions, you can always connect with the Gravitino community for assistance. diff --git a/docs/glossary.md b/docs/glossary.md index 22002168a14..4248c3329e5 100644 --- a/docs/glossary.md +++ b/docs/glossary.md @@ -44,7 +44,7 @@ license: "This software is licensed under the Apache License version 2." - A collection of metadata from a specific metadata source. -## Catalog provider +## Catalog provider - The specific system or technology used to store and manage metadata catalogs. @@ -202,13 +202,13 @@ license: "This software is licensed under the Apache License version 2." ## Java Toolchain -- A feature introduced in Gradle to detect and manage JDK versions. +- A feature introduced in Gradle to detect and manage JDK versions. ## JDBC URI - The JDBC connection address specified in the catalog configuration, including details such as the database type, host, port, and database name. -## JMX +## JMX - Java Management Extensions provides tools for managing and monitoring Java applications. @@ -220,15 +220,15 @@ license: "This software is licensed under the Apache License version 2." - A compact, URL-safe means of representing claims between two parties. -## Java Virtual Machine (JVM) +## Java Virtual Machine (JVM) - A virtual machine that enables a computer to run Java applications, providing an abstraction layer between the application and the underlying hardware. -## JVM metrics +## JVM metrics - Metrics related to the performance and behavior of the Java Virtual Machine (JVM), including memory usage, garbage collection, and buffer pool metrics. -## JVM instrumentation +## JVM instrumentation - The process of adding monitoring and management capabilities to the Java Virtual Machine, allowing for the collection of performance metrics. @@ -366,7 +366,7 @@ license: "This software is licensed under the Apache License version 2." ## Trino Apache Gravitino connector documentation -- Documentation providing information on using the Trino connector to access metadata in Gravitino. +- Documentation providing information on using the Trino connector to access metadata in Gravitino. ## Ubuntu diff --git a/docs/gravitino-server-config.md b/docs/gravitino-server-config.md index 6a8e96b8f58..358173c7781 100644 --- a/docs/gravitino-server-config.md +++ b/docs/gravitino-server-config.md @@ -23,42 +23,41 @@ The `gravitino.conf` file lists the configuration items in the following table. ### Apache Gravitino HTTP Server configuration -| Configuration item | Description | Default value | Required | Since version | -|-------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|----------|---------------| -| `gravitino.server.webserver.host` | The host of the Gravitino server. | `0.0.0.0` | No | 0.1.0 | -| `gravitino.server.webserver.httpPort` | The port on which the Gravitino server listens for incoming connections. | `8090` | No | 0.1.0 | -| `gravitino.server.webserver.minThreads` | The minimum number of threads in the thread pool used by the Jetty webserver. `minThreads` is 8 if the value is less than 8. | `Math.max(Math.min(Runtime.getRuntime().availableProcessors() * 2, 100), 8)` | No | 0.2.0 | -| `gravitino.server.webserver.maxThreads` | The maximum number of threads in the thread pool used by the Jetty webserver. `maxThreads` is 8 if the value is less than 8, and `maxThreads` must be great or equal to `minThreads`. | `Math.max(Runtime.getRuntime().availableProcessors() * 4, 400)` | No | 0.1.0 | -| `gravitino.server.webserver.threadPoolWorkQueueSize` | The size of the queue in the thread pool used by the Jetty webserver. | `100` | No | 0.1.0 | -| `gravitino.server.webserver.stopTimeout` | Time in milliseconds to gracefully shut down the Jetty webserver, for more, please see `org.eclipse.jetty.server.Server#setStopTimeout`. | `30000` | No | 0.2.0 | -| `gravitino.server.webserver.idleTimeout` | The timeout in milliseconds of idle connections. | `30000` | No | 0.2.0 | -| `gravitino.server.webserver.requestHeaderSize` | Maximum size of HTTP requests. | `131072` | No | 0.1.0 | -| `gravitino.server.webserver.responseHeaderSize` | Maximum size of HTTP responses. | `131072` | No | 0.1.0 | -| `gravitino.server.shutdown.timeout` | Time in milliseconds to gracefully shut down of the Gravitino webserver. | `3000` | No | 0.2.0 | -| `gravitino.server.webserver.customFilters` | Comma-separated list of filter class names to apply to the API. | (none) | No | 0.4.0 | +| Configuration item | Description | Default value | Required | Since version | +| ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | -------- | ------------- | +| `gravitino.server.webserver.host` | The host of the Gravitino server. | `0.0.0.0` | No | 0.1.0 | +| `gravitino.server.webserver.httpPort` | The port on which the Gravitino server listens for incoming connections. | `8090` | No | 0.1.0 | +| `gravitino.server.webserver.minThreads` | The minimum number of threads in the thread pool used by the Jetty webserver. `minThreads` is 8 if the value is less than 8. | `Math.max(Math.min(Runtime.getRuntime().availableProcessors() * 2, 100), 8)` | No | 0.2.0 | +| `gravitino.server.webserver.maxThreads` | The maximum number of threads in the thread pool used by the Jetty webserver. `maxThreads` is 8 if the value is less than 8, and `maxThreads` must be great or equal to `minThreads`. | `Math.max(Runtime.getRuntime().availableProcessors() * 4, 400)` | No | 0.1.0 | +| `gravitino.server.webserver.threadPoolWorkQueueSize` | The size of the queue in the thread pool used by the Jetty webserver. | `100` | No | 0.1.0 | +| `gravitino.server.webserver.stopTimeout` | Time in milliseconds to gracefully shut down the Jetty webserver, for more, please see `org.eclipse.jetty.server.Server#setStopTimeout`. | `30000` | No | 0.2.0 | +| `gravitino.server.webserver.idleTimeout` | The timeout in milliseconds of idle connections. | `30000` | No | 0.2.0 | +| `gravitino.server.webserver.requestHeaderSize` | Maximum size of HTTP requests. | `131072` | No | 0.1.0 | +| `gravitino.server.webserver.responseHeaderSize` | Maximum size of HTTP responses. | `131072` | No | 0.1.0 | +| `gravitino.server.shutdown.timeout` | Time in milliseconds to gracefully shut down of the Gravitino webserver. | `3000` | No | 0.2.0 | +| `gravitino.server.webserver.customFilters` | Comma-separated list of filter class names to apply to the API. | (none) | No | 0.4.0 | The filter in the customFilters should be a standard javax servlet filter. You can also specify filter parameters by setting configuration entries of the form `gravitino.server.webserver..param.=`. ### Storage configuration -| Configuration item | Description | Default value | Required | Since version | -|---------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------|--------------------------------------------------|---------------| -| `gravitino.entity.store` | Which entity storage implementation to use. Only`relational` storage is currently supported. | `relational` | No | 0.1.0 | -| `gravitino.entity.store.kv` | Detailed implementation of KV storage. `RocksDB` storage is currently supported, and the implementation is `RocksDBKvBackend`. | `RocksDBKvBackend` | No | 0.1.0 | -| `gravitino.entity.store.kv.rocksdbPath` | The storage path for RocksDB storage implementation. It supports both absolute and relative path, if the value is a relative path, the final path is `${GRAVITINO_HOME}/${PATH_YOU_HAVA_SET}`, default value is `${GRAVITINO_HOME}/data/rocksdb` | `${GRAVITINO_HOME}/data/rocksdb` | No | 0.1.0 | -| `gravitino.entity.serde` | The serialization/deserialization class used to support entity storage. `proto' is currently supported. | `proto` | No | 0.1.0 | -| `gravitino.entity.store.maxTransactionSkewTimeMs` | The maximum skew time of transactions in milliseconds. | `2000` | No | 0.3.0 | -| `gravitino.entity.store.kv.deleteAfterTimeMs` | It is deprecated since Gravitino 0.5.0. Please use `gravitino.entity.store.deleteAfterTimeMs` instead. | `604800000`(7 days) | No | 0.3.0 | -| `gravitino.entity.store.deleteAfterTimeMs` | The maximum time in milliseconds that deleted and old-version data is kept. Set to at least 10 minutes and no longer than 30 days. | `604800000`(7 days) | No | 0.5.0 | -| `gravitino.entity.store.versionRetentionCount` | The Count of versions allowed to be retained, including the current version, used to delete old versions data. Set to at least 1 and no greater than 10. | `1` | No | 0.5.0 | -| `gravitino.entity.store.relational` | Detailed implementation of Relational storage. `MySQL` is currently supported, and the implementation is `JDBCBackend`. | `JDBCBackend` | No | 0.5.0 | -| `gravitino.entity.store.relational.jdbcUrl` | The database url that the `JDBCBackend` needs to connect to. If you use `MySQL`, you should firstly initialize the database tables yourself by executing the ddl scripts in the `${GRAVITINO_HOME}/scripts/mysql/` directory. | `jdbc:h2` | No | 0.5.0 | -| `gravitino.entity.store.relational.jdbcDriver` | The jdbc driver name that the `JDBCBackend` needs to use. You should place the driver Jar package in the `${GRAVITINO_HOME}/libs/` directory. | `org.h2.Driver` | Yes if the jdbc connection url is not `jdbc:h2` | 0.5.0 | -| `gravitino.entity.store.relational.jdbcUser` | The username that the `JDBCBackend` needs to use when connecting the database. It is required for `MySQL`. | `gravitino` | Yes if the jdbc connection url is not `jdbc:h2` | 0.5.0 | -| `gravitino.entity.store.relational.jdbcPassword` | The password that the `JDBCBackend` needs to use when connecting the database. It is required for `MySQL`. | `gravitino` | Yes if the jdbc connection url is not `jdbc:h2` | 0.5.0 | -| `gravitino.entity.store.relational.storagePath` | The storage path for embedded JDBC storage implementation. It supports both absolute and relative path, if the value is a relative path, the final path is `${GRAVITINO_HOME}/${PATH_YOU_HAVA_SET}`, default value is `${GRAVITINO_HOME}/data/jdbc` | `${GRAVITINO_HOME}/data/jdbc` | No | 0.6.0 | - +| Configuration item | Description | Default value | Required | Since version | +| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ----------------------------------------------- | ------------- | +| `gravitino.entity.store` | Which entity storage implementation to use. Only`relational` storage is currently supported. | `relational` | No | 0.1.0 | +| `gravitino.entity.store.kv` | Detailed implementation of KV storage. `RocksDB` storage is currently supported, and the implementation is `RocksDBKvBackend`. | `RocksDBKvBackend` | No | 0.1.0 | +| `gravitino.entity.store.kv.rocksdbPath` | The storage path for RocksDB storage implementation. It supports both absolute and relative path, if the value is a relative path, the final path is `${GRAVITINO_HOME}/${PATH_YOU_HAVA_SET}`, default value is `${GRAVITINO_HOME}/data/rocksdb` | `${GRAVITINO_HOME}/data/rocksdb` | No | 0.1.0 | +| `gravitino.entity.serde` | The serialization/deserialization class used to support entity storage. `proto' is currently supported. | `proto` | No | 0.1.0 | +| `gravitino.entity.store.maxTransactionSkewTimeMs` | The maximum skew time of transactions in milliseconds. | `2000` | No | 0.3.0 | +| `gravitino.entity.store.kv.deleteAfterTimeMs` | It is deprecated since Gravitino 0.5.0. Please use `gravitino.entity.store.deleteAfterTimeMs` instead. | `604800000`(7 days) | No | 0.3.0 | +| `gravitino.entity.store.deleteAfterTimeMs` | The maximum time in milliseconds that deleted and old-version data is kept. Set to at least 10 minutes and no longer than 30 days. | `604800000`(7 days) | No | 0.5.0 | +| `gravitino.entity.store.versionRetentionCount` | The Count of versions allowed to be retained, including the current version, used to delete old versions data. Set to at least 1 and no greater than 10. | `1` | No | 0.5.0 | +| `gravitino.entity.store.relational` | Detailed implementation of Relational storage. `MySQL` is currently supported, and the implementation is `JDBCBackend`. | `JDBCBackend` | No | 0.5.0 | +| `gravitino.entity.store.relational.jdbcUrl` | The database url that the `JDBCBackend` needs to connect to. If you use `MySQL`, you should firstly initialize the database tables yourself by executing the ddl scripts in the `${GRAVITINO_HOME}/scripts/mysql/` directory. | `jdbc:h2` | No | 0.5.0 | +| `gravitino.entity.store.relational.jdbcDriver` | The jdbc driver name that the `JDBCBackend` needs to use. You should place the driver Jar package in the `${GRAVITINO_HOME}/libs/` directory. | `org.h2.Driver` | Yes if the jdbc connection url is not `jdbc:h2` | 0.5.0 | +| `gravitino.entity.store.relational.jdbcUser` | The username that the `JDBCBackend` needs to use when connecting the database. It is required for `MySQL`. | `gravitino` | Yes if the jdbc connection url is not `jdbc:h2` | 0.5.0 | +| `gravitino.entity.store.relational.jdbcPassword` | The password that the `JDBCBackend` needs to use when connecting the database. It is required for `MySQL`. | `gravitino` | Yes if the jdbc connection url is not `jdbc:h2` | 0.5.0 | +| `gravitino.entity.store.relational.storagePath` | The storage path for embedded JDBC storage implementation. It supports both absolute and relative path, if the value is a relative path, the final path is `${GRAVITINO_HOME}/${PATH_YOU_HAVA_SET}`, default value is `${GRAVITINO_HOME}/data/jdbc` | `${GRAVITINO_HOME}/data/jdbc` | No | 0.6.0 | :::caution We strongly recommend that you change the default value of `gravitino.entity.store.kv.rocksdbPath`, as it's under the deployment directory and future version upgrades may remove it. @@ -69,7 +68,7 @@ We strongly recommend that you change the default value of `gravitino.entity.sto Gravitino server uses tree lock to ensure the consistency of the data. The tree lock is a memory lock (Currently, Gravitino only supports in memory lock) that can be used to ensure the consistency of the data in Gravitino server. The configuration items are as follows: | Configuration item | Description | Default value | Required | Since Version | -|--------------------------------------|---------------------------------------------------------------|---------------|----------|---------------| +| ------------------------------------ | ------------------------------------------------------------- | ------------- | -------- | ------------- | | `gravitino.lock.maxNodes` | The maximum number of tree lock nodes to keep in memory | 100000 | No | 0.5.0 | | `gravitino.lock.minNodes` | The minimum number of tree lock nodes to keep in memory | 1000 | No | 0.5.0 | | `gravitino.lock.cleanIntervalInSecs` | The interval in seconds to clean up the stale tree lock nodes | 60 | No | 0.5.0 | @@ -77,14 +76,14 @@ Gravitino server uses tree lock to ensure the consistency of the data. The tree ### Catalog configuration | Configuration item | Description | Default value | Required | Since version | -|----------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|----------|---------------| +| -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------- | ------------- | | `gravitino.catalog.cache.evictionIntervalMs` | The interval in milliseconds to evict the catalog cache; default 3600000ms(1h). | `3600000` | No | 0.1.0 | | `gravitino.catalog.classloader.isolated` | Whether to use an isolated classloader for catalog. If `true`, an isolated classloader loads all catalog-related libraries and configurations, not the AppClassLoader. The default value is `true`. | `true` | No | 0.1.0 | ### Auxiliary service configuration | Configuration item | Description | Default value | Since Version | -|-------------------------------|--------------------------------------------------------------------------------------------------------------------------------|---------------|---------------| +| ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ------------- | ------------- | | `gravitino.auxService.names ` | The auxiliary service name of the Gravitino Iceberg REST server. Use **`iceberg-rest`** for the Gravitino Iceberg REST server. | (none) | 0.2.0 | Refer to [Iceberg REST catalog service](iceberg-rest-service.md) for configuration details. @@ -96,17 +95,17 @@ Gravitino provides event listener mechanism to allow users to capture the events To leverage the event listener, you must implement the `EventListenerPlugin` interface and place the JAR file in the classpath of the Gravitino server. Then, add configurations to gravitino.conf to enable the event listener. | Property name | Description | Default value | Required | Since Version | -|--------------------------------------------|--------------------------------------------------------------------------------------------------------|---------------|----------|---------------| +| ------------------------------------------ | ------------------------------------------------------------------------------------------------------ | ------------- | -------- | ------------- | | `gravitino.eventListener.names` | The name of the event listener, For multiple listeners, separate names with a comma, like "audit,sync" | (none) | Yes | 0.5.0 | -| `gravitino.eventListener.{name}.className` | The class name of the event listener, replace `{name}` with the actual listener name. | (none) | Yes | 0.5.0 | -| `gravitino.eventListener.{name}.{key}` | Custom properties that will be passed to the event listener plugin. | (none) | Yes | 0.5.0 | +| `gravitino.eventListener.{name}.className` | The class name of the event listener, replace `{name}` with the actual listener name. | (none) | Yes | 0.5.0 | +| `gravitino.eventListener.{name}.{key}` | Custom properties that will be passed to the event listener plugin. | (none) | Yes | 0.5.0 | #### Event Gravitino triggers a specific event upon the completion of the operation, with varying events being generated for different operations. -| operation type | event | -|--------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| operation type | event | +| ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | table operation | `CreateTableEvent`, `AlterTableEvent`, `DropTableEvent`, `LoadTableEvent`, `ListTableEvent`, `PurgeTableFailureEvent`, `CreateTableFailureEvent`, `AlterTableFailureEvent`, `DropTableFailureEvent`, `LoadTableFailureEvent`, `ListTableFailureEvent`, `PurgeTableFailureEvent` | | fileset operation | `CreateFileSetEvent`, `AlterFileSetEvent`, `DropFileSetEvent`, `LoadFileSetEvent`, `ListFileSetEvent`, `CreateFileSetFailureEvent`, `AlterFileSetFailureEvent`, `DropFileSetFailureEvent`, `LoadFileSetFailureEvent`, `ListFileSetFailureEvent` | | topic operation | `CreateTopicEvent`, `AlterTopicEvent`, `DropTopicEvent`, `LoadTopicEvent`, `ListTopicEvent`, `CreateTopicFailureEvent`, `AlterTopicFailureEvent`, `DropTopicFailureEvent`, `LoadTopicFailureEvent`, `ListTopicFailureEvent` | @@ -123,7 +122,7 @@ The plugin provides several operational modes for how to process event, supporti - **SYNC**: Events are processed synchronously, immediately following the associated operation. This mode ensures events are processed before the operation's result is returned to the client, but it may delay the main process if event processing takes too long. - **ASYNC_SHARED**: This mode employs a shared queue and dispatcher for asynchronous event processing. It prevents the main process from being blocked, though there's a risk events might be dropped if not promptly consumed. Sharing a dispatcher can lead to poor isolation in case of slow listeners. - + - **ASYNC_ISOLATED**: Events are processed asynchronously, with each listener having its own dedicated queue and dispatcher thread. This approach offers better isolation but at the expense of multiple queues and dispatchers. For more details, please refer to the definition of the plugin. @@ -135,7 +134,7 @@ Refer to [security](security.md) for HTTPS and authentication configurations. ### Metrics configuration | Property name | Description | Default value | Required | Since Version | -|-------------------------------------------|------------------------------------------------------|---------------|----------|---------------| +| ----------------------------------------- | ---------------------------------------------------- | ------------- | -------- | ------------- | | `gravitino.metrics.timeSlidingWindowSecs` | The seconds of Gravitino metrics time sliding window | 60 | No | 0.5.1 | ## Apache Gravitino catalog properties configuration @@ -162,16 +161,15 @@ These rules only apply to the catalog properties and don't affect the schema or Below is a list of catalog properties that will be used by all Gravitino catalogs: | Configuration item | Description | Default value | Required | Since version | -|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|----------|---------------| +| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------- | ------------- | | `package` | The path of the catalog package, Gravitino leverages this path to load the related catalog libs and configurations. The package should consist two folders, `conf` (for catalog related configurations) and `libs` (for catalog related dependencies/jars) | (none) | No | 0.5.0 | | `cloud.name` | The property to specify the cloud that the catalog is running on. The valid values are `aws`, `azure`, `gcp`, `on_premise` and `other`. | (none) | No | 0.6.0 | | `cloud.region-code` | The property to specify the region code of the cloud that the catalog is running on. | (none) | No | 0.6.0 | - The following table lists the catalog specific properties and their default paths: | catalog provider | catalog properties | catalog properties configuration file path | -|---------------------|-----------------------------------------------------------------------------------------|----------------------------------------------------------| +| ------------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------- | | `hive` | [Hive catalog properties](apache-hive-catalog.md#catalog-properties) | `catalogs/hive/conf/hive.conf` | | `lakehouse-iceberg` | [Lakehouse Iceberg catalog properties](lakehouse-iceberg-catalog.md#catalog-properties) | `catalogs/lakehouse-iceberg/conf/lakehouse-iceberg.conf` | | `jdbc-mysql` | [MySQL catalog properties](jdbc-mysql-catalog.md#catalog-properties) | `catalogs/jdbc-mysql/conf/jdbc-mysql.conf` | @@ -196,5 +194,5 @@ Currently, due to the absence of a comprehensive user permission system, Graviti Apache Hadoop access. Ensure that the user starting the Gravitino server has Hadoop (HDFS, YARN, etc.) access permissions; otherwise, you may encounter a `Permission denied` error. There are two ways to resolve this error: -* Grant Gravitino startup user permissions in Hadoop -* Specify the authorized Hadoop username in the environment variables `HADOOP_USER_NAME` before starting the Gravitino server. +- Grant Gravitino startup user permissions in Hadoop +- Specify the authorized Hadoop username in the environment variables `HADOOP_USER_NAME` before starting the Gravitino server. diff --git a/docs/hadoop-catalog.md b/docs/hadoop-catalog.md index 1cfb95943bd..7266c04e1da 100644 --- a/docs/hadoop-catalog.md +++ b/docs/hadoop-catalog.md @@ -26,7 +26,7 @@ Hadoop 3. If there's any compatibility issue, please create an [issue](https://g Besides the [common catalog properties](./gravitino-server-config.md#gravitino-catalog-properties-configuration), the Hadoop catalog has the following properties: | Property Name | Description | Default Value | Required | Since Version | -|----------------------------------------------------|------------------------------------------------------------------------------------------------|---------------|-------------------------------------------------------------|---------------| +| -------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ------------- | ----------------------------------------------------------- | ------------- | | `location` | The storage location managed by Hadoop catalog. | (none) | No | 0.5.0 | | `authentication.type` | The type of authentication for Hadoop catalog, currently we only support `kerberos`, `simple`. | `simple` | No | 0.5.1 | | `authentication.impersonation-enable` | Whether to enable impersonation for the Hadoop catalog. | `false` | No | 0.5.1 | @@ -48,7 +48,7 @@ The Hadoop catalog supports creating, updating, deleting, and listing schema. ### Schema properties | Property name | Description | Default value | Required | Since Version | -|---------------|------------------------------------------------|---------------|----------|---------------| +| ------------- | ---------------------------------------------- | ------------- | -------- | ------------- | | `location` | The storage location managed by Hadoop schema. | (none) | No | 0.5.0 | ### Schema operations diff --git a/docs/how-to-build.md b/docs/how-to-build.md index 4a1f12b87d9..7d0811657c9 100644 --- a/docs/how-to-build.md +++ b/docs/how-to-build.md @@ -10,64 +10,64 @@ license: "This software is licensed under the Apache License version 2." ## Prerequisites -+ Linux or macOS operating system -+ Git -+ A Java Development Kit, version 8 to 17, installed in your environment to launch Gradle -+ Python 3.8, 3.9, 3.10, or 3.11 to build the Gravitino Python client -+ Optionally, Docker to run integration tests +- Linux or macOS operating system +- Git +- A Java Development Kit, version 8 to 17, installed in your environment to launch Gradle +- Python 3.8, 3.9, 3.10, or 3.11 to build the Gravitino Python client +- Optionally, Docker to run integration tests :::info Please read the following notes before trying to build Gravitino. -+ Gravitino requires at least JDK8 and at most JDK17 to run Gradle, so you need to +- Gravitino requires at least JDK8 and at most JDK17 to run Gradle, so you need to install a JDK, versions 8 to 17, to launch the build environment. -+ Gravitino itself supports using JDK8, 11, and 17 to build. The Gravitino Trino connector uses +- Gravitino itself supports using JDK8, 11, and 17 to build. The Gravitino Trino connector uses JDK17 to build (to avoid vendor-related issues on some platforms, Gravitino uses the specified Amazon Corretto OpenJDK 17 to build the Trino connector on macOS). You don't have to preinstall the specified JDK environment, as Gradle detects the JDK version needed and downloads it automatically. -+ Gravitino uses the Gradle Java Toolchain to detect and manage JDK versions, it checks the +- Gravitino uses the Gradle Java Toolchain to detect and manage JDK versions, it checks the installed JDK by running the `./gradlew javaToolchains` command. See [Gradle Java Toolchain](https://docs.gradle.org/current/userguide/toolchains.html#sec:java_toolchain). -+ Gravitino excludes all Docker-related tests by default. To run Docker related tests, make sure you have installed +- Gravitino excludes all Docker-related tests by default. To run Docker related tests, make sure you have installed Docker in your environment and either (1) set `skipDockerTests=false` in the `gradle.properties` file (or use `-PskipDockerTests=false` in the command) or (2) `export SKIP_DOCKER_TESTS=false` in shell. Otherwise, all Docker required tests will skip. -+ macOS uses `docker-connector` to make the Gravitino Trino connector work with Docker +- macOS uses `docker-connector` to make the Gravitino Trino connector work with Docker for macOS. See [docker-connector](https://github.com/wenjunxiao/mac-docker-connector), `$GRAVITINO_HOME/dev/docker/tools/mac-docker-connector.sh`, and `$GRAVITINO_HOME/dev/docker/tools/README.md` for more details. -+ You can use OrbStack as a replacement for Docker for macOS. See +- You can use OrbStack as a replacement for Docker for macOS. See [OrbStack](https://orbstack.dev/). With OrbStack you can run Gravitino integration tests without needing to install `docker-connector`. -::: + ::: ## Quick start 1. Clone the Gravitino project. - If you want to contribute to this open-source project, please fork the project on GitHub first. After forking, clone the forked project to your local environment, make your changes, and submit a pull request (PR). + If you want to contribute to this open-source project, please fork the project on GitHub first. After forking, clone the forked project to your local environment, make your changes, and submit a pull request (PR). - ```shell - git clone git@github.com:apache/gravitino.git - ``` + ```shell + git clone git@github.com:apache/gravitino.git + ``` 2. Build the Gravitino project. - ```shell - cd gravitino - ./gradlew build - ``` + ```shell + cd gravitino + ./gradlew build + ``` - The default specified JDK version is 8, if you want to use JDK 11 or 17 to build, - modify the property `jdkVersion` to 11 or 17 in the `gradle.properties` file, or specify the version - with `-P`, like: + The default specified JDK version is 8, if you want to use JDK 11 or 17 to build, + modify the property `jdkVersion` to 11 or 17 in the `gradle.properties` file, or specify the version + with `-P`, like: - ```shell - ./gradlew build -PjdkVersion=11 - ``` + ```shell + ./gradlew build -PjdkVersion=11 + ``` - Or: + Or: - ```shell - ./gradlew build -PjdkVersion=17 - ``` + ```shell + ./gradlew build -PjdkVersion=17 + ``` - The `./gradlew build` command builds all the Gravitino components, including Gravitino + The `./gradlew build` command builds all the Gravitino components, including Gravitino server, Java and Python client, Trino and Spark connectors, and more. For Python client, the `./gradlew build` command builds the Python client with Python 3.8 @@ -75,32 +75,32 @@ license: "This software is licensed under the Apache License version 2." `pythonVersion` to 3.9, 3.10 or 3.11 in the `gradle.properties` file, or specify the version with `-P`, like: - ```shell - ./gradlew build -PpythonVersion=3.9 - ``` + ```shell + ./gradlew build -PpythonVersion=3.9 + ``` Or: - ```shell - ./gradlew build -PpythonVersion=3.10 - ``` + ```shell + ./gradlew build -PpythonVersion=3.10 + ``` Or: - ```shell - ./gradlew build -PpythonVersion=3.11 - ``` - - If you want to build some modules alone, like Spark connector, you can use Gradle build task + ```shell + ./gradlew build -PpythonVersion=3.11 + ``` + + If you want to build some modules alone, like Spark connector, you can use Gradle build task with specific module name, like: - ```shell - ./gradlew spark-connector:spark-runtime-3.4:build -PscalaVersion=2.12 - ``` + ```shell + ./gradlew spark-connector:spark-runtime-3.4:build -PscalaVersion=2.12 + ``` This creates `gravitino-spark-connector-runtime-{sparkVersion}_{scalaVersion}-{version}.jar` - under the `spark-connector/v3.4/spark-runtime/build/libs` directory. You could replace `3.4` with - `3.3` or `3.5` to specify different Spark versions, and replace `2.12` with `2.13` for different Scala + under the `spark-connector/v3.4/spark-runtime/build/libs` directory. You could replace `3.4` with + `3.3` or `3.5` to specify different Spark versions, and replace `2.12` with `2.13` for different Scala versions. The default Scala version is `2.12` if not specifying `-PscalaVersion`. :::info @@ -110,7 +110,7 @@ license: "This software is licensed under the Apache License version 2." :::note The first time you build the project, downloading the dependencies may take a while. You can add `-x test` to skip the tests, by using `./gradlew build -x test`. - + The built Gravitino libraries are Java 8 compatible, and verified under Java 8, 11, and 17 environments. You can use Java 8, 11, 17 runtimes to run the Gravitino server, no matter which JDK version you use to build the project. @@ -121,9 +121,9 @@ license: "This software is licensed under the Apache License version 2." 3. Get the Gravitino server binary package. - ```shell - ./gradlew compileDistribution - ``` + ```shell + ./gradlew compileDistribution + ``` The `compileDistribution` command creates a `distribution` directory in the Gravitino root directory. @@ -135,9 +135,9 @@ license: "This software is licensed under the Apache License version 2." 4. Assemble the Gravitino server distribution package. - ```shell - ./gradlew assembleDistribution - ``` + ```shell + ./gradlew assembleDistribution + ``` The `assembleDistribution` command creates `gravitino-{version}-bin.tar.gz` and `gravitino-{version}-bin.tar.gz.sha256` under the `distribution` directory. @@ -153,16 +153,16 @@ license: "This software is licensed under the Apache License version 2." ```shell ./gradlew assembleTrinoConnector - ``` + ``` or - ```shell - ./gradlew assembleDistribution - ``` + ```shell + ./gradlew assembleDistribution + ``` This creates `gravitino-trino-connector-{version}.tar.gz` and - `gravitino-trino-connector-{version}.tar.gz.sha256` under the `distribution` directory. You + `gravitino-trino-connector-{version}.tar.gz.sha256` under the `distribution` directory. You can uncompress and deploy it to Trino to use the Gravitino Trino connector. ## How to Build Apache Gravitino on Windows (Using WSL) @@ -173,7 +173,7 @@ license: "This software is licensed under the Apache License version 2." Refer to this guide for installation: [WSL Installation Guide](https://learn.microsoft.com/en-us/windows/wsl/install) -*Note: Ubuntu 22.04 can successfully run Gravitino* +_Note: Ubuntu 22.04 can successfully run Gravitino_ This step involves setting up the Windows Subsystem for Linux (WSL) on your Windows machine. WSL allows you to run a Linux distribution alongside Windows, providing a Linux-like environment for development. @@ -194,22 +194,22 @@ Updating the package list ensures you have the latest information on the newest 1. Edit your `~/.bashrc` file using any editor. Here, `vim` is used: - ```shell - vim ~/.bashrc - ``` + ```shell + vim ~/.bashrc + ``` 2. Add the following lines at the end of the file. Replace `/usr/lib/jvm/java-11-openjdk-amd64` with your actual Java installation path: - ```sh - export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64" - export PATH=$PATH:$JAVA_HOME/bin - ``` + ```sh + export JAVA_HOME="/usr/lib/jvm/java-11-openjdk-amd64" + export PATH=$PATH:$JAVA_HOME/bin + ``` 3. Save and quit in vim using `:wq`. 4. Run `source ~/.bashrc` to update the `.bashrc` file in your current shell session. - Editing the `~/.bashrc` file allows you to set environment variables that will be available in every terminal session. Setting `JAVA_HOME` and updating `PATH` ensures that your system uses the correct Java version for development. + Editing the `~/.bashrc` file allows you to set environment variables that will be available in every terminal session. Setting `JAVA_HOME` and updating `PATH` ensures that your system uses the correct Java version for development. ### Install Docker diff --git a/docs/how-to-install.md b/docs/how-to-install.md index 5d9d8222805..d6fb0290247 100644 --- a/docs/how-to-install.md +++ b/docs/how-to-install.md @@ -18,12 +18,12 @@ Before installing Gravitino, make sure you have the Gravitino binary distributio download the latest Gravitino binary distribution package from [GitHub](https://github.com/apache/gravitino/releases), or you can build it yourself by following the instructions in [How to Build Gravitino](./how-to-build.md). - - If you build Gravitino yourself using the `./gradlew compileDistribution` command, you can find the -Gravitino binary distribution package in the `distribution/package` directory. +- If you build Gravitino yourself using the `./gradlew compileDistribution` command, you can find the + Gravitino binary distribution package in the `distribution/package` directory. - - If you build Gravitino yourself using the `./gradlew assembleDistribution` command, you can get the -compressed Gravitino binary distribution package with the name `gravitino--bin.tar.gz` in the -`distribution` directory with sha256 checksum file `gravitino--bin.tar.gz.sha256`. +- If you build Gravitino yourself using the `./gradlew assembleDistribution` command, you can get the + compressed Gravitino binary distribution package with the name `gravitino--bin.tar.gz` in the + `distribution` directory with sha256 checksum file `gravitino--bin.tar.gz.sha256`. The Gravitino binary distribution package contains the following files: diff --git a/docs/how-to-sign-releases.md b/docs/how-to-sign-releases.md index 8029bf53160..99838ce0412 100644 --- a/docs/how-to-sign-releases.md +++ b/docs/how-to-sign-releases.md @@ -15,7 +15,7 @@ Before signing or verifying a Gravitino release, ensure you have the following p ## Platform support - These instructions are for macOS. You may need to make adjustments for other platforms. +These instructions are for macOS. You may need to make adjustments for other platforms. 1. **How to Install GPG or GnuPG:** @@ -29,84 +29,84 @@ Before signing or verifying a Gravitino release, ensure you have the following p If GPG/GnuPG isn't installed, run the following command to install it. You only need to do this step once. - ```shell - brew install gpg - ``` + ```shell + brew install gpg + ``` ## Signing a release 1. **Create a Public/Private Key Pair:** - Check to see if you already have a public/private key pair by running the command: - - ```shell - gpg --list-secret-keys - ``` - - If you get no output, you'll need to generate a public/private key pair. - - Use this command to generate a public/private key pair. This is a one-time process. Setting the key expiry to 5 years and omitting a comment. All other defaults are acceptable. - - ```shell - gpg --full-generate-key - ``` - - Here is an example of generating a public/private key pair by using the previous command. - - ```shell - gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH - This is free software: you are free to change and redistribute it. - There is NO WARRANTY, to the extent permitted by law. - - Please select what kind of key you want: - (1) RSA and RSA - (2) DSA and Elgamal - (3) DSA (sign only) - (4) RSA (sign only) - (9) ECC (sign and encrypt) *default* - (10) ECC (sign only) - (14) Existing key from card - Your selection? - Please select which elliptic curve you want: - (1) Curve 25519 *default* - (4) NIST P-384 - (6) Brainpool P-256 - Your selection? - Please specify how long the key should be valid. - 0 = key does not expire - = key expires in n days - w = key expires in n weeks - m = key expires in n months - y = key expires in n years - Key is valid for? (0) 5y - Key expires at Mon 13 Nov 16:08:58 2028 AEDT - Is this correct? (y/N) y - - GnuPG needs to construct a user ID to identify your key. - - Real name: John Smith - Email address: john@apache.org - Comment: - You selected this USER-ID: - "John Smith " - - Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o - We need to generate a lot of random bytes. It is a good idea to perform - some other action (type on the keyboard, move the mouse, utilize the - disks) during the prime generation; this gives the random number - generator a better chance to gain enough entropy. - We need to generate a lot of random bytes. It is a good idea to perform - some other action (type on the keyboard, move the mouse, utilize the - disks) during the prime generation; this gives the random number - generator a better chance to gain enough entropy. - gpg: revocation certificate stored as '/Users/justin/.gnupg/openpgp-revocs.d/CC6BD9B0A3A31A7ACFF9E1383DF672F671B7F722.rev' - public and secret key created and signed. - - pub ed25519 2023-11-15 [SC] [expires: 2028-11-13] - CC6BD9B0A3A31A7ACFF9E1383DF672F671B7F722 - uid John Smith - sub cv25519 2023-11-15 [E] [expires: 2028-11-13] - ``` + Check to see if you already have a public/private key pair by running the command: + + ```shell + gpg --list-secret-keys + ``` + + If you get no output, you'll need to generate a public/private key pair. + + Use this command to generate a public/private key pair. This is a one-time process. Setting the key expiry to 5 years and omitting a comment. All other defaults are acceptable. + + ```shell + gpg --full-generate-key + ``` + + Here is an example of generating a public/private key pair by using the previous command. + + ```shell + gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH + This is free software: you are free to change and redistribute it. + There is NO WARRANTY, to the extent permitted by law. + + Please select what kind of key you want: + (1) RSA and RSA + (2) DSA and Elgamal + (3) DSA (sign only) + (4) RSA (sign only) + (9) ECC (sign and encrypt) *default* + (10) ECC (sign only) + (14) Existing key from card + Your selection? + Please select which elliptic curve you want: + (1) Curve 25519 *default* + (4) NIST P-384 + (6) Brainpool P-256 + Your selection? + Please specify how long the key should be valid. + 0 = key does not expire + = key expires in n days + w = key expires in n weeks + m = key expires in n months + y = key expires in n years + Key is valid for? (0) 5y + Key expires at Mon 13 Nov 16:08:58 2028 AEDT + Is this correct? (y/N) y + + GnuPG needs to construct a user ID to identify your key. + + Real name: John Smith + Email address: john@apache.org + Comment: + You selected this USER-ID: + "John Smith " + + Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o + We need to generate a lot of random bytes. It is a good idea to perform + some other action (type on the keyboard, move the mouse, utilize the + disks) during the prime generation; this gives the random number + generator a better chance to gain enough entropy. + We need to generate a lot of random bytes. It is a good idea to perform + some other action (type on the keyboard, move the mouse, utilize the + disks) during the prime generation; this gives the random number + generator a better chance to gain enough entropy. + gpg: revocation certificate stored as '/Users/justin/.gnupg/openpgp-revocs.d/CC6BD9B0A3A31A7ACFF9E1383DF672F671B7F722.rev' + public and secret key created and signed. + + pub ed25519 2023-11-15 [SC] [expires: 2028-11-13] + CC6BD9B0A3A31A7ACFF9E1383DF672F671B7F722 + uid John Smith + sub cv25519 2023-11-15 [E] [expires: 2028-11-13] + ``` :::caution important Keep your private key secure and saved somewhere other than just on your computer. Don't forget your key password, and also securely record it somewhere. If you lose your keys or forget your password, you won't be able to sign releases. @@ -114,85 +114,85 @@ Keep your private key secure and saved somewhere other than just on your compute 2. **Sign a release:** - To sign a release, use the following command for each release file: + To sign a release, use the following command for each release file: - ```shell - gpg --detach-sign --armor .[zip|tar.gz] - ``` + ```shell + gpg --detach-sign --armor .[zip|tar.gz] + ``` - For example, to sign the Gravitino 0.2.0 release you would use this command. + For example, to sign the Gravitino 0.2.0 release you would use this command. - ```shell - gpg --detach-sign --armor gravitino.0.2.0.zip - ``` + ```shell + gpg --detach-sign --armor gravitino.0.2.0.zip + ``` This generates an .asc file containing a PGP signature. Anyone can use this file and your public signature to verify the release. 3. **Generate hashes for a release:** - Use the following command to generate hashes for a release: + Use the following command to generate hashes for a release: - ```shell - shasum -a 256 .[zip|tar.gz] > .[zip|tar.gz].sha256 - ``` + ```shell + shasum -a 256 .[zip|tar.gz] > .[zip|tar.gz].sha256 + ``` - For example, to generate a hash for the Gravitino 0.2.0 release you would use this command: + For example, to generate a hash for the Gravitino 0.2.0 release you would use this command: - ```shell - shasum -a 256 gravitino.0.2.0.zip > gravitino.0.2.0.zip.sha256 - ``` + ```shell + shasum -a 256 gravitino.0.2.0.zip > gravitino.0.2.0.zip.sha256 + ``` 4. **Copy your public key to the KEYS file:** - The KEYS file contains public keys used to sign previous releases. You only need to do this step once. Execute the following command to copy your public key to a KEY file and then append your KEY to the KEYS file. The KEYS file contains all the public keys used to sign previous releases. + The KEYS file contains public keys used to sign previous releases. You only need to do this step once. Execute the following command to copy your public key to a KEY file and then append your KEY to the KEYS file. The KEYS file contains all the public keys used to sign previous releases. - ```shell - gpg --output KEY --armor --export - cat KEY >> KEYS - ``` + ```shell + gpg --output KEY --armor --export + cat KEY >> KEYS + ``` 5. **Publish hashes and signatures:** - Upload the generated .asc and .sha256 files along with the release artifacts and KEYS file to the release area. + Upload the generated .asc and .sha256 files along with the release artifacts and KEYS file to the release area. ## Verifying a release 1. **Import public keys:** - Download the KEYS file. Import the public keys used to sign all previous releases with this command. It doesn't matter if you have already imported the keys. + Download the KEYS file. Import the public keys used to sign all previous releases with this command. It doesn't matter if you have already imported the keys. - ```shell - gpg --import KEYS - ``` + ```shell + gpg --import KEYS + ``` 2. **Verify the signature:** - Download the .asc and release files. Use the following command to verify the signature: + Download the .asc and release files. Use the following command to verify the signature: - ```shell - gpg --verify .[zip|tar.gz].asc - ``` + ```shell + gpg --verify .[zip|tar.gz].asc + ``` - The output should contain the text "Good signature from ...". + The output should contain the text "Good signature from ...". - For example to verify the Gravitino 0.2.0 zip file you would use this command: + For example to verify the Gravitino 0.2.0 zip file you would use this command: - ```shell - gpg --verify gravitino.0.2.0.zip.asc - ``` + ```shell + gpg --verify gravitino.0.2.0.zip.asc + ``` 3. **Verify the hashes:** - Check if the hashes match, using the following command: + Check if the hashes match, using the following command: - ```shell - diff -u .[zip|tar.gz].sha256 <(shasum -a 256 .[zip|tar.gz]) - ``` + ```shell + diff -u .[zip|tar.gz].sha256 <(shasum -a 256 .[zip|tar.gz]) + ``` - For example to verify the Gravitino 2.0 zip file you would use this command: + For example to verify the Gravitino 2.0 zip file you would use this command: - ```shell - diff -u gravitino.0.2.0.zip.sha256 <(shasum -a 256 gravitino.0.2.0.zip) - ``` + ```shell + diff -u gravitino.0.2.0.zip.sha256 <(shasum -a 256 gravitino.0.2.0.zip) + ``` - This command ensures that the signatures match and that there are no differences between them. + This command ensures that the signatures match and that there are no differences between them. diff --git a/docs/how-to-test.md b/docs/how-to-test.md index 60cf0244979..f6160fb0ba8 100644 --- a/docs/how-to-test.md +++ b/docs/how-to-test.md @@ -6,21 +6,22 @@ license: "This software is licensed under the Apache License version 2." Apache Gravitino has two types of tests: - - Unit tests, focus on the functionalities of the specific class, module, or component. - - Integration tests, end-to-end tests that cover the whole system. +- Unit tests, focus on the functionalities of the specific class, module, or component. +- Integration tests, end-to-end tests that cover the whole system. :::note before test -* If you want to run the complete integration test suites, you need to install Docker in your + +- If you want to run the complete integration test suites, you need to install Docker in your environment. -* Refer to [How to build Gravitino](./how-to-build.md) to make sure you have +- Refer to [How to build Gravitino](./how-to-build.md) to make sure you have a build environment ready. -* You can use [OrbStack](https://orbstack.dev/) to replace Docker Desktop +- You can use [OrbStack](https://orbstack.dev/) to replace Docker Desktop on macOS. OrbStack automatically configures the network between the Docker containers. -* If you are using Docker Desktop for macOS, launch the +- If you are using Docker Desktop for macOS, launch the [mac-docker-connector](https://github.com/wenjunxiao/mac-docker-connector) before running the tests. - Read `$GRAVITINO_HOME/dev/docker/tools/README.md` and + Read `$GRAVITINO_HOME/dev/docker/tools/README.md` and `$GRAVITINO_HOME/dev/docker/tools/mac-docker-connector.sh` for more details. -::: + ::: ## Run the unit tests @@ -37,9 +38,9 @@ This command runs all the unit tests and skips the integration tests. Gravitino has two modes to run the integration tests, the default `embedded` mode and `deploy` mode. -* In `embedded` mode, the integration test starts an embedded `MiniGravitino` server +- In `embedded` mode, the integration test starts an embedded `MiniGravitino` server within the same process as the integration test to run the integration tests. -* In `deploy` mode, you have to build (`./gradlew compileDistribution`) a Gravitino binary package beforehand. The +- In `deploy` mode, you have to build (`./gradlew compileDistribution`) a Gravitino binary package beforehand. The integration test launches and connects to the local Gravitino server to run the integration tests. @@ -68,17 +69,19 @@ To deploy the Gravitino server locally to run the integration tests, follow thes ## Skip tests -* Skip unit tests by using the `./gradlew build -PskipTests` command. -* Skip integration tests by using the `./gradlew build -PskipITs` command. -* Skip web frontend integration tests by using the `./gradlew build -PskipWebITs` command. -* Skip both unit tests and integration tests by using the `./gradlew build -x test` or `./gradlew build -PskipTests -PskipITs` commands. +- Skip unit tests by using the `./gradlew build -PskipTests` command. +- Skip integration tests by using the `./gradlew build -PskipITs` command. +- Skip web frontend integration tests by using the `./gradlew build -PskipWebITs` command. +- Skip both unit tests and integration tests by using the `./gradlew build -x test` or `./gradlew build -PskipTests -PskipITs` commands. ## Configuring parameters for integration tests + ### `DISPLAY_WEBPAGE_IN_TESTING` -By default, the Gravitino web frontend page will not pop up when running integration tests. -If you wish to display the web frontend page during integrations test, you can set the `DISPLAY_WEBPAGE_IN_TESTING` environment variable in `setIntegrationTestEnvironment` in file build.gradle.kts. + +By default, the Gravitino web frontend page will not pop up when running integration tests. +If you wish to display the web frontend page during integrations test, you can set the `DISPLAY_WEBPAGE_IN_TESTING` environment variable in `setIntegrationTestEnvironment` in file build.gradle.kts. For example: -```param.environment("DISPLAY_WEBPAGE_IN_TESTING", true)``` +`param.environment("DISPLAY_WEBPAGE_IN_TESTING", true)` ## Docker test environment @@ -103,12 +106,13 @@ public class CatalogHiveIT extends AbstractIT { ## Running all the integration tests :::note -* Make sure that the `Docker server` is running before running all the + +- Make sure that the `Docker server` is running before running all the integration tests. Otherwise, it only runs the integration tests without the `gravitino-docker-test` tag. -* On macOS, be sure to run the `${GRAVITINO_HOME}/dev/docker/tools/mac-docker-connector.sh` +- On macOS, be sure to run the `${GRAVITINO_HOME}/dev/docker/tools/mac-docker-connector.sh` script before running the integration tests; or make sure that [OrbStack](https://orbstack.dev/) is running. -::: + ::: When integration tests run, they check the whole environment and output the status of the required environment, for example: @@ -135,30 +139,30 @@ Gravitino project and set breakpoints anywhere. This mode is closer to the actual environment, but more complex to debug. To debug the Gravitino server code, follow these steps: -* Run the `./gradlew build -x test` command to build the Gravitino project. -* Use the `./gradlew compileDistribution` command to republish the packaged project in the `distribution` directory. -* If you are only debugging integration test codes, You don't have to do any setup to debug directly. -* If you need to debug Gravitino server codes, follow these steps: - * Enable the `GRAVITINO_DEBUG_OPTS` environment variable in the - `distribution/package/conf/gravitino-env.sh` file to enable remote JVM debugging. - * Manually start the Gravitino server using the `./distribution/package/bin/gravitino.sh - start` command. - * Select the `gravitino.server.main` module classpath in the `Remote JVM Debug` to attach the - Gravitino server process and debug it. +- Run the `./gradlew build -x test` command to build the Gravitino project. +- Use the `./gradlew compileDistribution` command to republish the packaged project in the `distribution` directory. +- If you are only debugging integration test codes, You don't have to do any setup to debug directly. +- If you need to debug Gravitino server codes, follow these steps: + - Enable the `GRAVITINO_DEBUG_OPTS` environment variable in the + `distribution/package/conf/gravitino-env.sh` file to enable remote JVM debugging. + - Manually start the Gravitino server using the `./distribution/package/bin/gravitino.sh +start` command. + - Select the `gravitino.server.main` module classpath in the `Remote JVM Debug` to attach the + Gravitino server process and debug it. ## Running on GitHub actions -* GitHub Actions automatically run integration tests in the embedded and deploy modes when you +- GitHub Actions automatically run integration tests in the embedded and deploy modes when you submit a pull request. -* View the test results in the `Actions` tab of the pull request page. -* Run the integration tests in several steps: - * The Gravitino integration tests pull the CI Docker image from the Docker Hub repository. This step typically takes around 15 seconds. - * The Gravitino project compiles and packages in the `distribution` directory using the `./gradlew compileDistribution` command. - * Run the `./gradlew test -PtestMode=[embedded|deploy]` command. +- View the test results in the `Actions` tab of the pull request page. +- Run the integration tests in several steps: + - The Gravitino integration tests pull the CI Docker image from the Docker Hub repository. This step typically takes around 15 seconds. + - The Gravitino project compiles and packages in the `distribution` directory using the `./gradlew compileDistribution` command. + - Run the `./gradlew test -PtestMode=[embedded|deploy]` command. ## Test failure and test log -If a test fails, you can retrieve valuable information from the logs and test reports. Test reports are in the `./build/reports` directory. The integration test logs are in the `./integrate-test/build` directory. In deploy mode, Gravitino server logs are in the `./distribution/package/logs/` directory. +If a test fails, you can retrieve valuable information from the logs and test reports. Test reports are in the `./build/reports` directory. The integration test logs are in the `./integrate-test/build` directory. In deploy mode, Gravitino server logs are in the `./distribution/package/logs/` directory. In the event of a test failure within the GitHub workflow, the system generates archived logs and test reports. To obtain the archive, follow these steps: diff --git a/docs/how-to-upgrade.md b/docs/how-to-upgrade.md index 87401f328f3..cf12ba0d1a5 100644 --- a/docs/how-to-upgrade.md +++ b/docs/how-to-upgrade.md @@ -5,6 +5,7 @@ license: "This software is licensed under the Apache License version 2." --- ## Introduction + This document describes how to upgrade the schema of backed Gravitino instance from one release version of Gravitino to another release version of Gravitino. For example, by following the steps listed @@ -16,15 +17,17 @@ document and familiarize yourself with the required tools. ## Upgrade Steps ### Step 1: Shutdown your Gravitino instance + Shutdown your Gravitino instance and restrict access to the Apache Gravitino's database. It is very important that no one else accesses or modifies the contents of database while you are performing the schema upgrade. ### Step 2: Backup your Gravitino instance + Create a backup of your database. This will allow you to revert any changes made during the upgrade process if -something goes wrong. +something goes wrong. #### MySQL @@ -33,17 +36,21 @@ For MySQL, you can use the following command to backup your database: ```shell mysqldump --opt > backup.sql ``` + Note that you may also need to specify a hostname and username using the `--host` and `--user` command line switches. #### H2 + The easiest way of accomplishing this task is by creating a copy of the directory containing your database. ### Step 3: Dump your Gravitino database + Dump your Gravitino database schema to a file #### MySQL + You can use the mysqldump utility to dump the database schema to a file: ```shell @@ -51,16 +58,18 @@ mysqldump --skip-add-drop-table --no-data > schema-x.y.z-mysql.sql ``` #### H2 + For H2, you can use the `Script` tool to dump the database schema to a file: ```shell wget https://repo1.maven.org/maven2/com/h2database/h2/1.4.200/h2-1.4.200.jar java -cp h2-1.4.200.jar org.h2.tools.Script -url "jdbc:h2:file:;DB_CLOSE_DELAY=-1;MODE=MYSQL" -user -password -script backup.sql ``` -Note that you may need to specify your h2 file path, username and password +Note that you may need to specify your h2 file path, username and password ### Step 4: Determine differences between your schema and the official schema + The schema upgrade scripts assume that the schema you are upgrading closely matches the official schema for your particular version of Gravitino. The files in this directory with names like @@ -73,6 +82,7 @@ with the upgrade process, but others need to be resolved manually or the upgrade scripts will fail to complete. ### Step 5: Apply the upgrade scripts + You are now ready to run the schema upgrade scripts. If you are upgrading from Gravitino 0.6.0 to Gravitino 0.7.0 you need to run the `upgrade-0.6.0-to-0.7.0-.sql` script, but if you are upgrading @@ -80,6 +90,7 @@ from 0.6.0 to 0.8.0 you will need to run the 0.6.0 to 0.7.0 upgrade script followed by the 0.7.0 to 0.8.0 upgrade script. #### MySQL + Assuming you are upgrading the version of Gravitino server from 0.6.0 to 0.8.0 ```shell @@ -89,7 +100,9 @@ Database changed mysql> source upgrade-0.6.0-to-0.7.0-mysql.sql mysql> source upgrade-0.7.0-to-0.8.0-mysql.sql ``` + #### H2 + For H2, you can use the `RunScript` tool to apply the upgrade script: ```shell @@ -102,10 +115,11 @@ do encounter errors you need to analyze the cause and attempt to trace it back to one of the preceding steps. ### Step 6: Verify the upgrade + The final step of the upgrade process is validating your freshly upgraded schema against the official schema for your particular version of Gravitino. This is accomplished by repeating steps (3) and (4), but this time comparing against the official version of the upgraded schema, e.g. if you upgraded the schema to Gravitino 0.8.0 then you will want to compare your schema dump against the contents of -`schema-0.8.0-.sql` \ No newline at end of file +`schema-0.8.0-.sql` diff --git a/docs/how-to-use-gvfs.md b/docs/how-to-use-gvfs.md index 96c7d449500..f913711ab2d 100644 --- a/docs/how-to-use-gvfs.md +++ b/docs/how-to-use-gvfs.md @@ -12,9 +12,10 @@ details, you can read [How to manage fileset metadata using Gravitino](./manage- To use `Fileset` managed by Gravitino, Gravitino provides a virtual file system layer called the Gravitino Virtual File System (GVFS): -* In Java, it's built on top of the Hadoop Compatible File System(HCFS) interface. -* In Python, it's built on top of the [fsspec](https://filesystem-spec.readthedocs.io/en/stable/index.html) -interface. + +- In Java, it's built on top of the Hadoop Compatible File System(HCFS) interface. +- In Python, it's built on top of the [fsspec](https://filesystem-spec.readthedocs.io/en/stable/index.html) + interface. GVFS is a virtual layer that manages the files and directories in the fileset through a virtual path, without needing to understand the specific storage details of the fileset. You can access @@ -42,7 +43,7 @@ the path mapping and convert automatically. ### Prerequisites -+ A Hadoop environment with HDFS running. GVFS has been tested against +- A Hadoop environment with HDFS running. GVFS has been tested against Hadoop 3.1.0. It is recommended to use Hadoop 3.1.0 or later, but it should work with Hadoop 2. x. Please create an [issue](https://www.github.com/apache/gravitino/issues) if you find any compatibility issues. @@ -50,9 +51,9 @@ the path mapping and convert automatically. ### Configuration | Configuration item | Description | Default value | Required | Since version | -|-------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|-------------------------------------|---------------| -| `fs.AbstractFileSystem.gvfs.impl` | The Gravitino Virtual File System abstract class, set it to `org.apache.gravitino.filesystem.hadoop.Gvfs`. | (none) | Yes | 0.5.0 | -| `fs.gvfs.impl` | The Gravitino Virtual File System implementation class, set it to `org.apache.gravitino.filesystem.hadoop.GravitinoVirtualFileSystem`. | (none) | Yes | 0.5.0 | +| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | ----------------------------------- | ------------- | +| `fs.AbstractFileSystem.gvfs.impl` | The Gravitino Virtual File System abstract class, set it to `org.apache.gravitino.filesystem.hadoop.Gvfs`. | (none) | Yes | 0.5.0 | +| `fs.gvfs.impl` | The Gravitino Virtual File System implementation class, set it to `org.apache.gravitino.filesystem.hadoop.GravitinoVirtualFileSystem`. | (none) | Yes | 0.5.0 | | `fs.gvfs.impl.disable.cache` | Disable the Gravitino Virtual File System cache in the Hadoop environment. If you need to proxy multi-user operations, please set this value to `true` and create a separate File System for each user. | `false` | No | 0.5.0 | | `fs.gravitino.server.uri` | The Gravitino server URI which GVFS needs to load the fileset metadata. | (none) | Yes | 0.5.0 | | `fs.gravitino.client.metalake` | The metalake to which the fileset belongs. | (none) | Yes | 0.5.0 | @@ -64,45 +65,45 @@ the path mapping and convert automatically. | `fs.gravitino.client.kerberos.principal` | The auth principal for the Gravitino client when using `kerberos` auth type with the Gravitino Virtual File System. | (none) | Yes if you use `kerberos` auth type | 0.5.1 | | `fs.gravitino.client.kerberos.keytabFilePath` | The auth keytab file path for the Gravitino client when using `kerberos` auth type in the Gravitino Virtual File System. | (none) | No | 0.5.1 | | `fs.gravitino.fileset.cache.maxCapacity` | The cache capacity of the Gravitino Virtual File System. | `20` | No | 0.5.0 | -| `fs.gravitino.fileset.cache.evictionMillsAfterAccess` | The value of time that the cache expires after accessing in the Gravitino Virtual File System. The value is in `milliseconds`. | `3600000` | No | 0.5.0 | +| `fs.gravitino.fileset.cache.evictionMillsAfterAccess` | The value of time that the cache expires after accessing in the Gravitino Virtual File System. The value is in `milliseconds`. | `3600000` | No | 0.5.0 | You can configure these properties in two ways: 1. Before obtaining the `FileSystem` in the code, construct a `Configuration` object and set its properties: - ```java - Configuration conf = new Configuration(); - conf.set("fs.AbstractFileSystem.gvfs.impl","org.apache.gravitino.filesystem.hadoop.Gvfs"); - conf.set("fs.gvfs.impl","org.apache.gravitino.filesystem.hadoop.GravitinoVirtualFileSystem"); - conf.set("fs.gravitino.server.uri","http://localhost:8090"); - conf.set("fs.gravitino.client.metalake","test_metalake"); - Path filesetPath = new Path("gvfs://fileset/test_catalog/test_schema/test_fileset_1"); - FileSystem fs = filesetPath.getFileSystem(conf); - ``` + ```java + Configuration conf = new Configuration(); + conf.set("fs.AbstractFileSystem.gvfs.impl","org.apache.gravitino.filesystem.hadoop.Gvfs"); + conf.set("fs.gvfs.impl","org.apache.gravitino.filesystem.hadoop.GravitinoVirtualFileSystem"); + conf.set("fs.gravitino.server.uri","http://localhost:8090"); + conf.set("fs.gravitino.client.metalake","test_metalake"); + Path filesetPath = new Path("gvfs://fileset/test_catalog/test_schema/test_fileset_1"); + FileSystem fs = filesetPath.getFileSystem(conf); + ``` 2. Configure the properties in the `core-site.xml` file of the Hadoop environment: - ```xml - - fs.AbstractFileSystem.gvfs.impl - org.apache.gravitino.filesystem.hadoop.Gvfs - - - - fs.gvfs.impl - org.apache.gravitino.filesystem.hadoop.GravitinoVirtualFileSystem - - - - fs.gravitino.server.uri - http://localhost:8090 - - - - fs.gravitino.client.metalake - test_metalake - - ``` + ```xml + + fs.AbstractFileSystem.gvfs.impl + org.apache.gravitino.filesystem.hadoop.Gvfs + + + + fs.gvfs.impl + org.apache.gravitino.filesystem.hadoop.GravitinoVirtualFileSystem + + + + fs.gravitino.server.uri + http://localhost:8090 + + + + fs.gravitino.client.metalake + test_metalake + + ``` ### Usage examples @@ -117,9 +118,9 @@ two ways: Download or clone the [Gravitino source code](https://github.com/apache/gravitino), and compile it locally using the following command in the Gravitino source code directory: - ```shell - ./gradlew :clients:filesystem-hadoop3-runtime:build -x test - ``` + ```shell + ./gradlew :clients:filesystem-hadoop3-runtime:build -x test + ``` #### Via Hadoop shell command @@ -164,41 +165,40 @@ fs.getFileStatus(filesetPath); 1. Add the GVFS runtime jar to the Spark environment. - You can use `--packages` or `--jars` in the Spark submit shell to include the Gravitino Virtual - File System runtime jar, like so: + You can use `--packages` or `--jars` in the Spark submit shell to include the Gravitino Virtual + File System runtime jar, like so: - ```shell - ./${SPARK_HOME}/bin/spark-submit --packages org.apache.gravitino:filesystem-hadoop3-runtime:${version} - ``` + ```shell + ./${SPARK_HOME}/bin/spark-submit --packages org.apache.gravitino:filesystem-hadoop3-runtime:${version} + ``` - If you want to include the Gravitino Virtual File System runtime jar in your Spark installation, add it to the `${SPARK_HOME}/jars/` folder. + If you want to include the Gravitino Virtual File System runtime jar in your Spark installation, add it to the `${SPARK_HOME}/jars/` folder. 2. Configure the Hadoop configuration when submitting the job. - You can configure in the shell command in this way: + You can configure in the shell command in this way: - ```shell - --conf spark.hadoop.fs.AbstractFileSystem.gvfs.impl=org.apache.gravitino.filesystem.hadoop.Gvfs - --conf spark.hadoop.fs.gvfs.impl=org.apache.gravitino.filesystem.hadoop.GravitinoVirtualFileSystem - --conf spark.hadoop.fs.gravitino.server.uri=${your_gravitino_server_uri} - --conf spark.hadoop.fs.gravitino.client.metalake=${your_gravitino_metalake} - ``` + ```shell + --conf spark.hadoop.fs.AbstractFileSystem.gvfs.impl=org.apache.gravitino.filesystem.hadoop.Gvfs + --conf spark.hadoop.fs.gvfs.impl=org.apache.gravitino.filesystem.hadoop.GravitinoVirtualFileSystem + --conf spark.hadoop.fs.gravitino.server.uri=${your_gravitino_server_uri} + --conf spark.hadoop.fs.gravitino.client.metalake=${your_gravitino_metalake} + ``` 3. Perform operations on the fileset storage in your code. - Finally, you can access the fileset storage in your Spark program: - - ```scala - // Scala code - val spark = SparkSession.builder() - .appName("Gvfs Example") - .getOrCreate() + Finally, you can access the fileset storage in your Spark program: - val rdd = spark.sparkContext.textFile("gvfs://fileset/test_catalog/test_schema/test_fileset_1") + ```scala + // Scala code + val spark = SparkSession.builder() + .appName("Gvfs Example") + .getOrCreate() - rdd.foreach(println) - ``` + val rdd = spark.sparkContext.textFile("gvfs://fileset/test_catalog/test_schema/test_fileset_1") + rdd.foreach(println) + ``` #### Via Tensorflow @@ -206,9 +206,9 @@ For Tensorflow to support GVFS, you need to recompile the [tensorflow-io](https: 1. First, add a patch and recompile tensorflow-io. - You need to add a [patch](https://github.com/tensorflow/io/pull/1970) to support GVFS on - tensorflow-io. Then you can follow the [tutorial](https://github.com/tensorflow/io/blob/master/docs/development.md) - to recompile your code and release the tensorflow-io module. + You need to add a [patch](https://github.com/tensorflow/io/pull/1970) to support GVFS on + tensorflow-io. Then you can follow the [tutorial](https://github.com/tensorflow/io/blob/master/docs/development.md) + to recompile your code and release the tensorflow-io module. 2. Then you need to configure the Hadoop configuration. @@ -322,11 +322,11 @@ FileSystem fs = filesetPath.getFileSystem(conf); ### Prerequisites -+ A Hadoop environment with HDFS running. Now we only supports Fileset on HDFS. +- A Hadoop environment with HDFS running. Now we only supports Fileset on HDFS. GVFS in Python has been tested against Hadoop 2.7.3. It is recommended to use Hadoop 2.7.3 or later, it should work with Hadoop 3.x. Please create an [issue](https://www.github.com/apache/gravitino/issues) if you find any compatibility issues. -+ Python version >= 3.8. It has been tested GVFS works well with Python 3.8 and Python 3.9. +- Python version >= 3.8. It has been tested GVFS works well with Python 3.8 and Python 3.9. Your Python version should be at least higher than Python 3.8. Attention: If you are using macOS or Windows operating system, you need to follow the steps in the @@ -336,13 +336,12 @@ to recompile the native libraries like `libhdfs` and others, and completely repl ### Configuration | Configuration item | Description | Default value | Required | Since version | -|----------------------|----------------------------------------------------------------------------------------------------------------------------------------------|---------------|----------|---------------| -| `server_uri` | The Gravitino server uri, e.g. `http://localhost:8090`. | (none) | Yes | 0.6.0 |. | (none) | Yes | 0.6.0 | -| `metalake_name` | The metalake name which the fileset belongs to. | (none) | Yes | 0.6.0 |. | (none) | Yes | 0.6.0 | . | (none) | Yes | 0.6.0 | -| `cache_size` | The cache capacity of the Gravitino Virtual File System. | `20` | No | 0.6.0 |. | (none) | Yes | 0.6.0 | . | (none) | Yes | 0.6.0 | -| `cache_expired_time` | The value of time that the cache expires after accessing in the Gravitino Virtual File System. The value is in `seconds`. | `3600` | No | 0.6.0 |. -| `auth_type` | The auth type to initialize the Gravitino client to use with the Gravitino Virtual File System. Currently only supports `simple` auth types. | `simple` | No | 0.6.0 |. - +| -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------- | ------------- | --- | ------ | --- | ----- | --- | ------ | --- | ----- | +| `server_uri` | The Gravitino server uri, e.g. `http://localhost:8090`. | (none) | Yes | 0.6.0 | . | (none) | Yes | 0.6.0 | +| `metalake_name` | The metalake name which the fileset belongs to. | (none) | Yes | 0.6.0 | . | (none) | Yes | 0.6.0 | . | (none) | Yes | 0.6.0 | +| `cache_size` | The cache capacity of the Gravitino Virtual File System. | `20` | No | 0.6.0 | . | (none) | Yes | 0.6.0 | . | (none) | Yes | 0.6.0 | +| `cache_expired_time` | The value of time that the cache expires after accessing in the Gravitino Virtual File System. The value is in `seconds`. | `3600` | No | 0.6.0 | . | +| `auth_type` | The auth type to initialize the Gravitino client to use with the Gravitino Virtual File System. Currently only supports `simple` auth types. | `simple` | No | 0.6.0 | . | You can configure these properties when obtaining the `Gravitino Virtual FileSystem` in Python like this: @@ -361,37 +360,37 @@ fs = gvfs.GravitinoVirtualFileSystem(server_uri="http://localhost:8090", metalak 1. Make sure to obtain the Gravitino library. You can get it by [pip](https://pip.pypa.io/en/stable/installation/): - ```shell - pip install gravitino - ``` + ```shell + pip install gravitino + ``` 2. Configuring the Hadoop environment. You should ensure that the Python client has Kerberos authentication information and configure Hadoop environments in the system environment: - ```shell - # kinit kerberos - kinit -kt /tmp/xxx.keytab xxx@HADOOP.COM - # Or you can configure kerberos information in the Hadoop `core-site.xml` file - - hadoop.security.authentication - kerberos - - - - hadoop.client.kerberos.principal - xxx@HADOOP.COM - - - - hadoop.client.keytab.file - /tmp/xxx.keytab - - # Configure Hadoop env in Linux - export HADOOP_HOME=${YOUR_HADOOP_PATH} - export HADOOP_CONF_DIR=${YOUR_HADOOP_PATH}/etc/hadoop - export CLASSPATH=`$HADOOP_HOME/bin/hdfs classpath --glob` - ``` + ```shell + # kinit kerberos + kinit -kt /tmp/xxx.keytab xxx@HADOOP.COM + # Or you can configure kerberos information in the Hadoop `core-site.xml` file + + hadoop.security.authentication + kerberos + + + + hadoop.client.kerberos.principal + xxx@HADOOP.COM + + + + hadoop.client.keytab.file + /tmp/xxx.keytab + + # Configure Hadoop env in Linux + export HADOOP_HOME=${YOUR_HADOOP_PATH} + export HADOOP_CONF_DIR=${YOUR_HADOOP_PATH}/etc/hadoop + export CLASSPATH=`$HADOOP_HOME/bin/hdfs classpath --glob` + ``` #### Via fsspec-style interface @@ -462,6 +461,7 @@ You can also perform operations on the files or directories managed by fileset integrating with some Third-party Python libraries which support fsspec compatible filesystems. For example: + 1. Integrating with [Pandas](https://pandas.pydata.org/docs/reference/io.html)(2.0.3). ```python @@ -556,4 +556,4 @@ from gravitino import gvfs options = {"auth_type": "simple"} fs = gvfs.GravitinoVirtualFileSystem(server_uri="http://localhost:8090", metalake_name="test_metalake", options=options) print(fs.ls("gvfs://fileset/fileset_catlaog/tmp/test_fileset")) -``` \ No newline at end of file +``` diff --git a/docs/how-to-use-python-client.md b/docs/how-to-use-python-client.md index 6531cd97b29..69090b7b3ef 100644 --- a/docs/how-to-use-python-client.md +++ b/docs/how-to-use-python-client.md @@ -5,6 +5,7 @@ date: 2024-05-09 keyword: Gravitino Python client license: This software is licensed under the Apache License version 2. --- + ## Introduction Apache Gravitino is a high-performance, geo-distributed, and federated metadata lake. @@ -69,29 +70,29 @@ You can ues any IDE to develop Gravitino Python Client. Directly open the client ### Prerequisites -+ Python 3.8+ -+ Refer to [How to build Gravitino](./how-to-build.md#prerequisites) to have necessary build +- Python 3.8+ +- Refer to [How to build Gravitino](./how-to-build.md#prerequisites) to have necessary build environment ready for building. ### Build and testing 1. Clone the Gravitino project. - ```shell - git clone git@github.com:apache/gravitino.git - ``` + ```shell + git clone git@github.com:apache/gravitino.git + ``` 2. Build the Gravitino Python client module - ```shell - ./gradlew :clients:client-python:build - ``` + ```shell + ./gradlew :clients:client-python:build + ``` 3. Run unit tests - ```shell - ./gradlew :clients:client-python:test -PskipITs - ``` + ```shell + ./gradlew :clients:client-python:test -PskipITs + ``` 4. Run integration tests @@ -101,27 +102,27 @@ You can ues any IDE to develop Gravitino Python Client. Directly open the client command or IDE, Gravitino integration test framework (`integration_test_env.py`) will start and stop Gravitino server automatically. - ```shell - ./gradlew :clients:client-python:test - ``` + ```shell + ./gradlew :clients:client-python:test + ``` 5. Distribute the Gravitino Python client module - ```shell - ./gradlew :clients:client-python:distribution - ``` + ```shell + ./gradlew :clients:client-python:distribution + ``` 6. Deploy the Gravitino Python client to https://pypi.org/project/gravitino/ - ```shell - ./gradlew :clients:client-python:deploy - ``` + ```shell + ./gradlew :clients:client-python:deploy + ``` ## Resources -+ Official website https://gravitino.apache.org/ (coming soon) -+ Project home on GitHub: https://github.com/apache/gravitino/ -+ Playground with Docker: https://github.com/apache/gravitino-playground -+ User documentation: https://datastrato.ai/docs/ -+ Videos on Youtube: https://www.youtube.com/@Datastrato -+ Slack Community: [https://the-asf.slack.com +- Official website https://gravitino.apache.org/ (coming soon) +- Project home on GitHub: https://github.com/apache/gravitino/ +- Playground with Docker: https://github.com/apache/gravitino-playground +- User documentation: https://datastrato.ai/docs/ +- Videos on Youtube: https://www.youtube.com/@Datastrato +- Slack Community: [https://the-asf.slack.com diff --git a/docs/how-to-use-relational-backend-storage.md b/docs/how-to-use-relational-backend-storage.md index 0ccb57f6b87..70d2536cdea 100644 --- a/docs/how-to-use-relational-backend-storage.md +++ b/docs/how-to-use-relational-backend-storage.md @@ -26,9 +26,9 @@ default storage for `JDBCBackend`. ### Prerequisites -+ MySQL 5.7 or 8.0. -+ Gravitino distribution package. -+ MySQL connector Jar (Should be compatible with the version of MySQL instance). +- MySQL 5.7 or 8.0. +- Gravitino distribution package. +- MySQL connector Jar (Should be compatible with the version of MySQL instance). ### Step 1: Get the initialization script diff --git a/docs/how-to-use-the-playground.md b/docs/how-to-use-the-playground.md index babd1b3f582..42fcc31fe6b 100644 --- a/docs/how-to-use-the-playground.md +++ b/docs/how-to-use-the-playground.md @@ -20,7 +20,7 @@ Install Git and Docker Compose. The playground runs a number of services. The TCP ports used may clash with existing services you run, such as MySQL or Postgres. | Docker container | Ports used | -|-----------------------|----------------| +| --------------------- | -------------- | | playground-gravitino | 8090 9001 | | playground-hive | 3307 9000 9083 | | playground-mysql | 3306 | @@ -103,7 +103,7 @@ contains the following code snippets: ```shell docker exec -it playground-trino bash -```` +``` 2. Open the Trino CLI in the container. @@ -221,7 +221,7 @@ insert into customers (customer_id, customer_name, customer_email) values (12,'J ``` 2. Login Trino container and execute the steps. -You can get all the customers from both the Hive and Iceberg table. + You can get all the customers from both the Hive and Iceberg table. ```shell docker exec -it playground-trino bash diff --git a/docs/iceberg-rest-service.md b/docs/iceberg-rest-service.md index 981ca8fa229..3011ab820c9 100644 --- a/docs/iceberg-rest-service.md +++ b/docs/iceberg-rest-service.md @@ -40,7 +40,7 @@ Please refer to the following sections for details. ### REST catalog server configuration | Configuration item | Description | Default value | Required | Since Version | -|-------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|----------|---------------| +| ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | -------- | ------------- | | `gravitino.auxService.names` | The auxiliary service name of the Gravitino Iceberg REST catalog service. Use **`iceberg-rest`**. | (none) | Yes | 0.2.0 | | `gravitino.auxService.iceberg-rest.classpath` | The classpath of the Gravitino Iceberg REST catalog service; includes the directory containing jars and configuration. It supports both absolute and relative paths, for example, `catalogs/lakehouse-iceberg/libs, catalogs/lakehouse-iceberg/conf` | (none) | Yes | 0.2.0 | | `gravitino.auxService.iceberg-rest.host` | The host of the Gravitino Iceberg REST catalog service. | `0.0.0.0` | No | 0.2.0 | @@ -54,7 +54,6 @@ Please refer to the following sections for details. | `gravitino.auxService.iceberg-rest.responseHeaderSize` | The maximum size of an HTTP response. | `131072` | No | 0.2.0 | | `gravitino.auxService.iceberg-rest.customFilters` | Comma-separated list of filter class names to apply to the APIs. | (none) | No | 0.4.0 | - The filter in `customFilters` should be a standard javax servlet filter. You can also specify filter parameters by setting configuration entries in the style `gravitino.auxService.iceberg-rest..param.=`. @@ -62,35 +61,32 @@ You can also specify filter parameters by setting configuration entries in the s Gravitino provides a pluggable metrics store interface to store and delete Iceberg metrics. You can develop a class that implements `org.apache.gravitino.catalog.lakehouse.iceberg.web.metrics` and add the corresponding jar file to the Iceberg REST service classpath directory. - | Configuration item | Description | Default value | Required | Since Version | -|------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------|---------------|----------|---------------| +| ---------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------- | ------------- | | `gravitino.auxService.iceberg-rest.metricsStore` | The Iceberg metrics storage class name. | (none) | No | 0.4.0 | | `gravitino.auxService.iceberg-rest.metricsStoreRetainDays` | The days to retain Iceberg metrics in store, the value not greater than 0 means retain forever. | -1 | No | 0.4.0 | | `gravitino.auxService.iceberg-rest.metricsQueueCapacity` | The size of queue to store metrics temporally before storing to the persistent storage. Metrics will be dropped when queue is full. | 1000 | No | 0.4.0 | - ### Apache Gravitino Iceberg catalog backend configuration :::info -The Gravitino Iceberg REST catalog service uses the memory catalog backend by default. You can +The Gravitino Iceberg REST catalog service uses the memory catalog backend by default. You can specify a Hive or JDBC catalog backend for production environment. ::: #### Apache Hive backend configuration | Configuration item | Description | Default value | Required | Since Version | -|----------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------|----------|---------------| +| -------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | -------- | ------------- | | `gravitino.auxService.iceberg-rest.catalog-backend` | The Catalog backend of the Gravitino Iceberg REST catalog service. Use the value **`hive`** for a Hive catalog. | `memory` | Yes | 0.2.0 | | `gravitino.auxService.iceberg-rest.uri` | The Hive metadata address, such as `thrift://127.0.0.1:9083`. | (none) | Yes | 0.2.0 | | `gravitino.auxService.iceberg-rest.warehouse` | The warehouse directory of the Hive catalog, such as `/user/hive/warehouse-hive/`. | (none) | Yes | 0.2.0 | | `gravitino.auxService.iceberg-rest.catalog-backend-name` | The catalog backend name passed to underlying Iceberg catalog backend. Catalog name in JDBC backend is used to isolate namespace and tables. | `hive` for Hive backend, `jdbc` for JDBC backend, `memory` for memory backend | No | 0.5.2 | - #### JDBC backend configuration | Configuration item | Description | Default value | Required | Since Version | -|----------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------|-------------------------|----------|---------------| +| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------- | -------- | ------------- | | `gravitino.auxService.iceberg-rest.catalog-backend` | The Catalog backend of the Gravitino Iceberg REST catalog service. Use the value **`jdbc`** for a JDBC catalog. | `memory` | Yes | 0.2.0 | | `gravitino.auxService.iceberg-rest.uri` | The JDBC connection address, such as `jdbc:postgresql://127.0.0.1:5432` for Postgres, or `jdbc:mysql://127.0.0.1:3306/` for mysql. | (none) | Yes | 0.2.0 | | `gravitino.auxService.iceberg-rest.warehouse ` | The warehouse directory of JDBC catalog. Set the HDFS prefix if using HDFS, such as `hdfs://127.0.0.1:9000/user/hive/warehouse-jdbc` | (none) | Yes | 0.2.0 | @@ -112,7 +108,7 @@ You can add other properties defined in [Iceberg catalog properties](https://ice The `clients` property for example: | Configuration item | Description | Default value | Required | -|---------------------------------------------|--------------------------------------|---------------|----------| +| ------------------------------------------- | ------------------------------------ | ------------- | -------- | | `gravitino.auxService.iceberg-rest.clients` | The client pool size of the catalog. | `2` | No | :::info @@ -143,12 +139,12 @@ Normally you will see the output like `{"defaults":{},"overrides":{}}%`. ### Deploying Apache Spark with Apache Iceberg support -Follow the [Spark Iceberg start guide](https://iceberg.apache.org/docs/latest/getting-started/) to set up Apache Spark's and Apache Iceberg's environment. +Follow the [Spark Iceberg start guide](https://iceberg.apache.org/docs/latest/getting-started/) to set up Apache Spark's and Apache Iceberg's environment. ### Starting the Apache Spark client with the Apache Iceberg REST catalog | Configuration item | Description | -|------------------------------------------|---------------------------------------------------------------------------| +| ---------------------------------------- | ------------------------------------------------------------------------- | | `spark.sql.catalog.${catalog-name}.type` | The Spark catalog type; should set to `rest`. | | `spark.sql.catalog.${catalog-name}.uri` | Spark Iceberg REST catalog URI, such as `http://127.0.0.1:9001/iceberg/`. | diff --git a/docs/index.md b/docs/index.md index d6c9d9260fc..ba796326dbd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -36,11 +36,11 @@ and [How to use the playground](./how-to-use-the-playground.md). To get started with Gravitino, see [Getting started](./getting-started.md) for the details. -* [Getting started locally](./getting-started.md#getting-started-locally): a quick guide to starting +- [Getting started locally](./getting-started.md#getting-started-locally): a quick guide to starting and using Gravitino locally. -* [Running on Amazon Web Services](./getting-started.md#getting-started-on-amazon-web-services): a +- [Running on Amazon Web Services](./getting-started.md#getting-started-on-amazon-web-services): a quick guide to starting and using Gravitino on AWS. -* [Running on Google Cloud Platform](./getting-started.md#getting-started-on-google-cloud-platform): +- [Running on Google Cloud Platform](./getting-started.md#getting-started-on-google-cloud-platform): a quick guide to starting and using Gravitino on GCP. ## How to use Apache Gravitino @@ -48,13 +48,13 @@ To get started with Gravitino, see [Getting started](./getting-started.md) for t Gravitino provides two SDKs to manage metadata from different catalogs in a unified way: the REST API and the Java SDK. You can use either to manage metadata. See -* [Manage metalake using Gravitino](./manage-metalake-using-gravitino.md) to learn how to manage +- [Manage metalake using Gravitino](./manage-metalake-using-gravitino.md) to learn how to manage metalakes. -* [Manage relational metadata using Gravitino](./manage-relational-metadata-using-gravitino.md) +- [Manage relational metadata using Gravitino](./manage-relational-metadata-using-gravitino.md) to learn how to manage relational metadata. -* [Manage fileset metadata using Gravitino](./manage-fileset-metadata-using-gravitino.md) to learn +- [Manage fileset metadata using Gravitino](./manage-fileset-metadata-using-gravitino.md) to learn how to manage fileset metadata. -* [Manage messaging metadata using Gravitino](./manage-messaging-metadata-using-gravitino.md) to learn how to manage +- [Manage messaging metadata using Gravitino](./manage-messaging-metadata-using-gravitino.md) to learn how to manage messaging metadata. Also, you can find the complete REST API definition in @@ -67,19 +67,19 @@ Gravitino currently supports the following catalogs: **Relational catalogs:** -* [**Iceberg catalog**](./lakehouse-iceberg-catalog.md) -* [**Hive catalog**](./apache-hive-catalog.md) -* [**MySQL catalog**](./jdbc-mysql-catalog.md) -* [**PostgreSQL catalog**](./jdbc-postgresql-catalog.md) -* [**Doris catalog**](./jdbc-doris-catalog.md) +- [**Iceberg catalog**](./lakehouse-iceberg-catalog.md) +- [**Hive catalog**](./apache-hive-catalog.md) +- [**MySQL catalog**](./jdbc-mysql-catalog.md) +- [**PostgreSQL catalog**](./jdbc-postgresql-catalog.md) +- [**Doris catalog**](./jdbc-doris-catalog.md) **Fileset catalogs:** -* [**Hadoop catalog**](./hadoop-catalog.md) +- [**Hadoop catalog**](./hadoop-catalog.md) **Messaging catalogs:** -* [**Kafka catalog**](./kafka-catalog.md) +- [**Kafka catalog**](./kafka-catalog.md) Gravitino also provides an Iceberg REST catalog service for the Iceberg table format. See the [Iceberg REST catalog service](./iceberg-rest-service.md) for details. @@ -91,11 +91,11 @@ integrates Apache Hadoop, Apache Hive, Trino, MySQL, PostgreSQL, and Gravitino t complete environment. To experience all the features, see [Getting started](./getting-started.md) and [How to use the Gravitino playground](./how-to-use-the-playground.md). -* [Install Gravitino playground on AWS or GCP](./getting-started.md#installing-gravitino-playground-on-aws-or-google-cloud-platform): +- [Install Gravitino playground on AWS or GCP](./getting-started.md#installing-gravitino-playground-on-aws-or-google-cloud-platform): a quick guide to starting and using the Gravitino playground on AWS or GCP. -* [Install Gravitino playground locally](./getting-started.md#installing-gravitino-playground-locally): +- [Install Gravitino playground locally](./getting-started.md#installing-gravitino-playground-locally): a quick guide to starting and using the Gravitino playground locally. -* [How to use the Gravitino playground](./how-to-use-the-playground.md): provides an example of how +- [How to use the Gravitino playground](./how-to-use-the-playground.md): provides an example of how to use Gravitino and other components together. ## Where to go from here @@ -104,49 +104,49 @@ complete environment. To experience all the features, see Gravitino supports different catalogs to manage the metadata in different sources. Please see: -* [Iceberg catalog](./lakehouse-iceberg-catalog.md): a complete guide to using Gravitino to +- [Iceberg catalog](./lakehouse-iceberg-catalog.md): a complete guide to using Gravitino to manage Apache Iceberg data. -* [Iceberg REST catalog service](./iceberg-rest-service.md): a +- [Iceberg REST catalog service](./iceberg-rest-service.md): a complete guide to using Gravitino as an Apache Iceberg REST catalog service. -* [Hive catalog](./apache-hive-catalog.md): a complete guide to using Gravitino to manage Apache Hive data. -* [MySQL catalog](./jdbc-mysql-catalog.md): a complete guide to using Gravitino to manage MySQL data. -* [PostgreSQL catalog](./jdbc-postgresql-catalog.md): a complete guide to using Gravitino to manage PostgreSQL data. -* [Doris catalog](./jdbc-doris-catalog.md): a complete guide to using Gravitino to manage Doris data. -* [Hadoop catalog](./hadoop-catalog.md): a complete guide to using Gravitino to manage fileset +- [Hive catalog](./apache-hive-catalog.md): a complete guide to using Gravitino to manage Apache Hive data. +- [MySQL catalog](./jdbc-mysql-catalog.md): a complete guide to using Gravitino to manage MySQL data. +- [PostgreSQL catalog](./jdbc-postgresql-catalog.md): a complete guide to using Gravitino to manage PostgreSQL data. +- [Doris catalog](./jdbc-doris-catalog.md): a complete guide to using Gravitino to manage Doris data. +- [Hadoop catalog](./hadoop-catalog.md): a complete guide to using Gravitino to manage fileset using Hadoop Compatible File System (HCFS). -* [Kafka catalog](./kafka-catalog.md): a complete guide to using Gravitino to manage Kafka topics metadata. +- [Kafka catalog](./kafka-catalog.md): a complete guide to using Gravitino to manage Kafka topics metadata. ### Trino connector Gravitino provides a Trino connector to manage Trino metadata in a unified way. To use the Trino connector, see: -* [How to use Gravitino Trino connector](./trino-connector/index.md): a complete guide to using the Gravitino +- [How to use Gravitino Trino connector](./trino-connector/index.md): a complete guide to using the Gravitino Trino connector. ### Server administration Gravitino provides several ways to configure and manage the Gravitino server. See: -* [Security](./security.md): provides security configurations for Gravitino, including HTTPS +- [Security](./security.md): provides security configurations for Gravitino, including HTTPS and OAuth2 configurations. -* [Gravitino metrics](./metrics.md): provides metrics configurations and detailed a metrics list +- [Gravitino metrics](./metrics.md): provides metrics configurations and detailed a metrics list of the Gravitino server. ### Programming guides -* [Gravitino Open API](./api/rest/gravitino-rest-api): provides the complete Open API definition of +- [Gravitino Open API](./api/rest/gravitino-rest-api): provides the complete Open API definition of Gravitino. -* [Gravitino Javadoc](pathname:///docs/0.5.1/api/java/index.html): provides the Javadoc for the Gravitino API. +- [Gravitino Javadoc](pathname:///docs/0.5.1/api/java/index.html): provides the Javadoc for the Gravitino API. ### Development guides -* [How to build Gravitino](./how-to-build.md): a complete guide to building Gravitino from +- [How to build Gravitino](./how-to-build.md): a complete guide to building Gravitino from source. -* [How to test Gravitino](./how-to-test.md): a complete guide to running Gravitino unit and +- [How to test Gravitino](./how-to-test.md): a complete guide to running Gravitino unit and integration tests. -* [How to sign and verify Gravitino releases](./how-to-sign-releases.md): a guide to signing and verifying +- [How to sign and verify Gravitino releases](./how-to-sign-releases.md): a guide to signing and verifying a Gravitino release. -* [Publish Docker images](./publish-docker-images.md): a guide to publishing Gravitino Docker images; +- [Publish Docker images](./publish-docker-images.md): a guide to publishing Gravitino Docker images; also lists the change logs of Gravitino CI Docker images and release images. -* [How to upgrade Gravitino](./how-to-upgrade.md): a guide to upgrading the schema of Gravitino storage backend from one release version to another. +- [How to upgrade Gravitino](./how-to-upgrade.md): a guide to upgrading the schema of Gravitino storage backend from one release version to another. diff --git a/docs/jdbc-doris-catalog.md b/docs/jdbc-doris-catalog.md index 9ea70362a2d..cfe16dbe448 100644 --- a/docs/jdbc-doris-catalog.md +++ b/docs/jdbc-doris-catalog.md @@ -2,9 +2,9 @@ title: "Apache Doris catalog" slug: /jdbc-doris-catalog keywords: -- jdbc -- Apache Doris -- metadata + - jdbc + - Apache Doris + - metadata license: "This software is licensed under the Apache License version 2." --- @@ -42,7 +42,7 @@ more details. Besides the [common catalog properties](./gravitino-server-config.md#gravitino-catalog-properties-configuration), the Doris catalog has the following properties: | Configuration item | Description | Default value | Required | Since Version | -|----------------------|-------------------------------------------------------------------------------------|---------------|----------|---------------| +| -------------------- | ----------------------------------------------------------------------------------- | ------------- | -------- | ------------- | | `jdbc-url` | JDBC URL for connecting to the database. For example, `jdbc:mysql://localhost:9030` | (none) | Yes | 0.5.0 | | `jdbc-driver` | The driver of the JDBC connection. For example, `com.mysql.jdbc.Driver`. | (none) | Yes | 0.5.0 | | `jdbc-user` | The JDBC user name. | (none) | Yes | 0.5.0 | @@ -85,7 +85,7 @@ Please refer to #### Table column types | Gravitino Type | Doris Type | -|----------------|------------| +| -------------- | ---------- | | `Boolean` | `Boolean` | | `Byte` | `TinyInt` | | `Short` | `SmallInt` | @@ -118,31 +118,31 @@ Unsupported for now. - Supports PRIMARY_KEY - Please be aware that the index can only apply to a single column. + Please be aware that the index can only apply to a single column. - ```json - { - "indexes": [ - { - "indexType": "primary_key", - "name": "PRIMARY", - "fieldNames": [["id"]] - } - ] - } - ``` + ```json + { + "indexes": [ + { + "indexType": "primary_key", + "name": "PRIMARY", + "fieldNames": [["id"]] + } + ] + } + ``` - ```java - Index[] indexes = new Index[] { - Indexes.of(IndexType.PRIMARY_KEY, "PRIMARY", new String[][]{{"id"}}) - } - ``` + ```java + Index[] indexes = new Index[] { + Indexes.of(IndexType.PRIMARY_KEY, "PRIMARY", new String[][]{{"id"}}) + } + ``` @@ -166,11 +166,11 @@ Gravitino supports these table alteration operations: Please be aware that: - - Not all table alteration operations can be processed in batches. - - Schema changes, such as adding/modifying/dropping columns can be processed in batches. - - Supports modifying multiple column comments at the same time. - - Doesn't support modifying the column type and column comment at the same time. - - The schema alteration in Doris is asynchronous. You might get an outdated schema if you - execute a schema query immediately after the alteration. It is recommended to pause briefly - after the schema alteration. Gravitino will add the schema alteration status into - the schema information in the upcoming version to solve this problem. +- Not all table alteration operations can be processed in batches. +- Schema changes, such as adding/modifying/dropping columns can be processed in batches. +- Supports modifying multiple column comments at the same time. +- Doesn't support modifying the column type and column comment at the same time. +- The schema alteration in Doris is asynchronous. You might get an outdated schema if you + execute a schema query immediately after the alteration. It is recommended to pause briefly + after the schema alteration. Gravitino will add the schema alteration status into + the schema information in the upcoming version to solve this problem. diff --git a/docs/jdbc-mysql-catalog.md b/docs/jdbc-mysql-catalog.md index f437f0c9fee..e1b9148f827 100644 --- a/docs/jdbc-mysql-catalog.md +++ b/docs/jdbc-mysql-catalog.md @@ -2,9 +2,9 @@ title: "MySQL catalog" slug: /jdbc-mysql-catalog keywords: -- jdbc -- MySQL -- metadata + - jdbc + - MySQL + - metadata license: "This software is licensed under the Apache License version 2." --- @@ -42,7 +42,7 @@ If you use a JDBC catalog, you must provide `jdbc-url`, `jdbc-driver`, `jdbc-use Besides the [common catalog properties](./gravitino-server-config.md#gravitino-catalog-properties-configuration), the MySQL catalog has the following properties: | Configuration item | Description | Default value | Required | Since Version | -|----------------------|--------------------------------------------------------------------------------------------------------|---------------|----------|---------------| +| -------------------- | ------------------------------------------------------------------------------------------------------ | ------------- | -------- | ------------- | | `jdbc-url` | JDBC URL for connecting to the database. For example, `jdbc:mysql://localhost:3306` | (none) | Yes | 0.3.0 | | `jdbc-driver` | The driver of the JDBC connection. For example, `com.mysql.jdbc.Driver` or `com.mysql.cj.jdbc.Driver`. | (none) | Yes | 0.3.0 | | `jdbc-user` | The JDBC user name. | (none) | Yes | 0.3.0 | @@ -88,7 +88,7 @@ Refer to [Manage Relational Metadata Using Gravitino](./manage-relational-metada #### Table column types | Gravitino Type | MySQL Type | -|------------------|---------------------| +| ---------------- | ------------------- | | `Byte` | `Tinyint` | | `Byte(false)` | `Tinyint Unsigned` | | `Short` | `Smallint` | @@ -96,7 +96,7 @@ Refer to [Manage Relational Metadata Using Gravitino](./manage-relational-metada | `Integer` | `Int` | | `Integer(false)` | `Int Unsigned` | | `Long` | `Bigint` | -| `Long(false)` | `Bigint Unsigned` | +| `Long(false)` | `Bigint Unsigned` | | `Float` | `Float` | | `Double` | `Double` | | `String` | `Text` | @@ -170,10 +170,10 @@ Index[] indexes = new Index[] { Although MySQL itself does not support table properties, Gravitino offers table property management for MySQL tables through the `jdbc-mysql` catalog, enabling control over table features. The supported properties are listed as follows: -| Property Name | Description | Required | Since version | -|-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------|---------------| -| `engine` | The engine used by the table. The default value is `InnoDB`. For example `MyISAM`, `MEMORY`, `CSV`, `ARCHIVE`, `BLACKHOLE`, `FEDERATED`, `ndbinfo`, `MRG_MYISAM`, `PERFORMANCE_SCHEMA`. | No | 0.4.0 | -| `auto-increment-offset` | Used to specify the starting value of the auto-increment field. | No | 0.4.0 | +| Property Name | Description | Required | Since version | +| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------- | +| `engine` | The engine used by the table. The default value is `InnoDB`. For example `MyISAM`, `MEMORY`, `CSV`, `ARCHIVE`, `BLACKHOLE`, `FEDERATED`, `ndbinfo`, `MRG_MYISAM`, `PERFORMANCE_SCHEMA`. | No | 0.4.0 | +| `auto-increment-offset` | Used to specify the starting value of the auto-increment field. | No | 0.4.0 | - Doesn't support remove table properties. You can only modify values, not delete properties. @@ -200,7 +200,7 @@ The index name of the PRIMARY_KEY must be PRIMARY { "indexType": "unique_key", "name": "id_name_uk", - "fieldNames": [["id"] ,["name"]] + "fieldNames": [["id"], ["name"]] } ] } @@ -240,6 +240,7 @@ Gravitino supports these table alteration operations: - `SetProperty` :::info - - You cannot submit the `RenameTable` operation at the same time as other operations. - - If you update a nullability column to non-nullability, there may be compatibility issues. -::: + +- You cannot submit the `RenameTable` operation at the same time as other operations. +- If you update a nullability column to non-nullability, there may be compatibility issues. + ::: diff --git a/docs/jdbc-postgresql-catalog.md b/docs/jdbc-postgresql-catalog.md index 3204b243653..f851ecaa9b6 100644 --- a/docs/jdbc-postgresql-catalog.md +++ b/docs/jdbc-postgresql-catalog.md @@ -2,9 +2,9 @@ title: "PostgreSQL catalog" slug: /jdbc-postgresql-catalog keywords: -- jdbc -- PostgreSQL -- metadata + - jdbc + - PostgreSQL + - metadata license: "This software is licensed under the Apache License version 2." --- @@ -39,15 +39,15 @@ When you use the Gravitino with Trino. You can pass the Trino PostgreSQL connect If you use JDBC catalog, you must provide `jdbc-url`, `jdbc-driver`, `jdbc-database`, `jdbc-user` and `jdbc-password` to catalog properties. Besides the [common catalog properties](./gravitino-server-config.md#gravitino-catalog-properties-configuration), the PostgreSQL catalog has the following properties: -| Configuration item | Description | Default value | Required | Since Version | -|----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|----------|---------------| -| `jdbc-url` | JDBC URL for connecting to the database. You need to specify the database in the URL. For example `jdbc:postgresql://localhost:3306/pg_database?sslmode=require`. | (none) | Yes | 0.3.0 | -| `jdbc-driver` | The driver of the JDBC connection. For example `org.postgresql.Driver`. | (none) | Yes | 0.3.0 | -| `jdbc-database` | The database of the JDBC connection. Configure it with the same value as the database in the `jdbc-url`. For example `pg_database`. | (none) | Yes | 0.3.0 | -| `jdbc-user` | The JDBC user name. | (none) | Yes | 0.3.0 | -| `jdbc-password` | The JDBC password. | (none) | Yes | 0.3.0 | -| `jdbc.pool.min-size` | The minimum number of connections in the pool. `2` by default. | `2` | No | 0.3.0 | -| `jdbc.pool.max-size` | The maximum number of connections in the pool. `10` by default. | `10` | No | 0.3.0 | +| Configuration item | Description | Default value | Required | Since Version | +| -------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------- | ------------- | +| `jdbc-url` | JDBC URL for connecting to the database. You need to specify the database in the URL. For example `jdbc:postgresql://localhost:3306/pg_database?sslmode=require`. | (none) | Yes | 0.3.0 | +| `jdbc-driver` | The driver of the JDBC connection. For example `org.postgresql.Driver`. | (none) | Yes | 0.3.0 | +| `jdbc-database` | The database of the JDBC connection. Configure it with the same value as the database in the `jdbc-url`. For example `pg_database`. | (none) | Yes | 0.3.0 | +| `jdbc-user` | The JDBC user name. | (none) | Yes | 0.3.0 | +| `jdbc-password` | The JDBC password. | (none) | Yes | 0.3.0 | +| `jdbc.pool.min-size` | The minimum number of connections in the pool. `2` by default. | `2` | No | 0.3.0 | +| `jdbc.pool.max-size` | The maximum number of connections in the pool. `10` by default. | `10` | No | 0.3.0 | :::caution You must download the corresponding JDBC driver to the `catalogs/jdbc-postgresql/libs` directory. @@ -91,7 +91,7 @@ Please refer to [Manage Relational Metadata Using Gravitino](./manage-relational #### Table column types | Gravitino Type | PostgreSQL Type | -|----------------|-----------------| +| -------------- | --------------- | | `Boolean` | `Bool` | | `Short` | `Int2` | | `Integer` | `Int4` | @@ -140,7 +140,7 @@ Meanwhile, the data types other than listed above are mapped to Gravitino **[Ext { "indexType": "unique_key", "name": "id_name_uk", - "fieldNames": [["id"] ,["name"]] + "fieldNames": [["id"], ["name"]] } ] } diff --git a/docs/kafka-catalog.md b/docs/kafka-catalog.md index 4b7e35ad123..508838604ad 100644 --- a/docs/kafka-catalog.md +++ b/docs/kafka-catalog.md @@ -18,7 +18,7 @@ One Kafka catalog corresponds to one Kafka cluster. Besides the [common catalog properties](./gravitino-server-config.md#gravitino-catalog-properties-configuration), the Kafka catalog has the following properties: | Property Name | Description | Default Value | Required | Since Version | -|---------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------|----------|---------------| +| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | -------- | ------------- | | `bootstrap.servers` | The Kafka broker(s) to connect to, allowing for multiple brokers by comma-separating them. | (none) | Yes | 0.5.0 | | `gravitino.bypass.` | Property name with this prefix passed down to the underlying Kafka Admin client for use. (refer to [Kafka Admin Configs](https://kafka.apache.org/34/documentation.html#adminclientconfigs) for more details) | (none) | No | 0.5.0 | @@ -51,7 +51,7 @@ Refer to [Schema operation](./manage-messaging-metadata-using-gravitino.md#schem ### Topic properties | Property name | Description | Default value | Required | Since Version | -|----------------------|------------------------------------------|-------------------------------------------------------------------------------------|----------|---------------| +| -------------------- | ---------------------------------------- | ----------------------------------------------------------------------------------- | -------- | ------------- | | `partition-count` | The number of partitions for the topic. | if not specified, will use the `num.partition` property in the broker. | No | 0.5.0 | | `replication-factor` | The number of replications for the topic | if not specified, will use the `default.replication.factor` property in the broker. | No | 0.5.0 | @@ -59,4 +59,4 @@ You can pass other topic configurations to the topic properties. Refer to [Topic ### Topic operations -Refer to [Topic operation](./manage-messaging-metadata-using-gravitino.md#topic-operations) for more details. \ No newline at end of file +Refer to [Topic operation](./manage-messaging-metadata-using-gravitino.md#topic-operations) for more details. diff --git a/docs/lakehouse-iceberg-catalog.md b/docs/lakehouse-iceberg-catalog.md index 1434405e0dc..420554d104f 100644 --- a/docs/lakehouse-iceberg-catalog.md +++ b/docs/lakehouse-iceberg-catalog.md @@ -33,7 +33,7 @@ Builds with Hadoop 2.10.x, there may be compatibility issues when accessing Hado ### Catalog properties | Property name | Description | Default value | Required | Since Version | -|----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|-------------------------------------------------------------|---------------| +| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | ----------------------------------------------------------- | ------------- | | `catalog-backend` | Catalog backend of Gravitino Iceberg catalog. Supports `hive` or `jdbc` or `rest`. | (none) | Yes | 0.2.0 | | `uri` | The URI configuration of the Iceberg catalog. `thrift://127.0.0.1:9083` or `jdbc:postgresql://127.0.0.1:5432/db_name` or `jdbc:mysql://127.0.0.1:3306/metastore_db` or `http://127.0.0.1:9001`. | (none) | Yes | 0.2.0 | | `warehouse` | Warehouse directory of catalog. `file:///user/hive/warehouse-hive/` for local fs or `hdfs://namespace/hdfs/path` for HDFS. | (none) | Yes | 0.2.0 | @@ -45,20 +45,18 @@ Builds with Hadoop 2.10.x, there may be compatibility issues when accessing Hado | `authentication.kerberos.check-interval-sec` | The check interval of Kerberos credential for Iceberg catalog. | 60 | No | 0.6.0 | | `authentication.kerberos.keytab-fetch-timeout-sec` | The fetch timeout of retrieving Kerberos keytab from `authentication.kerberos.keytab-uri`. | 60 | No | 0.6.0 | - Any properties not defined by Gravitino with `gravitino.bypass.` prefix will pass to Iceberg catalog properties and HDFS configuration. For example, if specify `gravitino.bypass.list-all-tables`, `list-all-tables` will pass to Iceberg catalog properties. When you use the Gravitino with Trino. You can pass the Trino Iceberg connector configuration using prefix `trino.bypass.`. For example, using `trino.bypass.iceberg.table-statistics-enabled` to pass the `iceberg.table-statistics-enabled` to the Gravitino Iceberg catalog in Trino runtime. When you use the Gravitino with Spark. You can pass the Spark Iceberg connector configuration using prefix `spark.bypass.`. For example, using `spark.bypass.io-impl` to pass the `io-impl` to the Spark Iceberg connector in Spark runtime. - #### JDBC catalog If you are using JDBC catalog, you must provide `jdbc-user`, `jdbc-password` and `jdbc-driver` to catalog properties. | Property name | Description | Default value | Required | Since Version | -|-------------------|---------------------------------------------------------------------------------------------------------|---------------|----------|---------------| +| ----------------- | ------------------------------------------------------------------------------------------------------- | ------------- | -------- | ------------- | | `jdbc-user` | JDBC user name | (none) | Yes | 0.2.0 | | `jdbc-password` | JDBC password | (none) | Yes | 0.2.0 | | `jdbc-driver` | `com.mysql.jdbc.Driver` or `com.mysql.cj.jdbc.Driver` for MySQL, `org.postgresql.Driver` for PostgreSQL | (none) | Yes | 0.3.0 | @@ -74,7 +72,7 @@ You must download the corresponding JDBC driver to the `catalogs/lakehouse-icebe Please refer to [Manage Relational Metadata Using Gravitino](./manage-relational-metadata-using-gravitino.md#catalog-operations) for more details. -## Schema +## Schema ### Schema capabilities @@ -88,7 +86,7 @@ You could put properties except `comment`. Please refer to [Manage Relational Metadata Using Gravitino](./manage-relational-metadata-using-gravitino.md#schema-operations) for more details. -## Table +## Table ### Table capabilities @@ -98,13 +96,13 @@ Please refer to [Manage Relational Metadata Using Gravitino](./manage-relational Supports transforms: - - `IdentityTransform` - - `BucketTransform` - - `TruncateTransform` - - `YearTransform` - - `MonthTransform` - - `DayTransform` - - `HourTransform` +- `IdentityTransform` +- `BucketTransform` +- `TruncateTransform` +- `YearTransform` +- `MonthTransform` +- `DayTransform` +- `HourTransform` :::info Iceberg doesn't support multi fields in `BucketTransform`. @@ -165,6 +163,7 @@ Distributions.NONE; "expressions": [] } ``` + @@ -208,7 +207,7 @@ Apache Iceberg doesn't support Gravitino `EvenDistribution` type. ### Table column types | Gravitino Type | Apache Iceberg Type | -|-----------------------------|-----------------------------| +| --------------------------- | --------------------------- | | `Sturct` | `Struct` | | `Map` | `Map` | | `Array` | `Array` | @@ -238,16 +237,16 @@ You can pass [Iceberg table properties](https://web.archive.org/web/202312100135 The Gravitino server doesn't allow passing the following reserved fields. -| Configuration item | Description | -|---------------------------------|---------------------------------------------------------| -| `comment` | The table comment. | -| `creator` | The table creator. | -| `location` | Iceberg location for table storage. | -| `current-snapshot-id` | The snapshot represents the current state of the table. | -| `cherry-pick-snapshot-id` | Selecting a specific snapshot in a merge operation. | -| `sort-order` | Selecting a specific snapshot in a merge operation. | -| `identifier-fields` | The identifier fields for defining the table. | -| `write.distribution-mode` | Defines distribution of write data | +| Configuration item | Description | +| ------------------------- | ------------------------------------------------------- | +| `comment` | The table comment. | +| `creator` | The table creator. | +| `location` | Iceberg location for table storage. | +| `current-snapshot-id` | The snapshot represents the current state of the table. | +| `cherry-pick-snapshot-id` | Selecting a specific snapshot in a merge operation. | +| `sort-order` | Selecting a specific snapshot in a merge operation. | +| `identifier-fields` | The identifier fields for defining the table. | +| `write.distribution-mode` | Defines distribution of write data | ### Table indexes diff --git a/docs/lakehouse-paimon-catalog.md b/docs/lakehouse-paimon-catalog.md index 7265073a524..214d4b705ee 100644 --- a/docs/lakehouse-paimon-catalog.md +++ b/docs/lakehouse-paimon-catalog.md @@ -31,17 +31,16 @@ Builds with Apache Paimon `0.8.0`. ### Catalog properties -| Property name | Description | Default value | Required | Since Version | -|----------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------|-----------------------------------------------------------------|---------------| -| `catalog-backend` | Catalog backend of Gravitino Paimon catalog. Only supports `filesystem` now. | (none) | Yes | 0.6.0 | -| `uri` | The URI configuration of the Paimon catalog. `thrift://127.0.0.1:9083` or `jdbc:postgresql://127.0.0.1:5432/db_name` or `jdbc:mysql://127.0.0.1:3306/metastore_db`. It is optional for `FilesystemCatalog`. | (none) | required if the value of `catalog-backend` is not `filesystem`. | 0.6.0 | -| `warehouse` | Warehouse directory of catalog. `file:///user/hive/warehouse-paimon/` for local fs or `hdfs://namespace/hdfs/path` for HDFS. | (none) | Yes | 0.6.0 | -| `authentication.type` | The type of authentication for Paimon catalog backend, currently Gravitino only supports `Kerberos` and `simple`. | `simple` | No | 0.6.0 | -| `authentication.kerberos.principal` | The principal of the Kerberos authentication. | (none) | required if the value of `authentication.type` is Kerberos. | 0.6.0 | -| `authentication.kerberos.keytab-uri` | The URI of The keytab for the Kerberos authentication. | (none) | required if the value of `authentication.type` is Kerberos. | 0.6.0 | -| `authentication.kerberos.check-interval-sec` | The check interval of Kerberos credential for Paimon catalog. | 60 | No | 0.6.0 | -| `authentication.kerberos.keytab-fetch-timeout-sec` | The fetch timeout of retrieving Kerberos keytab from `authentication.kerberos.keytab-uri`. | 60 | No | 0.6.0 | - +| Property name | Description | Default value | Required | Since Version | +| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------- | --------------------------------------------------------------- | ------------- | +| `catalog-backend` | Catalog backend of Gravitino Paimon catalog. Only supports `filesystem` now. | (none) | Yes | 0.6.0 | +| `uri` | The URI configuration of the Paimon catalog. `thrift://127.0.0.1:9083` or `jdbc:postgresql://127.0.0.1:5432/db_name` or `jdbc:mysql://127.0.0.1:3306/metastore_db`. It is optional for `FilesystemCatalog`. | (none) | required if the value of `catalog-backend` is not `filesystem`. | 0.6.0 | +| `warehouse` | Warehouse directory of catalog. `file:///user/hive/warehouse-paimon/` for local fs or `hdfs://namespace/hdfs/path` for HDFS. | (none) | Yes | 0.6.0 | +| `authentication.type` | The type of authentication for Paimon catalog backend, currently Gravitino only supports `Kerberos` and `simple`. | `simple` | No | 0.6.0 | +| `authentication.kerberos.principal` | The principal of the Kerberos authentication. | (none) | required if the value of `authentication.type` is Kerberos. | 0.6.0 | +| `authentication.kerberos.keytab-uri` | The URI of The keytab for the Kerberos authentication. | (none) | required if the value of `authentication.type` is Kerberos. | 0.6.0 | +| `authentication.kerberos.check-interval-sec` | The check interval of Kerberos credential for Paimon catalog. | 60 | No | 0.6.0 | +| `authentication.kerberos.keytab-fetch-timeout-sec` | The fetch timeout of retrieving Kerberos keytab from `authentication.kerberos.keytab-uri`. | 60 | No | 0.6.0 | Any properties not defined by Gravitino with `gravitino.bypass.` prefix will pass to Paimon catalog properties and HDFS configuration. For example, if specify `gravitino.bypass.table.type`, `table.type` will pass to Paimon catalog properties. @@ -49,7 +48,7 @@ Any properties not defined by Gravitino with `gravitino.bypass.` prefix will pas Please refer to [Manage Relational Metadata Using Gravitino](./manage-relational-metadata-using-gravitino.md#catalog-operations) for more details. -## Schema +## Schema ### Schema capabilities @@ -68,14 +67,16 @@ Please refer to [Manage Relational Metadata Using Gravitino](./manage-relational Please refer to [Manage Relational Metadata Using Gravitino](./manage-relational-metadata-using-gravitino.md#schema-operations) for more details. -## Table +## Table ### Table capabilities - Supporting createTable, dropTable, loadTable and listTable. + ``` dropTable will delete the table location directly, similar with purgeTable. ``` + - Supporting Column default value through table properties, such as `fields.{columnName}.default-value`. - Doesn't support alterTable now. @@ -98,28 +99,28 @@ dropTable will delete the table location directly, similar with purgeTable. ### Table column types -| Gravitino Type | Apache Paimon Type | -|-------------------------------|--------------------------------| -| `Sturct` | `Row` | -| `Map` | `Map` | -| `Array` | `Array` | -| `Boolean` | `Boolean` | -| `Byte` | `TinyInt` | -| `Short` | `SmallInt` | -| `Integer` | `Int` | -| `Long` | `BigInt` | -| `Float` | `Float` | -| `Double` | `Double` | -| `Decimal` | `Decimal` | -| `String` | `VarChar(Integer.MAX_VALUE)` | -| `VarChar` | `VarChar` | -| `FixedChar` | `Char` | -| `Date` | `Date` | -| `Time` | `Time` | -| `TimestampType withZone` | `LocalZonedTimestamp` | -| `TimestampType withoutZone` | `Timestamp` | -| `Binary` | `Binary` | -| `Fixed` | `VarBinary` | +| Gravitino Type | Apache Paimon Type | +| --------------------------- | ---------------------------- | +| `Sturct` | `Row` | +| `Map` | `Map` | +| `Array` | `Array` | +| `Boolean` | `Boolean` | +| `Byte` | `TinyInt` | +| `Short` | `SmallInt` | +| `Integer` | `Int` | +| `Long` | `BigInt` | +| `Float` | `Float` | +| `Double` | `Double` | +| `Decimal` | `Decimal` | +| `String` | `VarChar(Integer.MAX_VALUE)` | +| `VarChar` | `VarChar` | +| `FixedChar` | `Char` | +| `Date` | `Date` | +| `Time` | `Time` | +| `TimestampType withZone` | `LocalZonedTimestamp` | +| `TimestampType withoutZone` | `Timestamp` | +| `Binary` | `Binary` | +| `Fixed` | `VarBinary` | :::info Gravitino doesn't support Paimon `MultisetType` type. @@ -131,10 +132,10 @@ You can pass [Paimon table properties](https://paimon.apache.org/docs/0.8/mainte The Gravitino server doesn't allow passing the following reserved fields. -| Configuration item | Description | -|---------------------------------|----------------------------------------------------------| -| `comment` | The table comment. | -| `creator` | The table creator. | +| Configuration item | Description | +| ------------------ | ------------------ | +| `comment` | The table comment. | +| `creator` | The table creator. | ### Table operations diff --git a/docs/manage-fileset-metadata-using-gravitino.md b/docs/manage-fileset-metadata-using-gravitino.md index a2d7bbadbd2..c36bf200feb 100644 --- a/docs/manage-fileset-metadata-using-gravitino.md +++ b/docs/manage-fileset-metadata-using-gravitino.md @@ -9,7 +9,7 @@ license: This software is licensed under the Apache License version 2. import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -This page introduces how to manage fileset metadata in Apache Gravitino. Filesets +This page introduces how to manage fileset metadata in Apache Gravitino. Filesets are a collection of files and directories. Users can leverage filesets to manage non-tabular data like training datasets and other raw data. @@ -24,8 +24,8 @@ control mechanism without needing to set access controls across different storag To use fileset, please make sure that: - - Gravitino server has started, and the host and port is [http://localhost:8090](http://localhost:8090). - - A metalake has been created. +- Gravitino server has started, and the host and port is [http://localhost:8090](http://localhost:8090). +- A metalake has been created. ## Catalog operations @@ -84,7 +84,7 @@ Catalog catalog = gravitinoClient.createCatalog("catalog", gravitino_client: GravitinoClient = GravitinoClient(uri="http://localhost:8090", metalake_name="metalake") catalog = gravitino_client.create_catalog(name="catalog", type=Catalog.Type.FILESET, - provider="hadoop", + provider="hadoop", comment="This is a Hadoop fileset catalog", properties={"location": "/tmp/test1"}) ``` @@ -94,9 +94,9 @@ catalog = gravitino_client.create_catalog(name="catalog", Currently, Gravitino supports the following catalog providers: -| Catalog provider | Catalog property | -|---------------------|-------------------------------------------------------------------------| -| `hadoop` | [Hadoop catalog property](./hadoop-catalog.md#catalog-properties) | +| Catalog provider | Catalog property | +| ---------------- | ----------------------------------------------------------------- | +| `hadoop` | [Hadoop catalog property](./hadoop-catalog.md#catalog-properties) | ### Load a catalog @@ -189,7 +189,7 @@ Schema schema = supportsSchemas.createSchema("schema", gravitino_client: GravitinoClient = GravitinoClient(uri="http://localhost:8090", metalake_name="metalake") catalog: Catalog = gravitino_client.load_catalog(name="catalog") -catalog.as_schemas().create_schema(name="schema", +catalog.as_schemas().create_schema(name="schema", comment="This is a schema", properties={"location": "/tmp/root/schema"}) ``` @@ -199,9 +199,9 @@ catalog.as_schemas().create_schema(name="schema", Currently, Gravitino supports the following schema property: -| Catalog provider | Schema property | -|---------------------|------------------------------------------------------------------------------| -| `hadoop` | [Hadoop schema property](./hadoop-catalog.md#schema-properties) | +| Catalog provider | Schema property | +| ---------------- | --------------------------------------------------------------- | +| `hadoop` | [Hadoop schema property](./hadoop-catalog.md#schema-properties) | ### Load a schema @@ -233,9 +233,10 @@ same. ## Fileset operations :::tip - - Users should create a metalake, a catalog, and a schema before creating a fileset. - - Currently, Gravitino only supports managing Hadoop Compatible File System (HCFS) locations. -::: + +- Users should create a metalake, a catalog, and a schema before creating a fileset. +- Currently, Gravitino only supports managing Hadoop Compatible File System (HCFS) locations. + ::: ### Create a fileset @@ -303,11 +304,11 @@ catalog.as_fileset_catalog().create_fileset(ident=NameIdentifier.of("schema", "e Currently, Gravitino supports two **types** of filesets: - - `MANAGED`: The storage location of the fileset is managed by Gravitino when specified as - `MANAGED`, the physical location of the fileset will be deleted when this fileset is dropped. - - `EXTERNAL`: The storage location of the fileset is **not** managed by Gravitino, when - specified as `EXTERNAL`, the files of the fileset will **not** be deleted when - the fileset is dropped. +- `MANAGED`: The storage location of the fileset is managed by Gravitino when specified as + `MANAGED`, the physical location of the fileset will be deleted when this fileset is dropped. +- `EXTERNAL`: The storage location of the fileset is **not** managed by Gravitino, when + specified as `EXTERNAL`, the files of the fileset will **not** be deleted when + the fileset is dropped. **storageLocation** @@ -380,7 +381,7 @@ changes = ( FilesetChange.remove_property("fileset_properties_key1"), FilesetChange.set_property("fileset_properties_key2", "fileset_propertie_new_value"), ) -fileset_new = catalog.as_fileset_catalog().alter_fileset(NameIdentifier.of("schema", "fileset"), +fileset_new = catalog.as_fileset_catalog().alter_fileset(NameIdentifier.of("schema", "fileset"), *changes) ``` @@ -389,13 +390,13 @@ fileset_new = catalog.as_fileset_catalog().alter_fileset(NameIdentifier.of("sche Currently, Gravitino supports the following changes to a fileset: -| Supported modification | JSON | Java | -|------------------------------------|--------------------------------------------------------------|-----------------------------------------------| -| Rename a fileset | `{"@type":"rename","newName":"fileset_renamed"}` | `FilesetChange.rename("fileset_renamed")` | -| Update a comment | `{"@type":"updateComment","newComment":"new_comment"}` | `FilesetChange.updateComment("new_comment")` | -| Set a fileset property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `FilesetChange.setProperty("key1", "value1")` | -| Remove a fileset property | `{"@type":"removeProperty","property":"key1"}` | `FilesetChange.removeProperty("key1")` | -| Remove comment | `{"@type":"removeComment"}` | `FilesetChange.removeComment()` | +| Supported modification | JSON | Java | +| ------------------------- | ------------------------------------------------------------ | --------------------------------------------- | +| Rename a fileset | `{"@type":"rename","newName":"fileset_renamed"}` | `FilesetChange.rename("fileset_renamed")` | +| Update a comment | `{"@type":"updateComment","newComment":"new_comment"}` | `FilesetChange.updateComment("new_comment")` | +| Set a fileset property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `FilesetChange.setProperty("key1", "value1")` | +| Remove a fileset property | `{"@type":"removeProperty","property":"key1"}` | `FilesetChange.removeProperty("key1")` | +| Remove comment | `{"@type":"removeComment"}` | `FilesetChange.removeComment()` | ### Drop a fileset diff --git a/docs/manage-messaging-metadata-using-gravitino.md b/docs/manage-messaging-metadata-using-gravitino.md index 9fc5d6adb70..ad78e34fa4e 100644 --- a/docs/manage-messaging-metadata-using-gravitino.md +++ b/docs/manage-messaging-metadata-using-gravitino.md @@ -9,14 +9,14 @@ license: This software is licensed under the Apache License version 2. import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -This page introduces how to manage messaging metadata using Apache Gravitino. Messaging metadata refers to +This page introduces how to manage messaging metadata using Apache Gravitino. Messaging metadata refers to the topic metadata of the messaging system such as Apache Kafka, Apache Pulsar, Apache RocketMQ, etc. Through Gravitino, you can create, update, delete, and list topics via unified RESTful APIs or Java client. To use messaging catalog, please make sure that: - - Gravitino server has started, and the host and port is [http://localhost:8090](http://localhost:8090). - - A metalake has been created. +- Gravitino server has started, and the host and port is [http://localhost:8090](http://localhost:8090). +- A metalake has been created. ## Catalog operations @@ -73,7 +73,7 @@ Catalog catalog = gravitinoClient.createCatalog("catalog", Currently, Gravitino supports the following catalog providers: | Catalog provider | Catalog property | -|------------------|-----------------------------------------------------------------| +| ---------------- | --------------------------------------------------------------- | | `kafka` | [Kafka catalog property](./kafka-catalog.md#catalog-properties) | ### Load a catalog @@ -103,7 +103,7 @@ in relational catalog for more details. For a messaging catalog, the list operat ## Schema operations -`Schema` is a logical grouping of topics in a messaging catalog, if the messaging system does not support topics grouping, +`Schema` is a logical grouping of topics in a messaging catalog, if the messaging system does not support topics grouping, schema operations are not supported but a "default" schema will be automatically created to include all topics :::caution note @@ -146,7 +146,6 @@ Users should create a metalake, a catalog and a schema before creating a table. You can create a topic by sending a `POST` request to the `/api/metalakes/{metalake_name}/catalogs/{catalog_name}/schemas/{schema_name}/topics` endpoint or just use the Gravitino Java client. The following is an example of creating a topic: - @@ -195,7 +194,6 @@ topicCatalog.createTopic( You can modify a topic by sending a `PUT` request to the `/api/metalakes/{metalake_name}/catalogs/{catalog_name}/schemas/{schema_name}/topics/{topic_name}` endpoint or just use the Gravitino Java client. The following is an example of altering a topic: - @@ -236,7 +234,7 @@ Topic t = topicCatalog.alterTopic(NameIdentifier.of("default", "topic"), Currently, Gravitino supports the following changes to a topic: | Supported modification | JSON | Java | -|-------------------------|--------------------------------------------------------------|---------------------------------------------| +| ----------------------- | ------------------------------------------------------------ | ------------------------------------------- | | Update a comment | `{"@type":"updateComment","newComment":"new_comment"}` | `TopicChange.updateComment("new_comment")` | | Set a topic property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `TopicChange.setProperty("key1", "value1")` | | Remove a topic property | `{"@type":"removeProperty","property":"key1"}` | `TopicChange.removeProperty("key1")` | @@ -303,4 +301,4 @@ NameIdentifier[] identifiers = ``` - \ No newline at end of file + diff --git a/docs/manage-metalake-using-gravitino.md b/docs/manage-metalake-using-gravitino.md index b4186dbbf45..30857862854 100644 --- a/docs/manage-metalake-using-gravitino.md +++ b/docs/manage-metalake-using-gravitino.md @@ -54,8 +54,8 @@ GravitinoMetalake newMetalake = gravitinoAdminClient.createMetalake( ```python gravitino_admin_client: GravitinoAdminClient = GravitinoAdminClient(uri="http://localhost:8090") -gravitino_admin_client.create_metalake(name="metalake", - comment="This is a new metalake", +gravitino_admin_client.create_metalake(name="metalake", + comment="This is a new metalake", properties={}) ``` @@ -147,16 +147,14 @@ metalake = gravitino_admin_client.alter_metalake("metalake_name", *changes) - Currently, Gravitino supports the following changes to a metalake: -| Supported modification | JSON | Java | -|------------------------|--------------------------------------------------------------|-------------------------------------------------| -| Rename metalake | `{"@type":"rename","newName":"metalake_renamed"}` | `MetalakeChange.rename("metalake_renamed")` | -| Update comment | `{"@type":"updateComment","newComment":"new_comment"}` | `MetalakeChange.updateComment("new_comment")` | -| Set a property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `MetalakeChange.setProperty("key1", "value1")` | -| Remove a property | `{"@type":"removeProperty","property":"key1"}` | `MetalakeChange.removeProperty("key1")` | - +| Supported modification | JSON | Java | +| ---------------------- | ------------------------------------------------------------ | ---------------------------------------------- | +| Rename metalake | `{"@type":"rename","newName":"metalake_renamed"}` | `MetalakeChange.rename("metalake_renamed")` | +| Update comment | `{"@type":"updateComment","newComment":"new_comment"}` | `MetalakeChange.updateComment("new_comment")` | +| Set a property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `MetalakeChange.setProperty("key1", "value1")` | +| Remove a property | `{"@type":"removeProperty","property":"key1"}` | `MetalakeChange.removeProperty("key1")` | ### Drop a metalake @@ -190,7 +188,7 @@ gravitino_admin_client.drop_metalake("metalake") :::note -Current Gravitino doesn't support dropping a metalake in cascade mode, which means all the +Current Gravitino doesn't support dropping a metalake in cascade mode, which means all the catalogs, schemas and tables under the metalake need to be removed before dropping the metalake. ::: diff --git a/docs/manage-relational-metadata-using-gravitino.md b/docs/manage-relational-metadata-using-gravitino.md index 552a3e9c2ec..a37c82eb70e 100644 --- a/docs/manage-relational-metadata-using-gravitino.md +++ b/docs/manage-relational-metadata-using-gravitino.md @@ -26,8 +26,8 @@ For more details, please refer to the related doc. Assuming: - - Gravitino has just started, and the host and port is [http://localhost:8090](http://localhost:8090). - - Metalake has been created. +- Gravitino has just started, and the host and port is [http://localhost:8090](http://localhost:8090). +- Metalake has been created. ## Catalog operations @@ -88,7 +88,7 @@ Catalog catalog = gravitinoClient.createCatalog("catalog", Currently, Gravitino supports the following catalog providers: | Catalog provider | Catalog property | -|---------------------|--------------------------------------------------------------------------------| +| ------------------- | ------------------------------------------------------------------------------ | | `hive` | [Hive catalog property](./apache-hive-catalog.md#catalog-properties) | | `lakehouse-iceberg` | [Iceberg catalog property](./lakehouse-iceberg-catalog.md#catalog-properties) | | `jdbc-mysql` | [MySQL catalog property](./jdbc-mysql-catalog.md#catalog-properties) | @@ -160,12 +160,12 @@ Catalog catalog = gravitinoClient.alterCatalog("catalog", Currently, Gravitino supports the following changes to a catalog: -| Supported modification | JSON | Java | -|------------------------|--------------------------------------------------------------|------------------------------------------------| -| Rename metalake | `{"@type":"rename","newName":"metalake_renamed"}` | `CatalogChange.rename("catalog_renamed")` | -| Update comment | `{"@type":"updateComment","newComment":"new_comment"}` | `CatalogChange.updateComment("new_comment")` | -| Set a property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `CatalogChange.setProperty("key1", "value1")` | -| Remove a property | `{"@type":"removeProperty","property":"key1"}` | `CatalogChange.removeProperty("key1")` | +| Supported modification | JSON | Java | +| ---------------------- | ------------------------------------------------------------ | --------------------------------------------- | +| Rename metalake | `{"@type":"rename","newName":"metalake_renamed"}` | `CatalogChange.rename("catalog_renamed")` | +| Update comment | `{"@type":"updateComment","newComment":"new_comment"}` | `CatalogChange.updateComment("new_comment")` | +| Set a property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `CatalogChange.setProperty("key1", "value1")` | +| Remove a property | `{"@type":"removeProperty","property":"key1"}` | `CatalogChange.removeProperty("key1")` | ### Drop a catalog @@ -251,7 +251,6 @@ Catalog[] catalogsInfos = gravitinoMetaLake.listCatalogsInfo(); - ## Schema operations :::tip @@ -311,7 +310,7 @@ catalog.as_schemas().create_schema(name="schema", Currently, Gravitino supports the following schema property: | Catalog provider | Schema property | -|---------------------|------------------------------------------------------------------------------| +| ------------------- | ---------------------------------------------------------------------------- | | `hive` | [Hive schema property](./apache-hive-catalog.md#schema-properties) | | `lakehouse-iceberg` | [Iceberg scheme property](./lakehouse-iceberg-catalog.md#schema-properties) | | `jdbc-mysql` | [MySQL schema property](./jdbc-mysql-catalog.md#schema-properties) | @@ -405,7 +404,7 @@ changes = ( SchemaChange.remove_property("schema_properties_key1"), SchemaChange.set_property("schema_properties_key2", "schema_properties_new_value"), ) -schema_new: Schema = catalog.as_schemas().alter_schema("schema", +schema_new: Schema = catalog.as_schemas().alter_schema("schema", *changes) ``` @@ -414,12 +413,13 @@ schema_new: Schema = catalog.as_schemas().alter_schema("schema", Currently, Gravitino supports the following changes to a schema: -| Supported modification | JSON | Java | -|------------------------|--------------------------------------------------------------|-----------------------------------------------| -| Set a property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `SchemaChange.setProperty("key1", "value1")` | -| Remove a property | `{"@type":"removeProperty","property":"key1"}` | `SchemaChange.removeProperty("key1")` | +| Supported modification | JSON | Java | +| ---------------------- | ------------------------------------------------------------ | -------------------------------------------- | +| Set a property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `SchemaChange.setProperty("key1", "value1")` | +| Remove a property | `{"@type":"removeProperty","property":"key1"}` | `SchemaChange.removeProperty("key1")` | ### Drop a schema + You can remove a schema by sending a `DELETE` request to the `/api/metalakes/{metalake_name}/catalogs/{catalog_name}/schemas/{schema_name}` endpoint or just use the Gravitino Java client. The following is an example of dropping a schema: @@ -458,14 +458,13 @@ catalog.as_schemas().drop_schema("schema", cascade=True) -If `cascade` is true, Gravitino will drop all tables under the schema. Otherwise, Gravitino will throw an exception if there are tables under the schema. +If `cascade` is true, Gravitino will drop all tables under the schema. Otherwise, Gravitino will throw an exception if there are tables under the schema. Some catalogs may not support cascading deletion of a schema, please refer to the related doc for more details. ### List all schemas under a catalog You can list all schemas under a catalog by sending a `GET` request to the `/api/metalakes/{metalake_name}/catalogs/{catalog_name}/schemas` endpoint or just use the Gravitino Java client. The following is an example of listing all the schemas - in a catalog: - +in a catalog: @@ -694,36 +693,36 @@ In order to create a table, you need to provide the following information: The following types that Gravitino supports: -| Type | Java | JSON | Description | -|----------------------------|--------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------| -| Boolean | `Types.BooleanType.get()` | `boolean` | Boolean type | -| Byte | `Types.ByteType.get()` | `byte` | Byte type, indicates a numerical value of 1 byte | -| Byte(false) | `Types.ByteType.unsigned()` | `byte unsigned` | Unsigned Byte type, indicates a unsigned numerical value of 1 byte | -| Short | `Types.ShortType.get()` | `short` | Short type, indicates a numerical value of 2 bytes | -| Short(false) | `Types.ShortType.unsigned()` | `short unsigned` | Unsigned Short type, indicates a unsigned numerical value of 2 bytes | -| Integer | `Types.IntegerType.get()` | `integer` | Integer type, indicates a numerical value of 4 bytes | -| Integer(false) | `Types.IntegerType.unsigned()` | `integer unsigned` | Unsigned Integer type, indicates a unsigned numerical value of 4 bytes | -| Long | `Types.LongType.get()` | `long` | Long type, indicates a numerical value of 8 bytes | -| Long(false) | `Types.LongType.unsigned()` | `long unsigned` | Unsigned Long type, indicates a unsigned numerical value of 8 bytes | -| Float | `Types.FloatType.get()` | `float` | Float type, indicates a single-precision floating point number | -| Double | `Types.DoubleType.get()` | `double` | Double type, indicates a double-precision floating point number | -| Decimal(precision, scale) | `Types.DecimalType.of(precision, scale)` | `decimal(p, s)` | Decimal type, indicates a fixed-precision decimal number | -| String | `Types.StringType.get()` | `string` | String type | -| FixedChar(length) | `Types.FixedCharType.of(length)` | `char(l)` | Char type, indicates a fixed-length string | -| VarChar(length) | `Types.VarCharType.of(length)` | `varchar(l)` | Varchar type, indicates a variable-length string, the length is the maximum length of the string | -| Timestamp | `Types.TimestampType.withoutTimeZone()` | `timestamp` | Timestamp type, indicates a timestamp without timezone | -| TimestampWithTimezone | `Types.TimestampType.withTimeZone()` | `timestamp_tz` | Timestamp with timezone type, indicates a timestamp with timezone | -| Date | `Types.DateType.get()` | `date` | Date type | -| Time | `Types.TimeType.withoutTimeZone()` | `time` | Time type | -| IntervalToYearMonth | `Types.IntervalYearType.get()` | `interval_year` | Interval type, indicates an interval of year and month | -| IntervalToDayTime | `Types.IntervalDayType.get()` | `interval_day` | Interval type, indicates an interval of day and time | -| Fixed(length) | `Types.FixedType.of(length)` | `fixed(l)` | Fixed type, indicates a fixed-length binary array | -| Binary | `Types.BinaryType.get()` | `binary` | Binary type, indicates a arbitrary-length binary array | -| List | `Types.ListType.of(elementType, elementNullable)` | `{"type": "list", "containsNull": JSON Boolean, "elementType": type JSON}` | List type, indicate a list of elements with the same type | -| Map | `Types.MapType.of(keyType, valueType)` | `{"type": "map", "keyType": type JSON, "valueType": type JSON, "valueContainsNull": JSON Boolean}` | Map type, indicate a map of key-value pairs | -| Struct | `Types.StructType.of([Types.StructType.Field.of(name, type, nullable)])` | `{"type": "struct", "fields": [JSON StructField, {"name": string, "type": type JSON, "nullable": JSON Boolean, "comment": string}]}` | Struct type, indicate a struct of fields | -| Union | `Types.UnionType.of([type1, type2, ...])` | `{"type": "union", "types": [type JSON, ...]}` | Union type, indicates a union of types | -| UUID | `Types.UUIDType.get()` | `uuid` | UUID type, indicates a universally unique identifier | +| Type | Java | JSON | Description | +| ------------------------- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------ | +| Boolean | `Types.BooleanType.get()` | `boolean` | Boolean type | +| Byte | `Types.ByteType.get()` | `byte` | Byte type, indicates a numerical value of 1 byte | +| Byte(false) | `Types.ByteType.unsigned()` | `byte unsigned` | Unsigned Byte type, indicates a unsigned numerical value of 1 byte | +| Short | `Types.ShortType.get()` | `short` | Short type, indicates a numerical value of 2 bytes | +| Short(false) | `Types.ShortType.unsigned()` | `short unsigned` | Unsigned Short type, indicates a unsigned numerical value of 2 bytes | +| Integer | `Types.IntegerType.get()` | `integer` | Integer type, indicates a numerical value of 4 bytes | +| Integer(false) | `Types.IntegerType.unsigned()` | `integer unsigned` | Unsigned Integer type, indicates a unsigned numerical value of 4 bytes | +| Long | `Types.LongType.get()` | `long` | Long type, indicates a numerical value of 8 bytes | +| Long(false) | `Types.LongType.unsigned()` | `long unsigned` | Unsigned Long type, indicates a unsigned numerical value of 8 bytes | +| Float | `Types.FloatType.get()` | `float` | Float type, indicates a single-precision floating point number | +| Double | `Types.DoubleType.get()` | `double` | Double type, indicates a double-precision floating point number | +| Decimal(precision, scale) | `Types.DecimalType.of(precision, scale)` | `decimal(p, s)` | Decimal type, indicates a fixed-precision decimal number | +| String | `Types.StringType.get()` | `string` | String type | +| FixedChar(length) | `Types.FixedCharType.of(length)` | `char(l)` | Char type, indicates a fixed-length string | +| VarChar(length) | `Types.VarCharType.of(length)` | `varchar(l)` | Varchar type, indicates a variable-length string, the length is the maximum length of the string | +| Timestamp | `Types.TimestampType.withoutTimeZone()` | `timestamp` | Timestamp type, indicates a timestamp without timezone | +| TimestampWithTimezone | `Types.TimestampType.withTimeZone()` | `timestamp_tz` | Timestamp with timezone type, indicates a timestamp with timezone | +| Date | `Types.DateType.get()` | `date` | Date type | +| Time | `Types.TimeType.withoutTimeZone()` | `time` | Time type | +| IntervalToYearMonth | `Types.IntervalYearType.get()` | `interval_year` | Interval type, indicates an interval of year and month | +| IntervalToDayTime | `Types.IntervalDayType.get()` | `interval_day` | Interval type, indicates an interval of day and time | +| Fixed(length) | `Types.FixedType.of(length)` | `fixed(l)` | Fixed type, indicates a fixed-length binary array | +| Binary | `Types.BinaryType.get()` | `binary` | Binary type, indicates a arbitrary-length binary array | +| List | `Types.ListType.of(elementType, elementNullable)` | `{"type": "list", "containsNull": JSON Boolean, "elementType": type JSON}` | List type, indicate a list of elements with the same type | +| Map | `Types.MapType.of(keyType, valueType)` | `{"type": "map", "keyType": type JSON, "valueType": type JSON, "valueContainsNull": JSON Boolean}` | Map type, indicate a map of key-value pairs | +| Struct | `Types.StructType.of([Types.StructType.Field.of(name, type, nullable)])` | `{"type": "struct", "fields": [JSON StructField, {"name": string, "type": type JSON, "nullable": JSON Boolean, "comment": string}]}` | Struct type, indicate a struct of fields | +| Union | `Types.UnionType.of([type1, type2, ...])` | `{"type": "union", "types": [type JSON, ...]}` | Union type, indicates a union of types | +| UUID | `Types.UUIDType.get()` | `uuid` | UUID type, indicates a universally unique identifier | The related java doc is [here](pathname:///docs/0.5.1/api/java/org/apache/gravitino/rel/types/Type.html). @@ -791,7 +790,7 @@ When defining a table column, you can specify a [literal](./expression.md#litera The following is a table of the column default value that Gravitino supports for different catalogs: | Catalog provider | Supported default value | -|---------------------|-------------------------| +| ------------------- | ----------------------- | | `hive` | ✘ | | `lakehouse-iceberg` | ✘ | | `jdbc-mysql` | ✔ | @@ -803,7 +802,7 @@ Auto-increment provides a convenient way to ensure that each row in a table has The following table shows the column auto-increment that Gravitino supports for different catalogs: | Catalog provider | Supported auto-increment | -|---------------------|------------------------------------------------------------------------------| +| ------------------- | ---------------------------------------------------------------------------- | | `hive` | ✘ | | `lakehouse-iceberg` | ✘ | | `jdbc-mysql` | ✔([limitations](./jdbc-mysql-catalog.md#table-column-auto-increment)) | @@ -814,7 +813,7 @@ The following table shows the column auto-increment that Gravitino supports for The following is the table property that Gravitino supports: | Catalog provider | Table property | Type mapping | -|---------------------|----------------------------------------------------------------------------|----------------------------------------------------------------------------| +| ------------------- | -------------------------------------------------------------------------- | -------------------------------------------------------------------------- | | `hive` | [Hive table property](./apache-hive-catalog.md#table-properties) | [Hive type mapping](./apache-hive-catalog.md#table-column-types) | | `lakehouse-iceberg` | [Iceberg table property](./lakehouse-iceberg-catalog.md#table-properties) | [Iceberg type mapping](./lakehouse-iceberg-catalog.md#table-column-types) | | `jdbc-mysql` | [MySQL table property](./jdbc-mysql-catalog.md#table-properties) | [MySQL type mapping](./jdbc-mysql-catalog.md#table-column-types) | @@ -825,8 +824,8 @@ The following is the table property that Gravitino supports: In addition to the basic settings, Gravitino supports the following features: -| Feature | Description | Java doc | -|---------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------| +| Feature | Description | Java doc | +| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | | Table partitioning | Equal to `PARTITION BY` in Apache Hive, It is a partitioning strategy that is used to split a table into parts based on partition keys. Some table engine may not support this feature | [Partition](pathname:///docs/0.5.1/api/java/org/apache/gravitino/dto/rel/partitioning/Partitioning.html) | | Table bucketing | Equal to `CLUSTERED BY` in Apache Hive, Bucketing a.k.a (Clustering) is a technique to split the data into more manageable files/parts, (By specifying the number of buckets to create). The value of the bucketing column will be hashed by a user-defined number into buckets. | [Distribution](pathname:///docs/0.5.1/api/java/org/apache/gravitino/rel/expressions/distributions/Distribution.html) | | Table sort ordering | Equal to `SORTED BY` in Apache Hive, sort ordering is a method to sort the data in specific ways such as by a column or a function, and then store table data. it will highly improve the query performance under certain scenarios. | [SortOrder](pathname:///docs/0.5.1/api/java/org/apache/gravitino/rel/expressions/sorts/SortOrder.html) | @@ -868,9 +867,10 @@ tableCatalog.loadTable(NameIdentifier.of("schema", "table")); :::note + - When Gravitino loads a table from a catalog with various data types, if Gravitino is unable to parse the data type, it will use an **[External Type](#external-type)** to preserve the original data type, ensuring that the table can be loaded successfully. - When Gravitino loads a table from a catalog that supports default value, if Gravitino is unable to parse the default value, it will use an **[Unparsed Expression](./expression.md#unparsed-expression)** to preserve the original default value, ensuring that the table can be loaded successfully. -::: + ::: ### Alter a table @@ -891,7 +891,7 @@ curl -X PUT -H "Accept: application/vnd.gravitino.v1+json" \ "property": "key3", "value": "value3" } - ] + ] }' http://localhost:8090/api/metalakes/metalake/catalogs/catalog/schemas/schema/tables/table ``` @@ -916,7 +916,7 @@ Table t = tableCatalog.alterTable(NameIdentifier.of("schema", "table"), Currently, Gravitino supports the following changes to a table: | Supported modification | JSON | Java | -|--------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------| +| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------- | | Rename table | `{"@type":"rename","newName":"table_renamed"}` | `TableChange.rename("table_renamed")` | | Update comment | `{"@type":"updateComment","newComment":"new_comment"}` | `TableChange.updateComment("new_comment")` | | Set a table property | `{"@type":"setProperty","property":"key1","value":"value1"}` | `TableChange.setProperty("key1", "value1")` | @@ -966,10 +966,10 @@ tableCatalog.purgeTable(NameIdentifier.of("schema", "table")); -There are two ways to remove a table: `dropTable` and `purgeTable`: +There are two ways to remove a table: `dropTable` and `purgeTable`: -* `dropTable` removes both the metadata and the directory associated with the table from the file system if the table is not an external table. In case of an external table, only the associated metadata is removed. -* `purgeTable` completely removes both the metadata and the directory associated with the table and skipping trash, if the table is an external table or the catalogs don't support purge table, `UnsupportedOperationException` is thrown. +- `dropTable` removes both the metadata and the directory associated with the table from the file system if the table is not an external table. In case of an external table, only the associated metadata is removed. +- `purgeTable` completely removes both the metadata and the directory associated with the table and skipping trash, if the table is an external table or the catalogs don't support purge table, `UnsupportedOperationException` is thrown. Hive catalog and lakehouse-iceberg catalog supports `purgeTable` while jdbc-mysql and jdbc-postgresql catalog doesn't support. diff --git a/docs/manage-table-partition-using-gravitino.md b/docs/manage-table-partition-using-gravitino.md index bf7f1a4c1f1..f4fad19483e 100644 --- a/docs/manage-table-partition-using-gravitino.md +++ b/docs/manage-table-partition-using-gravitino.md @@ -19,12 +19,12 @@ Although many catalogs inherently manage partitions automatically, there are sce The following table shows the partition operations supported across various catalogs in Gravitino: -| Operation | Hive catalog | Iceberg catalog | Jdbc-Mysql catalog | Jdbc-PostgreSQL catalog | -|-----------------------|--------------|-------------------------------------------------------------------------------|--------------------|-------------------------| -| Add Partition | ✔ | ✘ | ✘ | ✘ | -| Get Partition by Name | ✔ | ✘ | ✘ | ✘ | -| List Partition Names | ✔ | ✘ | ✘ | ✘ | -| List Partitions | ✔ | ✘ | ✘ | ✘ | +| Operation | Hive catalog | Iceberg catalog | Jdbc-Mysql catalog | Jdbc-PostgreSQL catalog | +| --------------------- | ------------ | ------------------------------------------------------------------------- | ------------------ | ----------------------- | +| Add Partition | ✔ | ✘ | ✘ | ✘ | +| Get Partition by Name | ✔ | ✘ | ✘ | ✘ | +| List Partition Names | ✔ | ✘ | ✘ | ✘ | +| List Partitions | ✔ | ✘ | ✘ | ✘ | | Drop Partition | ✔ | 🚀([Coming Soon](https://github.com/apache/gravitino/issues/1655)) | ✘ | ✘ | :::tip[WELCOME FEEDBACK] @@ -38,7 +38,7 @@ If you need additional partition management support for a specific catalog, plea You must match the partition types you want to add with the table's [partitioning](./table-partitioning-bucketing-sort-order-indexes.md#table-partitioning) types; Gravitino currently supports adding the following partition types: | Partition Type | Description | -|----------------|------------------------------------------------------------------------------------------------------------------------------------------------| +| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | | identity | An identity partition represents a result of identity [partitioning](./table-partitioning-bucketing-sort-order-indexes.md#table-partitioning). | | range | A range partition represents a result of range [partitioning](./table-partitioning-bucketing-sort-order-indexes.md#table-partitioning). | | list | A list partition represents a result of list [partitioning](./table-partitioning-bucketing-sort-order-indexes.md#table-partitioning). | @@ -52,14 +52,7 @@ For JSON examples: { "type": "identity", "name": "dt=2008-08-08/country=us", - "fieldNames": [ - [ - "dt" - ], - [ - "country" - ] - ], + "fieldNames": [["dt"], ["country"]], "values": [ { "type": "literal", @@ -253,7 +246,7 @@ GravitinoClient gravitinoClient = GravitinoClient .build(); // Assume that you have a partitioned table named "metalake.catalog.schema.table". -Partition addedPartition = +Partition addedPartition = gravitinoClient .loadCatalog("catalog") .asTableCatalog() @@ -298,7 +291,7 @@ GravitinoClient gravitinoClient = GravitinoClient .build(); // Assume that you have a partitioned table named "metalake.catalog.schema.table". -Partition Partition = +Partition Partition = gravitinoClient .loadCatalog("catalog") .asTableCatalog() @@ -334,7 +327,7 @@ GravitinoClient gravitinoClient = GravitinoClient .build(); // Assume that you have a partitioned table named "metalake.catalog.schema.table". -String[] partitionNames = +String[] partitionNames = gravitinoClient .loadCatalog("catalog") .asTableCatalog() @@ -405,7 +398,7 @@ GravitinoClient gravitinoClient = GravitinoClient .build(); // Assume that you have a partitioned table named "metalake.catalog.schema.table". -Partition Partition = +Partition Partition = gravitinoClient .loadCatalog("catalog") .asTableCatalog() @@ -415,4 +408,4 @@ Partition Partition = ``` - \ No newline at end of file + diff --git a/docs/open-api/catalogs.yaml b/docs/open-api/catalogs.yaml index ab68c06ed2a..8587ea673eb 100644 --- a/docs/open-api/catalogs.yaml +++ b/docs/open-api/catalogs.yaml @@ -18,9 +18,7 @@ # --- - paths: - /metalakes/{metalake}/catalogs: parameters: - $ref: "./openapi.yaml#/components/parameters/metalake" @@ -106,9 +104,9 @@ paths: - code properties: code: - type: integer - format: int32 - description: Status code of the response + type: integer + format: int32 + description: Status code of the response type: type: string description: Internal type definition of the exception @@ -122,9 +120,7 @@ paths: description: The stack trace of the exception examples: TestConnectionSuccess: - value: { - "code": 0 - } + value: { "code": 0 } TestConnectionFailed: $ref: "#/components/examples/ConnectionFailedException" CatalogAlreadyExists: @@ -136,8 +132,6 @@ paths: "5xx": $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" - - /metalakes/{metalake}/catalogs/{catalog}: parameters: - $ref: "./openapi.yaml#/components/parameters/metalake" @@ -192,14 +186,14 @@ paths: NoSuchCatalogException: $ref: "#/components/examples/NoSuchCatalogException" "409": - description: Conflict - The target catalog already exists in the specified metalake - content: - application/vnd.gravitino.v1+json: - schema: - $ref: "./openapi.yaml#/components/schemas/ErrorModel" - examples: - CatalogAlreadyExistsException: - $ref: "#/components/examples/CatalogAlreadyExistsException" + description: Conflict - The target catalog already exists in the specified metalake + content: + application/vnd.gravitino.v1+json: + schema: + $ref: "./openapi.yaml#/components/schemas/ErrorModel" + examples: + CatalogAlreadyExistsException: + $ref: "#/components/examples/CatalogAlreadyExistsException" "5xx": $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" @@ -216,8 +210,6 @@ paths: "5xx": $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" - - components: parameters: details: @@ -230,7 +222,6 @@ components: default: false schemas: - Catalog: type: object description: A catalog @@ -268,7 +259,7 @@ components: properties: type: object description: Configured string to string map of properties for the catalog - default: { } + default: {} additionalProperties: type: string @@ -334,7 +325,7 @@ components: type: object description: A map of properties for the catalog nullable: true - default: { } + default: {} additionalProperties: type: string @@ -375,10 +366,7 @@ components: newName: type: string description: The new name of the catalog - example: { - "@type": "rename", - "newName": "my_catalog_new" - } + example: { "@type": "rename", "newName": "my_catalog_new" } UpdateCatalogCommentRequest: type: object @@ -393,10 +381,11 @@ components: newComment: type: string description: The new comment of the catalog - example: { - "@type": "updateComment", - "newComment": "This is my new catalog comment" - } + example: + { + "@type": "updateComment", + "newComment": "This is my new catalog comment", + } SetCatalogPropertyRequest: type: object @@ -415,11 +404,7 @@ components: value: type: string description: The value to set - example: { - "@type": "setProperty", - "property": "key1", - "value": "value1" - } + example: { "@type": "setProperty", "property": "key1", "value": "value1" } RemoveCatalogPropertyRequest: type: object @@ -434,14 +419,9 @@ components: property: type: string description: The property to remove - example: { - "@type": "removeProperty", - "property": "key2" - } - + example: { "@type": "removeProperty", "property": "key2" } responses: - CatalogResponse: description: Returns included catalog object content: @@ -461,117 +441,123 @@ components: CatalogResponse: $ref: "#/components/examples/CatalogResponse" - examples: CatalogListResponse: - value: { - "code": 0, - "identifiers": [ - { - "namespace": [ - "my_metalake" - ], - "name": "my_hive_catalog" - } - ] - } + value: + { + "code": 0, + "identifiers": + [{ "namespace": ["my_metalake"], "name": "my_hive_catalog" }], + } CatalogInfoListResponse: - value: { - "code": 0, - "catalogs": [ - { - "name": "my_hive_catalog", - "type": "relational", - "provider": "hive", - "comment": "This is my hive catalog", - "properties": { - "key1": "value1", - "gravitino.bypass.hive.metastore.client.capability.check": "false", - "metastore.uris": "thrift://127.0.0.1:9083" - }, - "audit": { - "creator": "gravitino", - "createTime": "2023-12-08T03:41:25.595Z" - } - }, - { - "name": "my_hadoop_catalog", - "type": "fileset", - "provider": "hadoop", - "comment": "This is my hadoop catalog", - "properties": { - "key2": "value2" - }, - "audit": { - "creator": "gravitino", - "createTime": "2023-12-08T06:41:25.595Z" - } - } - ] - } - - CatalogCreate: - value: { - "name": "my_hive_catalog", - "type": "relational", - "provider": "hive", - "comment": "This is my hive catalog", - "properties": { - "metastore.uris": "thrift://127.0.0.1:9083", - "key1": "value1" + value: + { + "code": 0, + "catalogs": + [ + { + "name": "my_hive_catalog", + "type": "relational", + "provider": "hive", + "comment": "This is my hive catalog", + "properties": + { + "key1": "value1", + "gravitino.bypass.hive.metastore.client.capability.check": "false", + "metastore.uris": "thrift://127.0.0.1:9083", + }, + "audit": + { + "creator": "gravitino", + "createTime": "2023-12-08T03:41:25.595Z", + }, + }, + { + "name": "my_hadoop_catalog", + "type": "fileset", + "provider": "hadoop", + "comment": "This is my hadoop catalog", + "properties": { "key2": "value2" }, + "audit": + { + "creator": "gravitino", + "createTime": "2023-12-08T06:41:25.595Z", + }, + }, + ], } - } - CatalogResponse: - value: { - "code": 0, - "catalog": { + CatalogCreate: + value: + { "name": "my_hive_catalog", "type": "relational", "provider": "hive", "comment": "This is my hive catalog", - "properties": { - "key1": "value1", - "gravitino.bypass.hive.metastore.client.capability.check": "false", - "metastore.uris": "thrift://127.0.0.1:9083" - }, - "audit": { - "creator": "gravitino", - "createTime": "2023-12-08T03:41:25.595Z" - } + "properties": + { "metastore.uris": "thrift://127.0.0.1:9083", "key1": "value1" }, + } + + CatalogResponse: + value: + { + "code": 0, + "catalog": + { + "name": "my_hive_catalog", + "type": "relational", + "provider": "hive", + "comment": "This is my hive catalog", + "properties": + { + "key1": "value1", + "gravitino.bypass.hive.metastore.client.capability.check": "false", + "metastore.uris": "thrift://127.0.0.1:9083", + }, + "audit": + { + "creator": "gravitino", + "createTime": "2023-12-08T03:41:25.595Z", + }, + }, } - } CatalogAlreadyExistsException: - value: { - "code": 1004, - "type": "CatalogAlreadyExistsException", - "message": "Failed to operate catalog(s) [my_catalog] operation [CREATE], reason [CatalogAlreadyExistsException]", - "stack": [ - "org.apache.gravitino.exceptions.CatalogAlreadyExistsException: Catalog my_catalog already exists", - "..." - ] - } + value: + { + "code": 1004, + "type": "CatalogAlreadyExistsException", + "message": "Failed to operate catalog(s) [my_catalog] operation [CREATE], reason [CatalogAlreadyExistsException]", + "stack": + [ + "org.apache.gravitino.exceptions.CatalogAlreadyExistsException: Catalog my_catalog already exists", + "...", + ], + } ConnectionFailedException: - value: { - "code": 1007, - "type": "ConnectionFailedException", - "message": "Failed to run getAllDatabases in Hive Metastore: Failed to connect to Hive Metastore", - "stack": [ - "org.apache.gravitino.exceptions.ConnectionFailedException: Failed to run getAllDatabases in Hive Metastore: Failed to connect to Hive Metastore", - "..." - ] - } + value: + { + "code": 1007, + "type": "ConnectionFailedException", + "message": "Failed to run getAllDatabases in Hive Metastore: Failed to connect to Hive Metastore", + "stack": + [ + "org.apache.gravitino.exceptions.ConnectionFailedException: Failed to run getAllDatabases in Hive Metastore: Failed to connect to Hive Metastore", + "...", + ], + } NoSuchCatalogException: - value: { - "code": 1003, - "type": "NoSuchCatalogException", - "message": "Failed to operate catalog(s) [test] operation [LOAD] under metalake [my_test_metalake], reason [NoSuchCatalogException]", - "stack": [ - "org.apache.gravitino.exceptions.NoSuchCatalogException: Catalog my_test_metalake.test does not exist", - "..." - ] - } + value: + { + "code": 1003, + "type": "NoSuchCatalogException", + "message": "Failed to operate catalog(s) [test] operation [LOAD] under metalake [my_test_metalake], reason [NoSuchCatalogException]", + "stack": + [ + "org.apache.gravitino.exceptions.NoSuchCatalogException: Catalog my_test_metalake.test does not exist", + "...", + ], + } diff --git a/docs/open-api/datatype.yaml b/docs/open-api/datatype.yaml index eecd2e921c4..5f17068b5c3 100644 --- a/docs/open-api/datatype.yaml +++ b/docs/open-api/datatype.yaml @@ -18,7 +18,6 @@ # --- - components: schemas: DataType: @@ -72,13 +71,7 @@ components: type: array items: $ref: "#/components/schemas/DataType" - example: { - "type": "union", - "types": [ - "string", - "integer" - ] - } + example: { "type": "union", "types": ["string", "integer"] } MapType: type: object @@ -100,12 +93,13 @@ components: description: Whether the value of the map contains null values nullable: true default: true - example: { - "type": "map", - "keyType": "string", - "valueType": "integer", - "valueContainsNull": false - } + example: + { + "type": "map", + "keyType": "string", + "valueType": "integer", + "valueContainsNull": false, + } ListType: type: object @@ -124,11 +118,8 @@ components: default: true elementType: $ref: "#/components/schemas/DataType" - example: { - "type": "list", - "elementType": "integer", - "containsNull": false - } + example: + { "type": "list", "elementType": "integer", "containsNull": false } StructType: type: object @@ -144,23 +135,25 @@ components: type: array items: $ref: "#/components/schemas/StructField" - example: { - "type": "struct", - "fields": [ - { - "name": "id", - "type": "integer", - "nullable": false, - "comment": "The id of the user" - }, - { - "name": "name", - "type": "string", - "nullable": false, - "comment": "The name of the user" - } - ] - } + example: + { + "type": "struct", + "fields": + [ + { + "name": "id", + "type": "integer", + "nullable": false, + "comment": "The id of the user", + }, + { + "name": "name", + "type": "string", + "nullable": false, + "comment": "The name of the user", + }, + ], + } StructField: type: object @@ -196,12 +189,7 @@ components: unparsedType: type: string description: The unparsed type - example: { - "type": "unparsed", - "unparsedType": [ - "unknown-type" - ] - } + example: { "type": "unparsed", "unparsedType": ["unknown-type"] } ExternalType: type: object @@ -216,7 +204,4 @@ components: catalogString: type: string description: The string representation of this type in the catalog - example: { - "type": "external", - "externalType": "user-defined" - } \ No newline at end of file + example: { "type": "external", "externalType": "user-defined" } diff --git a/docs/open-api/expression.yaml b/docs/open-api/expression.yaml index 3e77d10ffce..523885480da 100644 --- a/docs/open-api/expression.yaml +++ b/docs/open-api/expression.yaml @@ -18,7 +18,6 @@ # --- - components: schemas: FunctionArg: @@ -80,4 +79,4 @@ components: type: array description: The arguments of the function items: - $ref: "#/components/schemas/FunctionArg" \ No newline at end of file + $ref: "#/components/schemas/FunctionArg" diff --git a/docs/open-api/filesets.yaml b/docs/open-api/filesets.yaml index 0bf654cd84e..3734ec82dc3 100644 --- a/docs/open-api/filesets.yaml +++ b/docs/open-api/filesets.yaml @@ -19,9 +19,7 @@ # --- - paths: - /metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/filesets: parameters: - $ref: "./openapi.yaml#/components/parameters/metalake" @@ -69,7 +67,6 @@ paths: "5xx": $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" - /metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/filesets/{fileset}: parameters: - $ref: "./openapi.yaml#/components/parameters/metalake" @@ -160,9 +157,7 @@ paths: "5xx": $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" - components: - schemas: Fileset: type: object @@ -190,7 +185,7 @@ components: nullable: true default: {} additionalProperties: - type: string + type: string FilesetCreateRequest: type: object required: @@ -209,7 +204,8 @@ components: nullable: true storageLocation: type: string - description: The location of the fileset. If the storage location of managed fileset is empty, it will \ + description: + The location of the fileset. If the storage location of managed fileset is empty, it will \ use the location of namespace. The storage location of external fileset must be set. nullable: true properties: @@ -218,7 +214,7 @@ components: nullable: true default: {} additionalProperties: - type: string + type: string FilesetUpdatesRequest: type: object @@ -254,14 +250,11 @@ components: type: string description: The type of the update enum: - - rename + - rename newName: type: string description: The new name of the fileset - example: { - "@type": "rename", - "newName": "newName" - } + example: { "@type": "rename", "newName": "newName" } SetFilesetPropertyRequest: type: object @@ -281,11 +274,7 @@ components: value: type: string description: The value of the property to set - example: { - "@type": "setProperty", - "property": "key", - "value": "value" - } + example: { "@type": "setProperty", "property": "key", "value": "value" } UpdateFilesetCommentRequest: type: object @@ -301,10 +290,7 @@ components: newComment: type: string description: The new comment of the fileset - example: { - "@type": "updateComment", - "newComment": "new comment" - } + example: { "@type": "updateComment", "newComment": "new comment" } RemoveFilesetPropertyRequest: type: object @@ -320,10 +306,7 @@ components: property: type: string description: The property to remove - example: { - "@type": "removeProperty", - "property": "key1" - } + example: { "@type": "removeProperty", "property": "key1" } RemoveFilesetCommentRequest: type: object @@ -335,9 +318,7 @@ components: description: The type of the update enum: - removeComment - example: { - "@type": "removeComment" - } + example: { "@type": "removeComment" } responses: FilesetResponse: @@ -359,51 +340,46 @@ components: FilesetResponse: $ref: "#/components/examples/FilesetResponse" - examples: FilesetCreateRequest: - value: { - "name": "fileset1", - "type": "managed", - "comment": "This is a comment", - "storageLocation": "s3://bucket/path", - "properties": { - "key1": "value1", - "key2": "value2" - } - } - - FilesetResponse: - value: { - "code": 0, - "fileset" : { + value: + { "name": "fileset1", "type": "managed", "comment": "This is a comment", - "storageLocation": "hdfs://host/user/s_fileset/schema/fileset1", - "properties": { - "key1": "value1", - "key2": "value2" - } + "storageLocation": "s3://bucket/path", + "properties": { "key1": "value1", "key2": "value2" }, + } + + FilesetResponse: + value: + { + "code": 0, + "fileset": + { + "name": "fileset1", + "type": "managed", + "comment": "This is a comment", + "storageLocation": "hdfs://host/user/s_fileset/schema/fileset1", + "properties": { "key1": "value1", "key2": "value2" }, + }, } - } FilesetAlreadyExistsException: - value: { - "code": 1004, - "type": "FilesetAlreadyExistsException", - "message": "Fileset already exists", - "stack": [ - "java.lang.FilesetAlreadyExistsException: Fileset already exists" - ] - } + value: + { + "code": 1004, + "type": "FilesetAlreadyExistsException", + "message": "Fileset already exists", + "stack": + ["java.lang.FilesetAlreadyExistsException: Fileset already exists"], + } NoSuchFilesetException: - value: { - "code": 1003, - "type": "NoSuchFilesetException", - "message": "Fileset does not exist", - "stack": [ - "java.lang.NoSuchFilesetException: Fileset does not exist" - ] - } + value: + { + "code": 1003, + "type": "NoSuchFilesetException", + "message": "Fileset does not exist", + "stack": ["java.lang.NoSuchFilesetException: Fileset does not exist"], + } diff --git a/docs/open-api/indexes.yaml b/docs/open-api/indexes.yaml index 3adcaba5ad6..ac40982a782 100644 --- a/docs/open-api/indexes.yaml +++ b/docs/open-api/indexes.yaml @@ -19,7 +19,6 @@ # --- - components: schemas: IndexesSpec: diff --git a/docs/open-api/metalakes.yaml b/docs/open-api/metalakes.yaml index 241673477dc..7647c33110a 100644 --- a/docs/open-api/metalakes.yaml +++ b/docs/open-api/metalakes.yaml @@ -17,12 +17,9 @@ # under the License. # - --- - paths: /metalakes: - get: tags: - metalake @@ -129,8 +126,7 @@ paths: MetalakeAlreadyExistsException: $ref: "#/components/examples/MetalakeAlreadyExistsException" "500": - description: - Internal server error. It is possible that the server + description: Internal server error. It is possible that the server encountered a storage issue. content: application/vnd.gravitino.v1+json: @@ -152,9 +148,7 @@ paths: $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" components: - schemas: - MetalakeCreateRequest: type: object required: @@ -212,10 +206,7 @@ components: newName: type: string description: The new name of the metalake - example: { - "@type": "rename", - "newName": "my_metalake_new" - } + example: { "@type": "rename", "newName": "my_metalake_new" } UpdateMetalakeCommentRequest: type: object @@ -230,10 +221,11 @@ components: newComment: type: string description: The new comment of the metalake - example: { - "@type": "updateComment", - "newComment": "This is my new metalake comment" - } + example: + { + "@type": "updateComment", + "newComment": "This is my new metalake comment", + } SetMetalakePropertyRequest: type: object @@ -252,11 +244,8 @@ components: value: type: string description: The value to set - example: { - "@type": "setProperty", - "property": "key1", - "value": "value1_new" - } + example: + { "@type": "setProperty", "property": "key1", "value": "value1_new" } RemoveMetalakePropertyRequest: type: object @@ -271,10 +260,7 @@ components: property: type: string description: The property to remove - example: { - "@type": "removeProperty", - "property": "key2" - } + example: { "@type": "removeProperty", "property": "key2" } Metalake: type: object @@ -298,25 +284,27 @@ components: properties: type: object description: Configured string to string map of properties for the Metalake - default: { } + default: {} additionalProperties: type: string - example: { - "name": "my_metalake", - "comment": "This is my metalake", - "properties": { - "key1": "value1", - "key2": "value2", - "gravitino.identifier": "gravitino.v1.uid4516733622157792920" - }, - "audit": { - "creator": "gravitino", - "createTime": "2023-12-07T14:04:17.349Z" + example: + { + "name": "my_metalake", + "comment": "This is my metalake", + "properties": + { + "key1": "value1", + "key2": "value2", + "gravitino.identifier": "gravitino.v1.uid4516733622157792920", + }, + "audit": + { + "creator": "gravitino", + "createTime": "2023-12-07T14:04:17.349Z", + }, } - } responses: - ListMetalakesResponse: description: Returns a list of all metalakes. content: @@ -357,52 +345,58 @@ components: $ref: "#/components/examples/MetalakeResponse" examples: - MetalakeAlreadyExistsException: - value: { - "code": 1004, - "type": "MetalakeAlreadyExistsException", - "message": "Failed to operate metalake(s) [my_metalake] operation [CREATE], reason [MetalakeAlreadyExistsException]", - "stack": [ - "org.apache.gravitino.exceptions.MetalakeAlreadyExistsException: Metalake my_metalake already exists", - "..." - ] - } + value: + { + "code": 1004, + "type": "MetalakeAlreadyExistsException", + "message": "Failed to operate metalake(s) [my_metalake] operation [CREATE], reason [MetalakeAlreadyExistsException]", + "stack": + [ + "org.apache.gravitino.exceptions.MetalakeAlreadyExistsException: Metalake my_metalake already exists", + "...", + ], + } NoSuchMetalakeException: - value: { - "code": 1003, - "type": "NoSuchMetalakeException", - "message": "Failed to operate metalake(s) [test] operation [LOAD], reason [NoSuchMetalakeException]", - "stack": [ - "org.apache.gravitino.exceptions.NoSuchMetalakeException: Metalake test does not exist", - "..." ] - } + value: + { + "code": 1003, + "type": "NoSuchMetalakeException", + "message": "Failed to operate metalake(s) [test] operation [LOAD], reason [NoSuchMetalakeException]", + "stack": + [ + "org.apache.gravitino.exceptions.NoSuchMetalakeException: Metalake test does not exist", + "...", + ], + } MetalakeCreate: - value: { - "name": "my_metalake", - "comment": "This is my metalake", - "properties": { - "key1": "value1", - "key2": "value2" + value: + { + "name": "my_metalake", + "comment": "This is my metalake", + "properties": { "key1": "value1", "key2": "value2" }, } - } MetalakeResponse: - value: { - "code": 0, - "metalake": { - "name": "my_metalake", - "comment": "This is my metalake", - "properties": { - "key1": "value1", - "key2": "value2", - "gravitino.identifier": "gravitino.v1.uid2062071866014250017" - }, - "audit": { - "creator": "gravitino", - "createTime": "2023-12-06T14:21:24.982Z" - } + value: + { + "code": 0, + "metalake": + { + "name": "my_metalake", + "comment": "This is my metalake", + "properties": + { + "key1": "value1", + "key2": "value2", + "gravitino.identifier": "gravitino.v1.uid2062071866014250017", + }, + "audit": + { + "creator": "gravitino", + "createTime": "2023-12-06T14:21:24.982Z", + }, + }, } - } diff --git a/docs/open-api/openapi.yaml b/docs/open-api/openapi.yaml index 9218a6b679a..77204a42af2 100644 --- a/docs/open-api/openapi.yaml +++ b/docs/open-api/openapi.yaml @@ -98,9 +98,7 @@ paths: $ref: "./topics.yaml#/paths/~1metalakes~1%7Bmetalake%7D~1catalogs~1%7Bcatalog%7D~1schemas~1%7Bschema%7D~1topics~1%7Btopic%7D" components: - schemas: - Audit: type: object description: Audit information for a Gravitino resource. @@ -162,7 +160,6 @@ components: description: The name of the entity responses: - EntityListResponse: description: A list of entities content: @@ -190,7 +187,6 @@ components: TableListResponse: $ref: "./tables.yaml#/components/examples/TableListResponse" - BadRequestErrorResponse: description: Indicates a bad request error. It could be caused by an unexpected request @@ -200,12 +196,13 @@ components: content: application/vnd.gravitino.v1+json: schema: - $ref: '#/components/schemas/ErrorModel' - example: { - "code": 1003, - "type": "BadRequestException", - "message": "Malformed request" - } + $ref: "#/components/schemas/ErrorModel" + example: + { + "code": 1003, + "type": "BadRequestException", + "message": "Malformed request", + } ServerErrorResponse: description: @@ -216,14 +213,13 @@ components: application/vnd.gravitino.v1+json: schema: $ref: "#/components/schemas/ErrorModel" - example: { - "code": 1002, - "type": "RuntimeException", - "message": "Internal Server Error", - "stack": [ - "java.lang.RuntimeException: Internal Server Error" - ] - } + example: + { + "code": 1002, + "type": "RuntimeException", + "message": "Internal Server Error", + "stack": ["java.lang.RuntimeException: Internal Server Error"], + } DropResponse: description: Represents a response for a drop operation @@ -292,7 +288,6 @@ components: type: string securitySchemes: - OAuth2WithJWT: type: oauth2 description: OAuth2 with JWT @@ -309,4 +304,3 @@ components: KerberosAuth: type: http scheme: negotiate - diff --git a/docs/open-api/partitioning.yaml b/docs/open-api/partitioning.yaml index 2c54f7ddea7..26a360fc42a 100644 --- a/docs/open-api/partitioning.yaml +++ b/docs/open-api/partitioning.yaml @@ -18,7 +18,6 @@ # --- - components: schemas: PartitioningSpec: @@ -200,4 +199,4 @@ components: type: array description: The arguments of the partitioning function items: - $ref: "./expression.yaml#/components/schemas/FunctionArg" \ No newline at end of file + $ref: "./expression.yaml#/components/schemas/FunctionArg" diff --git a/docs/open-api/partitions.yaml b/docs/open-api/partitions.yaml index 92947fd97d8..8fdff728e22 100644 --- a/docs/open-api/partitions.yaml +++ b/docs/open-api/partitions.yaml @@ -19,9 +19,7 @@ # --- - paths: - /metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/tables/{table}/partitions: parameters: - $ref: "./openapi.yaml#/components/parameters/metalake" @@ -136,7 +134,6 @@ paths: "5xx": $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" - components: parameters: details: @@ -221,7 +218,6 @@ components: items: $ref: "#/components/schemas/PartitionSpec" - Properties: type: object description: The properties of the partition @@ -261,7 +257,7 @@ components: items: $ref: "./expression.yaml#/components/schemas/Literal" properties: - $ref: "#/components/schemas/Properties" + $ref: "#/components/schemas/Properties" RangePartition: type: object @@ -282,7 +278,7 @@ components: lower: $ref: "./expression.yaml#/components/schemas/Literal" properties: - $ref: "#/components/schemas/Properties" + $ref: "#/components/schemas/Properties" ListPartition: type: object @@ -306,7 +302,6 @@ components: $ref: "#/components/schemas/Properties" responses: - PartitionListResponse: description: Returns list of partition objects content: @@ -314,7 +309,6 @@ components: schema: $ref: "#/components/schemas/PartitionListResponse" - PartitionResponse: description: Returns include the partition object content: @@ -336,141 +330,115 @@ components: examples: PartitionNameListResponse: - value: { - "code": 0, - "names": [ - "p1", - "p2" - ] - } + value: { "code": 0, "names": ["p1", "p2"] } PartitionListResponse: - value: { - "code": 0, - "partitions": [ - { - "type": "identity", - "name": "p1", - "fieldNames": [ - [ - "col1" - ] - ], - "values": [ + value: + { + "code": 0, + "partitions": + [ { - "type": "literal", - "dataType": "string", - "value": "v1" - } - ], - "properties": {} - }, - { - "type": "identity", - "name": "p2", - "fieldNames": [ - [ - "col1" - ] - ], - "values": [ + "type": "identity", + "name": "p1", + "fieldNames": [["col1"]], + "values": + [{ "type": "literal", "dataType": "string", "value": "v1" }], + "properties": {}, + }, { - "type": "literal", - "dataType": "string", - "value": "v2" - } + "type": "identity", + "name": "p2", + "fieldNames": [["col1"]], + "values": + [{ "type": "literal", "dataType": "string", "value": "v2" }], + "properties": {}, + }, ], - "properties": {} - } - ] - } + } HiveAddPartition: - value: { - "partitions": [ - { - "type": "identity", - "fieldNames": [ - [ - "hive_col_name2" - ], - [ - "hive_col_name3" - ] - ], - "values": [ + value: + { + "partitions": + [ { - "type": "literal", - "dataType": "date", - "value": "2023-01-02" + "type": "identity", + "fieldNames": [["hive_col_name2"], ["hive_col_name3"]], + "values": + [ + { + "type": "literal", + "dataType": "date", + "value": "2023-01-02", + }, + { + "type": "literal", + "dataType": "string", + "value": "gravitino_it_test2", + }, + ], + "properties": null, }, - { - "type": "literal", - "dataType": "string", - "value": "gravitino_it_test2" - } ], - "properties": null - } - ] - } + } HivePartitionResponse: - value: { - "code": 0, - "partition": { - "type": "identity", - "name": "hive_col_name2=2023-01-01/hive_col_name3=gravitino_it_test", - "fieldNames": [ - [ - "hive_col_name2" - ], - [ - "hive_col_name3" - ] - ], - "values": [ + value: + { + "code": 0, + "partition": { - "type": "literal", - "dataType": "string", - "value": "2023-01-01" + "type": "identity", + "name": "hive_col_name2=2023-01-01/hive_col_name3=gravitino_it_test", + "fieldNames": [["hive_col_name2"], ["hive_col_name3"]], + "values": + [ + { + "type": "literal", + "dataType": "string", + "value": "2023-01-01", + }, + { + "type": "literal", + "dataType": "string", + "value": "gravitino_it_test", + }, + ], + "properties": + { + "totalSize": "2", + "numRows": "0", + "rawDataSize": "0", + "COLUMN_STATS_ACCURATE": '{"BASIC_STATS":"true"}', + "numFiles": "1", + "transient_lastDdlTime": "1706950516", + }, }, - { - "type": "literal", - "dataType": "string", - "value": "gravitino_it_test" - } - ], - "properties": { - "totalSize": "2", - "numRows": "0", - "rawDataSize": "0", - "COLUMN_STATS_ACCURATE": "{\"BASIC_STATS\":\"true\"}", - "numFiles": "1", - "transient_lastDdlTime": "1706950516" - } } - } PartitionAlreadyExistsErrorResponse: - value: { - "code": 1004, - "type": "PartitionAlreadyExistsException", - "message": "Failed to operate partition(s) operation [CREATE] of table [table1], reason [p1]", - "stack": [ - "org.apache.gravitino.exceptions.PartitionAlreadyExistsException: p1", - "..." - ] - } + value: + { + "code": 1004, + "type": "PartitionAlreadyExistsException", + "message": "Failed to operate partition(s) operation [CREATE] of table [table1], reason [p1]", + "stack": + [ + "org.apache.gravitino.exceptions.PartitionAlreadyExistsException: p1", + "...", + ], + } NoSuchPartitionException: - value: { - "code": 1003, - "type": "NoSuchPartitionException", - "message": "Failed to operate partition(s) operation [GET] of table [table1], reason [p3]", - "stack": [ - "org.apache.gravitino.exceptions.NoSuchPartitionException: p3", - "..." - ] - } - + value: + { + "code": 1003, + "type": "NoSuchPartitionException", + "message": "Failed to operate partition(s) operation [GET] of table [table1], reason [p3]", + "stack": + [ + "org.apache.gravitino.exceptions.NoSuchPartitionException: p3", + "...", + ], + } diff --git a/docs/open-api/schemas.yaml b/docs/open-api/schemas.yaml index ba830a19ed3..a7f8862632a 100644 --- a/docs/open-api/schemas.yaml +++ b/docs/open-api/schemas.yaml @@ -18,9 +18,7 @@ # --- - paths: - /metalakes/{metalake}/catalogs/{catalog}/schemas: parameters: - $ref: "./openapi.yaml#/components/parameters/metalake" @@ -152,9 +150,7 @@ paths: $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" components: - schemas: - SchemaCreateRequest: type: object required: @@ -171,7 +167,7 @@ components: type: object description: A map of properties for the schema nullable: true - default: { } + default: {} additionalProperties: type: string @@ -195,7 +191,7 @@ components: type: object description: A map of properties for the schema nullable: true - default: { } + default: {} additionalProperties: type: string @@ -254,10 +250,7 @@ components: property: type: string description: The name of the property to remove - example: { - "@type": "removeProperty", - "property": "key2" - } + example: { "@type": "removeProperty", "property": "key2" } responses: SchemaResponse: @@ -279,69 +272,77 @@ components: SchemaResponse: $ref: "#/components/examples/SchemaResponse" - examples: SchemaListResponse: - value: { - "code": 0, - "identifiers": [ - { - "namespace": [ - "my_metalake", - "my_hive_catalog" + value: + { + "code": 0, + "identifiers": + [ + { + "namespace": ["my_metalake", "my_hive_catalog"], + "name": "my_hive_schema", + }, ], - "name": "my_hive_schema" - } - ] - } + } SchemaCreate: - value: { - "name": "my_hive_schema", - "comment": "This is my Hive schema", - "properties": { - "location": "/user/hive/warehouse", - "key1": "value1", - "key2": "value2" + value: + { + "name": "my_hive_schema", + "comment": "This is my Hive schema", + "properties": + { + "location": "/user/hive/warehouse", + "key1": "value1", + "key2": "value2", + }, } - } SchemaResponse: - value: { - "code": 0, - "schema": { - "name": "my_hive_schema", - "comment": "This is my Hive schema", - "properties": { - "key1": "value1", - "key2": "value2", - "location": "hdfs://0.0.0.0:9000/user/hive/warehouse" - }, - "audit": { - "creator": "gravitino", - "createTime": "2023-12-08T08:37:43.531Z" - } + value: + { + "code": 0, + "schema": + { + "name": "my_hive_schema", + "comment": "This is my Hive schema", + "properties": + { + "key1": "value1", + "key2": "value2", + "location": "hdfs://0.0.0.0:9000/user/hive/warehouse", + }, + "audit": + { + "creator": "gravitino", + "createTime": "2023-12-08T08:37:43.531Z", + }, + }, } - } SchemaAlreadyExistsException: - value: { - "code": 1004, - "type": "SchemaAlreadyExistsException", - "message": "Failed to operate schema(s) [my_hive_schema] operation [CREATE] under catalog [my_hive_catalog], reason [SchemaAlreadyExistsException]", - "stack": [ - "org.apache.gravitino.exceptions.SchemaAlreadyExistsException: Hive schema (database) 'my_hive_schema' already exists in Hive Metastore", - "..." - ] - } + value: + { + "code": 1004, + "type": "SchemaAlreadyExistsException", + "message": "Failed to operate schema(s) [my_hive_schema] operation [CREATE] under catalog [my_hive_catalog], reason [SchemaAlreadyExistsException]", + "stack": + [ + "org.apache.gravitino.exceptions.SchemaAlreadyExistsException: Hive schema (database) 'my_hive_schema' already exists in Hive Metastore", + "...", + ], + } NoSuchSchemaException: - value: { - "code": 1003, - "type": "NoSuchSchemaException", - "message": "Failed to operate schema(s) [my_hive_schema1] operation [LOAD] under catalog [my_hive_catalog], reason [NoSuchSchemaException]", - "stack": [ - "org.apache.gravitino.exceptions.NoSuchSchemaException: Hive schema (database) does not exist: my_hive_schema1 in Hive Metastore", - "..." - ] - } + value: + { + "code": 1003, + "type": "NoSuchSchemaException", + "message": "Failed to operate schema(s) [my_hive_schema1] operation [LOAD] under catalog [my_hive_catalog], reason [NoSuchSchemaException]", + "stack": + [ + "org.apache.gravitino.exceptions.NoSuchSchemaException: Hive schema (database) does not exist: my_hive_schema1 in Hive Metastore", + "...", + ], + } diff --git a/docs/open-api/tables.yaml b/docs/open-api/tables.yaml index f5729f535c2..b86196066cc 100644 --- a/docs/open-api/tables.yaml +++ b/docs/open-api/tables.yaml @@ -18,9 +18,7 @@ # --- - paths: - /metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/tables: parameters: - $ref: "./openapi.yaml#/components/parameters/metalake" @@ -72,7 +70,6 @@ paths: "5xx": $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" - /metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/tables/{table}: parameters: - $ref: "./openapi.yaml#/components/parameters/metalake" @@ -165,7 +162,6 @@ paths: "5xx": $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" - components: parameters: purge: @@ -200,14 +196,14 @@ components: type: object description: A map of table properties nullable: true - default: { } + default: {} additionalProperties: type: string sortOrders: type: array description: Describes the sort order of the table data nullable: true - default: [ ] + default: [] items: $ref: "#/components/schemas/SortOrder" distribution: @@ -216,14 +212,14 @@ components: type: array description: partitioning of the table data nullable: true - default: [ ] + default: [] items: $ref: "./partitioning.yaml#/components/schemas/PartitioningSpec" indexes: type: array description: Indexes of the table nullable: true - default: [ ] + default: [] items: $ref: "./indexes.yaml#/components/schemas/IndexSpec" @@ -253,7 +249,7 @@ components: type: object description: A map of table properties nullable: true - default: { } + default: {} additionalProperties: type: string distribution: @@ -262,21 +258,21 @@ components: type: array description: Describes the sort order of the table data nullable: true - default: [ ] + default: [] items: $ref: "#/components/schemas/SortOrder" partitioning: type: array description: partitioning of the table data nullable: true - default: [ ] + default: [] items: $ref: "./partitioning.yaml#/components/schemas/PartitioningSpec" indexes: type: array description: Indexes of the table nullable: true - default: [ ] + default: [] items: $ref: "./indexes.yaml#/components/schemas/IndexSpec" @@ -305,7 +301,7 @@ components: type: array description: The arguments of the distribution function nullable: true - default: [ ] + default: [] items: $ref: "./expression.yaml#/components/schemas/FunctionArg" @@ -433,10 +429,7 @@ components: newName: type: string description: The new name of the table - example: { - "@type": "rename", - "newName": "my_hive_table_new" - } + example: { "@type": "rename", "newName": "my_hive_table_new" } UpdateTableCommentRequest: type: object @@ -451,10 +444,11 @@ components: newComment: type: string description: The new comment of the table - example: { - "@type": "updateComment", - "newComment": "This is my Hive table new comment" - } + example: + { + "@type": "updateComment", + "newComment": "This is my Hive table new comment", + } SetTablePropertyRequest: type: object @@ -473,11 +467,8 @@ components: value: type: string description: The value of the property to set - example: { - "@type": "setProperty", - "property": "key1", - "value": "value1_new" - } + example: + { "@type": "setProperty", "property": "key1", "value": "value1_new" } RemoveTablePropertyRequest: type: object @@ -492,10 +483,7 @@ components: property: type: string description: The name of the property to remove - example: { - "@type": "removeProperty", - "property": "key2" - } + example: { "@type": "removeProperty", "property": "key2" } AddTableColumnRequest: type: object @@ -537,20 +525,18 @@ components: $ref: "#/components/schemas/ColumnDefaultValue" description: The default value of the column to add nullable: true - example: { - "@type": "addColumn", - "fieldName": [ "new_column" ], - "type": "integer", - "comment": "new integer column comment", - "position": "first", - "nullable": true, - "autoIncrement": false, - "defaultValue" : { - "type": "literal", - "dataType": "integer", - "value": "1024" + example: + { + "@type": "addColumn", + "fieldName": ["new_column"], + "type": "integer", + "comment": "new integer column comment", + "position": "first", + "nullable": true, + "autoIncrement": false, + "defaultValue": + { "type": "literal", "dataType": "integer", "value": "1024" }, } - } RenameTableColumnRequest: type: object @@ -569,11 +555,12 @@ components: newFieldName: type: string description: The new name of the field - example: { - "@type": "renameColumn", - "oldFieldName": [ "existing_column" ], - "newFieldName": "existing_column_new" - } + example: + { + "@type": "renameColumn", + "oldFieldName": ["existing_column"], + "newFieldName": "existing_column_new", + } UpdateTableColumnTypeRequest: type: object @@ -592,11 +579,12 @@ components: newType: $ref: "./datatype.yaml#/components/schemas/DataType" description: The new type of the column - example: { - "@type": "updateColumnType", - "fieldName": [ "existing_column" ], - "newType": "string" - } + example: + { + "@type": "updateColumnType", + "fieldName": ["existing_column"], + "newType": "string", + } UpdateTableColumnCommentRequest: type: object @@ -615,11 +603,12 @@ components: newComment: type: string description: The new comment of the column - example: { - "@type": "updateColumnComment", - "fieldName": [ "existing_column" ], - "newComment": "existing column new comment" - } + example: + { + "@type": "updateColumnComment", + "fieldName": ["existing_column"], + "newComment": "existing column new comment", + } UpdateTableColumnPositionRequest: type: object @@ -638,13 +627,12 @@ components: newPosition: $ref: "#/components/schemas/ColumnPosition" description: The new position of the column - example: { - "@type": "updateColumnPosition", - "fieldName": [ "existing_column" ], - "newPosition": { - "after": "existing_column" + example: + { + "@type": "updateColumnPosition", + "fieldName": ["existing_column"], + "newPosition": { "after": "existing_column" }, } - } UpdateTableColumnNullabilityRequest: type: object @@ -663,11 +651,12 @@ components: nullable: type: boolean description: Whether the column is nullable - example: { - "@type": "updateColumnNullability", - "fieldName": [ "existing_column" ], - "nullable": true - } + example: + { + "@type": "updateColumnNullability", + "fieldName": ["existing_column"], + "nullable": true, + } UpdateTableColumnDefaultValueRequest: type: object @@ -685,12 +674,18 @@ components: description: The name of the column to update newDefaultValue: $ref: "#/components/schemas/ColumnDefaultValue" - description: The new default value of the column - example: { - "@type": "updateColumnDefaultValue", - "fieldName": [ "existing_column" ], - "newDefaultValue": { "type": "literal", "dataType": "varchar(100)", "value": "new default value" } - } + description: The new default value of the column + example: + { + "@type": "updateColumnDefaultValue", + "fieldName": ["existing_column"], + "newDefaultValue": + { + "type": "literal", + "dataType": "varchar(100)", + "value": "new default value", + }, + } DeleteTableColumnRequest: type: object @@ -710,12 +705,12 @@ components: description: If true, the request will not fail if the column does not exist nullable: true default: false - example: { - "@type": "deleteColumn", - "fieldName": [ "no_existing_column" ], - "ifExists": true - } - + example: + { + "@type": "deleteColumn", + "fieldName": ["no_existing_column"], + "ifExists": true, + } ColumnPosition: oneOf: @@ -744,7 +739,6 @@ components: enum: - "default" - responses: TableResponse: description: Returns include the table object @@ -771,455 +765,451 @@ components: examples: TableListResponse: - value: { - "code": 0, - "identifiers": [ - { - "namespace": [ - "my_metalake", - "my_hive_catalog", - "my_hive_schema" + value: + { + "code": 0, + "identifiers": + [ + { + "namespace": + ["my_metalake", "my_hive_catalog", "my_hive_schema"], + "name": "my_hive_table", + }, ], - "name": "my_hive_table" - } - ] - } + } HiveTableCreate: - value: { - "name": "my_hive_table", - "comment": "This is my Hive table", - "columns": [ - { - "name": "id", - "type": "integer", - "comment": "id column comment", - "nullable": true, - "autoIncrement": false - }, - { - "name": "name", - "type": "string", - "comment": "name column comment", - "nullable": true - }, - { - "name": "age", - "type": "integer", - "comment": "age column comment", - "nullable": true - }, - { - "name": "info", - "type": { - "type": "struct", - "fields": [ - { - "name": "position", - "type": "string", - "nullable": true, - "comment": "position field comment" - }, - { - "name": "contact", - "type": { - "type": "list", - "elementType": "integer", - "containsNull": false - }, - "nullable": true, - "comment": "contact field comment" - }, - { - "name": "rating", - "type": { - "type": "map", - "keyType": "string", - "valueType": "integer", - "valueContainsNull": false + value: + { + "name": "my_hive_table", + "comment": "This is my Hive table", + "columns": + [ + { + "name": "id", + "type": "integer", + "comment": "id column comment", + "nullable": true, + "autoIncrement": false, + }, + { + "name": "name", + "type": "string", + "comment": "name column comment", + "nullable": true, + }, + { + "name": "age", + "type": "integer", + "comment": "age column comment", + "nullable": true, + }, + { + "name": "info", + "type": + { + "type": "struct", + "fields": + [ + { + "name": "position", + "type": "string", + "nullable": true, + "comment": "position field comment", + }, + { + "name": "contact", + "type": + { + "type": "list", + "elementType": "integer", + "containsNull": false, + }, + "nullable": true, + "comment": "contact field comment", + }, + { + "name": "rating", + "type": + { + "type": "map", + "keyType": "string", + "valueType": "integer", + "valueContainsNull": false, + }, + "nullable": true, + "comment": "rating field comment", + }, + ], }, - "nullable": true, - "comment": "rating field comment" - } - ] - }, - "comment": "info column comment", - "nullable": true - }, - { - "name": "dt", - "type": "date", - "comment": "dt column comment", - "nullable": true - } - ], - "partitioning": [ - { - "strategy": "identity", - "fieldName": [ "dt" ] - } - ], - "distribution": { - "strategy": "hash", - "number": 32, - "funcArgs": [ + "comment": "info column comment", + "nullable": true, + }, + { + "name": "dt", + "type": "date", + "comment": "dt column comment", + "nullable": true, + }, + ], + "partitioning": [{ "strategy": "identity", "fieldName": ["dt"] }], + "distribution": { - "type": "field", - "fieldName": [ "id" ] - } - ] - }, - "sortOrders": [ - { - "sortTerm": { - "type": "field", - "fieldName": [ "age" ] + "strategy": "hash", + "number": 32, + "funcArgs": [{ "type": "field", "fieldName": ["id"] }], }, - "direction": "asc", - "nullOrdering": "nulls_first" - } - ], - "properties": { - "format": "ORC" - }, - indexes: [ ] - } + "sortOrders": + [ + { + "sortTerm": { "type": "field", "fieldName": ["age"] }, + "direction": "asc", + "nullOrdering": "nulls_first", + }, + ], + "properties": { "format": "ORC" }, + indexes: [], + } MysqlTableCreate: - value: { - "name": "my_mysql_table", - "comment": "This is my MySQL table", - "columns": [ - { - "name": "id", - "type": "integer", - "comment": "id column comment", - "nullable": false, - "autoIncrement": true - }, - { - "name": "name", - "type": "varchar(255)", - "comment": "name column comment", - "nullable": true, - "defaultValue": { - "type": "literal", - "dataType": "varchar(255)", - "value": "default_name" - } - }, - { - "name": "age", - "type": "integer", - "comment": "age column comment", - "nullable": true - }, - { - "name": "dt", - "type": "date", - "comment": "dt column comment", - "nullable": true - } - ], - "indexes": [ - { - "indexType": "primary_key", - "name": "PRIMARY", - "fieldNames": [["id"]] - }, - { - "indexType": "unique_key", - "name": "uk_1", - "fieldNames": [["name"]] - }, - { - "indexType": "unique_key", - "name": "uk_2", - "fieldNames": [["name"] ,["age"] ,["dt"]] - } - ], - "properties": { - "engine": "InnoDB", - "auto-increment-offset": "1" + value: + { + "name": "my_mysql_table", + "comment": "This is my MySQL table", + "columns": + [ + { + "name": "id", + "type": "integer", + "comment": "id column comment", + "nullable": false, + "autoIncrement": true, + }, + { + "name": "name", + "type": "varchar(255)", + "comment": "name column comment", + "nullable": true, + "defaultValue": + { + "type": "literal", + "dataType": "varchar(255)", + "value": "default_name", + }, + }, + { + "name": "age", + "type": "integer", + "comment": "age column comment", + "nullable": true, + }, + { + "name": "dt", + "type": "date", + "comment": "dt column comment", + "nullable": true, + }, + ], + "indexes": + [ + { + "indexType": "primary_key", + "name": "PRIMARY", + "fieldNames": [["id"]], + }, + { + "indexType": "unique_key", + "name": "uk_1", + "fieldNames": [["name"]], + }, + { + "indexType": "unique_key", + "name": "uk_2", + "fieldNames": [["name"], ["age"], ["dt"]], + }, + ], + "properties": { "engine": "InnoDB", "auto-increment-offset": "1" }, } - } PostgresqlTableCreate: - value: { - "name": "my_postgresql_table", - "comment": "This is my PostgreSQL table", - "columns": [ - { - "name": "id", - "type": "integer", - "comment": "id column comment", - "nullable": false, - "autoIncrement": true - }, - { - "name": "name", - "type": "string", - "comment": "name column comment", - "nullable": true - }, - { - "name": "age", - "type": "integer", - "comment": "age column comment", - "nullable": true - }, - { - "name": "dt", - "type": "date", - "comment": "dt column comment", - "nullable": true - } - ], - "indexes": [ - { - "indexType": "primary_key", - "name": "PRIMARY", - "fieldNames": [["id"]] - }, - { - "indexType": "unique_key", - "name": "uk_1", - "fieldNames": [["name"]] - }, - { - "indexType": "unique_key", - "name": "uk_2", - "fieldNames": [["name"] ,["age"] ,["dt"]] - } - ], - "properties": { } - } + value: + { + "name": "my_postgresql_table", + "comment": "This is my PostgreSQL table", + "columns": + [ + { + "name": "id", + "type": "integer", + "comment": "id column comment", + "nullable": false, + "autoIncrement": true, + }, + { + "name": "name", + "type": "string", + "comment": "name column comment", + "nullable": true, + }, + { + "name": "age", + "type": "integer", + "comment": "age column comment", + "nullable": true, + }, + { + "name": "dt", + "type": "date", + "comment": "dt column comment", + "nullable": true, + }, + ], + "indexes": + [ + { + "indexType": "primary_key", + "name": "PRIMARY", + "fieldNames": [["id"]], + }, + { + "indexType": "unique_key", + "name": "uk_1", + "fieldNames": [["name"]], + }, + { + "indexType": "unique_key", + "name": "uk_2", + "fieldNames": [["name"], ["age"], ["dt"]], + }, + ], + "properties": {}, + } TableResponse: - value: { - "code": 0, - "table": { - "name": "my_hive_table", - "comment": "This is my Hive table", - "columns": [ + value: + { + "code": 0, + "table": { - "name": "id", - "type": "integer", - "comment": "id column comment", - "nullable": true, - "autoIncrement": false - }, - { - "name": "name", - "type": "string", - "comment": "name column comment", - "nullable": true - }, - { - "name": "age", - "type": "integer", - "comment": "age column comment", - "nullable": true + "name": "my_hive_table", + "comment": "This is my Hive table", + "columns": + [ + { + "name": "id", + "type": "integer", + "comment": "id column comment", + "nullable": true, + "autoIncrement": false, + }, + { + "name": "name", + "type": "string", + "comment": "name column comment", + "nullable": true, + }, + { + "name": "age", + "type": "integer", + "comment": "age column comment", + "nullable": true, + }, + { + "name": "dt", + "type": "date", + "comment": "dt column comment", + "nullable": true, + }, + ], + "properties": + { + "input-format": "org.apache.hadoop.hive.ql.io.orc.OrcInputFormat", + "transient_lastDdlTime": "1702033666", + "output-format": "org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat", + "location": "hdfs://0.0.0.0:9000/user/hive/warehouse/my_hive_table", + "table-type": "MANAGED_TABLE", + "serde-lib": "org.apache.hadoop.hive.ql.io.orc.OrcSerde", + "serde-name": "my_hive_table", + }, + "audit": + { + "creator": "gravitino", + "createTime": "2023-12-08T11:07:46.938Z", + }, + "distribution": + { + "strategy": "hash", + "number": 32, + "funcArgs": [{ "type": "field", "fieldName": ["id"] }], + }, + "sortOrders": + [ + { + "sortTerm": { "type": "field", "fieldName": ["age"] }, + "direction": "asc", + "nullOrdering": "nulls_first", + }, + ], + "partitioning": [{ "strategy": "identity", "fieldName": ["dt"] }], + "indexes": [], }, - { - "name": "dt", - "type": "date", - "comment": "dt column comment", - "nullable": true - } - ], - "properties": { - "input-format": "org.apache.hadoop.hive.ql.io.orc.OrcInputFormat", - "transient_lastDdlTime": "1702033666", - "output-format": "org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat", - "location": "hdfs://0.0.0.0:9000/user/hive/warehouse/my_hive_table", - "table-type": "MANAGED_TABLE", - "serde-lib": "org.apache.hadoop.hive.ql.io.orc.OrcSerde", - "serde-name": "my_hive_table" - }, - "audit": { - "creator": "gravitino", - "createTime": "2023-12-08T11:07:46.938Z" - }, - "distribution": { - "strategy": "hash", - "number": 32, - "funcArgs": [ - { - "type": "field", - "fieldName": [ - "id" - ] - } - ] - }, - "sortOrders": [ - { - "sortTerm": { - "type": "field", - "fieldName": [ - "age" - ] - }, - "direction": "asc", - "nullOrdering": "nulls_first" - } - ], - "partitioning": [ - { - "strategy": "identity", - "fieldName": [ - "dt" - ] - } - ], - "indexes": [ ] } - } MysqlTableResponse: - value: { - "code": 0, - "table": { - "name": "my_mysql_table", - "comment": "This is my MySQL table", - "columns": [ - { - "name": "id", - "type": "integer", - "comment": "id column comment", - "nullable": true, - "autoIncrement": true - }, - { - "name": "name", - "type": "string", - "comment": "name column comment", - "nullable": true - }, - { - "name": "age", - "type": "integer", - "comment": "age column comment", - "nullable": true - }, - { - "name": "dt", - "type": "date", - "comment": "dt column comment", - "nullable": true - } - ], - "properties": { - "engine": "InnoDB", - "auto-increment-offset": "1", - }, - "audit": { - "creator": "gravitino", - "createTime": "2023-12-08T11:07:46.938Z" - }, - "distribution": null, - "sortOrders": [ ], - "partitioning": [ ], - "indexes": [ + value: + { + "code": 0, + "table": { - "indexType": "primary_key", - "name": "PRIMARY", - "fieldNames": [["id"]] - }, - { - "indexType": "unique_key", - "name": "uk_1", - "fieldNames": [["name"]] + "name": "my_mysql_table", + "comment": "This is my MySQL table", + "columns": + [ + { + "name": "id", + "type": "integer", + "comment": "id column comment", + "nullable": true, + "autoIncrement": true, + }, + { + "name": "name", + "type": "string", + "comment": "name column comment", + "nullable": true, + }, + { + "name": "age", + "type": "integer", + "comment": "age column comment", + "nullable": true, + }, + { + "name": "dt", + "type": "date", + "comment": "dt column comment", + "nullable": true, + }, + ], + "properties": + { "engine": "InnoDB", "auto-increment-offset": "1" }, + "audit": + { + "creator": "gravitino", + "createTime": "2023-12-08T11:07:46.938Z", + }, + "distribution": null, + "sortOrders": [], + "partitioning": [], + "indexes": + [ + { + "indexType": "primary_key", + "name": "PRIMARY", + "fieldNames": [["id"]], + }, + { + "indexType": "unique_key", + "name": "uk_1", + "fieldNames": [["name"]], + }, + { + "indexType": "unique_key", + "name": "uk_2", + "fieldNames": [["name"], ["age"], ["dt"]], + }, + ], }, - { - "indexType": "unique_key", - "name": "uk_2", - "fieldNames": [["name"] ,["age"] ,["dt"]] - } - ] } - } PostgresqlTableResponse: - value: { - "code": 0, - "table": { - "name": "my_postgresql_table", - "comment": "This is my PostgreSQL table", - "columns": [ + value: + { + "code": 0, + "table": { - "name": "id", - "type": "integer", - "comment": "id column comment", - "nullable": true, - "autoIncrement": true - }, - { - "name": "name", - "type": "string", - "comment": "name column comment", - "nullable": true - }, - { - "name": "age", - "type": "integer", - "comment": "age column comment", - "nullable": true - }, - { - "name": "dt", - "type": "date", - "comment": "dt column comment", - "nullable": true - } - ], - "properties": { }, - "audit": { - "creator": "gravitino", - "createTime": "2023-12-08T11:07:46.938Z" - }, - "distribution": null, - "sortOrders": [ ], - "partitioning": [ ], - "indexes": [ - { - "indexType": "primary_key", - "name": "PRIMARY", - "fieldNames": [["id"]] - }, - { - "indexType": "unique_key", - "name": "uk_1", - "fieldNames": [["name"]] + "name": "my_postgresql_table", + "comment": "This is my PostgreSQL table", + "columns": + [ + { + "name": "id", + "type": "integer", + "comment": "id column comment", + "nullable": true, + "autoIncrement": true, + }, + { + "name": "name", + "type": "string", + "comment": "name column comment", + "nullable": true, + }, + { + "name": "age", + "type": "integer", + "comment": "age column comment", + "nullable": true, + }, + { + "name": "dt", + "type": "date", + "comment": "dt column comment", + "nullable": true, + }, + ], + "properties": {}, + "audit": + { + "creator": "gravitino", + "createTime": "2023-12-08T11:07:46.938Z", + }, + "distribution": null, + "sortOrders": [], + "partitioning": [], + "indexes": + [ + { + "indexType": "primary_key", + "name": "PRIMARY", + "fieldNames": [["id"]], + }, + { + "indexType": "unique_key", + "name": "uk_1", + "fieldNames": [["name"]], + }, + { + "indexType": "unique_key", + "name": "uk_2", + "fieldNames": [["name"], ["age"], ["dt"]], + }, + ], }, - { - "indexType": "unique_key", - "name": "uk_2", - "fieldNames": [["name"] ,["age"] ,["dt"]] - } - ] } - } TableAlreadyExistsException: - value: { - "code": 1004, - "type": "TableAlreadyExistsException", - "message": "Failed to operate table(s) [my_hive_table] operation [CREATE] under schema [my_hive_schema], reason [TableAlreadyExistsException]", - "stack": [ - "org.apache.gravitino.exceptions.TableAlreadyExistsException: Table already exists: my_hive_table", - "..." - ] - } + value: + { + "code": 1004, + "type": "TableAlreadyExistsException", + "message": "Failed to operate table(s) [my_hive_table] operation [CREATE] under schema [my_hive_schema], reason [TableAlreadyExistsException]", + "stack": + [ + "org.apache.gravitino.exceptions.TableAlreadyExistsException: Table already exists: my_hive_table", + "...", + ], + } NoSuchTableException: - value: { - "code": 1003, - "type": "NoSuchTableException", - "message": "Failed to operate table(s) [test_table] operation [LOAD] under schema [test_schema], reason [NoSuchTableException]", - "stack": [ - "org.apache.gravitino.exceptions.NoSuchTableException: Hive table does not exist: test_table in Hive Metastore", - "..." - ] - } + value: + { + "code": 1003, + "type": "NoSuchTableException", + "message": "Failed to operate table(s) [test_table] operation [LOAD] under schema [test_schema], reason [NoSuchTableException]", + "stack": + [ + "org.apache.gravitino.exceptions.NoSuchTableException: Hive table does not exist: test_table in Hive Metastore", + "...", + ], + } diff --git a/docs/open-api/topics.yaml b/docs/open-api/topics.yaml index ecfe91665d3..bfb98cf985a 100644 --- a/docs/open-api/topics.yaml +++ b/docs/open-api/topics.yaml @@ -19,9 +19,7 @@ # --- - paths: - /metalakes/{metalake}/catalogs/{catalog}/schemas/{schema}/topics: parameters: - $ref: "./openapi.yaml#/components/parameters/metalake" @@ -160,7 +158,6 @@ paths: $ref: "./openapi.yaml#/components/responses/ServerErrorResponse" components: - schemas: Topic: type: object @@ -236,10 +233,8 @@ components: newComment: type: string description: The new comment of the topic - example: { - "@type": "updateComment", - "newComment": "This is the new comment" - } + example: + { "@type": "updateComment", "newComment": "This is the new comment" } SetTopicPropertyRequest: type: object @@ -258,11 +253,7 @@ components: value: type: string description: The value of the property to set - example: { - "@type": "setProperty", - "property": "key", - "value": "value" - } + example: { "@type": "setProperty", "property": "key", "value": "value" } RemoveTopicPropertyRequest: type: object @@ -277,10 +268,7 @@ components: property: type: string description: The name of the property to remove - example: { - "@type": "removeProperty", - "property": "key" - } + example: { "@type": "removeProperty", "property": "key" } responses: TopicResponse: @@ -304,48 +292,47 @@ components: examples: TopicCreateRequest: - value: { - "name": "topic1", - "comment": "This is a topic", - "properties": { - "partition-count": "1", - "replication-factor": "1" + value: + { + "name": "topic1", + "comment": "This is a topic", + "properties": { "partition-count": "1", "replication-factor": "1" }, } - } TopicResponse: - value: { - "code": 0, - "topic": { - "name": "topic1", - "comment": "This is a topic", - "properties": { - "partition-count": "1", - "replication-factor": "1" - } + value: + { + "code": 0, + "topic": + { + "name": "topic1", + "comment": "This is a topic", + "properties": + { "partition-count": "1", "replication-factor": "1" }, + }, } - } TopicAlreadyExistsException: - value: { - "code": 1004, - "type": "TopicAlreadyExistsException", - "message": "Topic already exists", - "stack": [ - "org.apache.gravitino.exceptions.TopicAlreadyExistsException: Topic already exists: topic1" - ] - } + value: + { + "code": 1004, + "type": "TopicAlreadyExistsException", + "message": "Topic already exists", + "stack": + [ + "org.apache.gravitino.exceptions.TopicAlreadyExistsException: Topic already exists: topic1", + ], + } NoSuchTopicException: - value: { - "code": 1003, - "type": "NoSuchTopicException", - "message": "Topic does not exist", - "stack": [ - "org.apache.gravitino.exceptions.NoSuchTopicException: Topic does not exist", - "..." - ] - } - - - + value: + { + "code": 1003, + "type": "NoSuchTopicException", + "message": "Topic does not exist", + "stack": + [ + "org.apache.gravitino.exceptions.NoSuchTopicException: Topic does not exist", + "...", + ], + } diff --git a/docs/overview.md b/docs/overview.md index 2b215412ede..0044c96cf33 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -13,20 +13,20 @@ metadata directly in different sources, types, and regions. It also provides use Gravitino aims to provide several key features: -* SSOT (Single Source of Truth) for multi-regional data with geo-distributed architecture support. -* Unified Data + AI asset management for both users and engines. -* Security in one place, centralize the security for different sources. -* Built-in data management + data access management. +- SSOT (Single Source of Truth) for multi-regional data with geo-distributed architecture support. +- Unified Data + AI asset management for both users and engines. +- Security in one place, centralize the security for different sources. +- Built-in data management + data access management. ## Architecture ![Gravitino Model and Arch](assets/gravitino-model-arch.png) -* **Functionality Layer**: Gravitino provides an API for users to manage and govern the +- **Functionality Layer**: Gravitino provides an API for users to manage and govern the metadata, including standard metadata creation, update, and delete operations. In the meantime, it also provides the ability to govern the metadata in a unified way, including access control, discovery, and others. -* **Interface Layer**: Gravitino provides a standard REST API as the interface layer for users. Future support includes Thrift and JDBC interfaces. -* **Core Object Model**: Gravitino defines a generic metadata model to represent the metadata in different sources and types and manages them in a unified way. -* **Connection Layer**: In the connection layer, Gravitino provides a set of connectors to connect to different metadata sources, including Apache Hive, MySQL, PostgreSQL, and others. It also allows connecting and managing heterogeneous metadata other than Tabular data. +- **Interface Layer**: Gravitino provides a standard REST API as the interface layer for users. Future support includes Thrift and JDBC interfaces. +- **Core Object Model**: Gravitino defines a generic metadata model to represent the metadata in different sources and types and manages them in a unified way. +- **Connection Layer**: In the connection layer, Gravitino provides a set of connectors to connect to different metadata sources, including Apache Hive, MySQL, PostgreSQL, and others. It also allows connecting and managing heterogeneous metadata other than Tabular data. ## Features @@ -74,13 +74,13 @@ assets like models, features, and others are under development. ![Gravitino Model](assets/metadata-model.png) -* **Metalake**: The top-level container for metadata. Typically, one group has one metalake +- **Metalake**: The top-level container for metadata. Typically, one group has one metalake to manage all the metadata in it. Each metalake exposes a three-level namespace(catalog.schema. table) to organize the data. -* **Catalog**: A catalog is a collection of metadata from a specific metadata source. +- **Catalog**: A catalog is a collection of metadata from a specific metadata source. Each catalog has a related connector to connect to the specific metadata source. -* **Schema**: A schema is equivalent to a database, Schemas only exist in the specific catalogs +- **Schema**: A schema is equivalent to a database, Schemas only exist in the specific catalogs that support relational metadata sources, such as Apache Hive, MySQL, PostgreSQL, and others. -* **Table**: The lowest level in the object hierarchy for catalogs that support relational +- **Table**: The lowest level in the object hierarchy for catalogs that support relational metadata sources. You can create Tables in specific schemas in the catalogs. -* **Model**: The model represents the metadata in the specific catalogs that support model management. +- **Model**: The model represents the metadata in the specific catalogs that support model management. diff --git a/docs/publish-docker-images.md b/docs/publish-docker-images.md index da37aeee4ae..8a9f4da0f1e 100644 --- a/docs/publish-docker-images.md +++ b/docs/publish-docker-images.md @@ -5,7 +5,6 @@ keyword: docker license: "This software is licensed under the Apache License version 2." --- - ## Introduction The Apache Gravitino project provides a set of Docker images to facilitate the publishing, development, and testing of the Gravitino project. @@ -18,12 +17,12 @@ You can use GitHub actions to publish Docker images to the Docker Hub repository 1. Open the [Docker publish link](https://github.com/apache/gravitino/actions/workflows/docker-image.yml) 2. Click the `Run workflow` button. 3. Select the branch you want to build - + Selecting the main branch results in publishing the Docker image with the specified tag and the latest tag. - + Selecting another branch, results are publishing the Docker image with the specified tag. + - Selecting the main branch results in publishing the Docker image with the specified tag and the latest tag. + - Selecting another branch, results are publishing the Docker image with the specified tag. 4. Choose the image you want to build - + `datastrato/gravitino-ci-hive`. - + `datastrato/gravitino-ci-trino`. - + Future plans include support for other data sources. + - `datastrato/gravitino-ci-hive`. + - `datastrato/gravitino-ci-trino`. + - Future plans include support for other data sources. 5. Input the `tag name`, for example: `0.1.0`, Then build and push the Docker image name as `datastrato/{image-name}:0.1.0`. 6. You must enter the correct `publish docker token` before you can execute run `Publish Docker Image` workflow. 7. Wait for the workflow to complete. You can see a new Docker image shown in the [Datastrato Docker Hub](https://hub.docker.com/u/datastrato) repository. @@ -32,4 +31,4 @@ You can use GitHub actions to publish Docker images to the Docker Hub repository ## More details of Apache Gravitino Docker images -+ [Gravitino Docker images](docker-image-details.md) +- [Gravitino Docker images](docker-image-details.md) diff --git a/docs/security.md b/docs/security.md index bf12a62d058..d5c04c59fd4 100644 --- a/docs/security.md +++ b/docs/security.md @@ -34,7 +34,7 @@ First, users need to guarantee that the external correctly configured OAuth 2.0 Then, on the server side, users should set `gravitino.authenticator` as `oauth` and give `gravitino.authenticator.oauth.defaultSignKey`, `gravitino.authenticator.oauth.serverUri` and -`gravitino.authenticator.oauth.tokenPath` a proper value. +`gravitino.authenticator.oauth.tokenPath` a proper value. Next, for the client side, users can enable `OAuth` mode by the following code: @@ -71,7 +71,7 @@ KerberosTokenProvider provider = KerberosTokenProvider.builder() // Use ticketCache to create KerberosTokenProvider KerberosTokenProvider provider = KerberosTokenProvider.builder() .withClientPrincipal(clientPrincipal) - .build(); + .build(); GravitinoClient client = GravitinoClient.builder(uri) .withMetalake("metalake") @@ -87,7 +87,7 @@ The URI must use the hostname of server instead of IP. ### Server configuration | Configuration item | Description | Default value | Required | Since version | -|---------------------------------------------------|-----------------------------------------------------------------------------------------------------|-------------------|--------------------------------------------|---------------| +| ------------------------------------------------- | --------------------------------------------------------------------------------------------------- | ----------------- | ------------------------------------------ | ------------- | | `gravitino.authenticator` | The authenticator which Gravitino uses, setting as `simple`,`oauth` or `kerberos`. | `simple` | No | 0.3.0 | | `gravitino.authenticator.oauth.serviceAudience` | The audience name when Gravitino uses OAuth as the authenticator. | `GravitinoServer` | No | 0.3.0 | | `gravitino.authenticator.oauth.allowSkewSecs` | The JWT allows skew seconds when Gravitino uses OAuth as the authenticator. | `0` | No | 0.3.0 | @@ -101,7 +101,7 @@ The URI must use the hostname of server instead of IP. The signature algorithms that Gravitino supports follows: | Name | Description | -|-------|------------------------------------------------| +| ----- | ---------------------------------------------- | | HS256 | HMAC using SHA-25A | | HS384 | HMAC using SHA-384 | | HS512 | HMAC using SHA-51 | @@ -136,7 +136,7 @@ You can follow the steps to set up an OAuth mode Gravitino server. ``` 3. Open [the JWK URL of the Authorization server](http://localhost:8177/oauth2/jwks) in the browser and you can get the JWK. - + ![jks_response_image](assets/jks.png) 4. Convert the JWK to PEM. You can use the [online tool](https://8gwifi.org/jwkconvertfunctions.jsp#google_vignette) or other tools. @@ -156,7 +156,7 @@ gravitino.authenticator.oauth.serverUri = http://localhost:8177 ``` 7. Open [the URL of Gravitino server](http://localhost:8090) and login in with clientId `test`, clientSecret `test`, and scope `test`. - + ![oauth_login_image](assets/oauth.png) 8. You can also use the curl command to access Gravitino. @@ -186,7 +186,7 @@ Both the Gravitino server and Iceberg REST service can configure HTTPS. ### Apache Gravitino server's configuration | Configuration item | Description | Default value | Required | Since version | -|-----------------------------------------------------|--------------------------------------------------------------------|---------------|---------------------------------------------------|---------------| +| --------------------------------------------------- | ------------------------------------------------------------------ | ------------- | ------------------------------------------------- | ------------- | | `gravitino.server.webserver.enableHttps` | Enables HTTPS. | `false` | No | 0.3.0 | | `gravitino.server.webserver.httpsPort` | The HTTPS port number of the Jetty web server. | `8433` | No | 0.3.0 | | `gravitino.server.webserver.keyStorePath` | Path to the key store file. | (none) | Yes if use HTTPS | 0.3.0 | @@ -203,7 +203,7 @@ Both the Gravitino server and Iceberg REST service can configure HTTPS. ### Apache Iceberg REST service's configuration | Configuration item | Description | Default value | Required | Since version | -|------------------------------------------------------------|--------------------------------------------------------------------|---------------|---------------------------------------------------|---------------| +| ---------------------------------------------------------- | ------------------------------------------------------------------ | ------------- | ------------------------------------------------- | ------------- | | `gravitino.auxService.iceberg-rest.enableHttps` | Enables HTTPS. | `false` | No | 0.3.0 | | `gravitino.auxService.iceberg-rest.httpsPort` | The HTTPS port number of the Jetty web server. | `9433` | No | 0.3.0 | | `gravitino.auxService.iceberg-rest.keyStorePath` | Path to the key store file. | (none) | Yes if use HTTPS | 0.3.0 | @@ -256,8 +256,8 @@ bin/keytool -import -alias localhost -keystore jre/lib/security/cacerts -file lo ``` 5. You can refer to the [Configurations](gravitino-server-config.md) and append the configuration to the conf/gravitino.conf. -Configuration doesn't support resolving environment variables, so you should replace `${JAVA_HOME}` with the actual value. -Then, You can start the Gravitino server. + Configuration doesn't support resolving environment variables, so you should replace `${JAVA_HOME}` with the actual value. + Then, You can start the Gravitino server. ```text gravitino.server.webserver.host = localhost @@ -293,32 +293,33 @@ If you want to use the command `curl`, you can follow the commands: openssl x509 -inform der -in $JAVA_HOME/localhost.crt -out certificate.pem curl -v -X GET --cacert ./certificate.pem -H "Accept: application/vnd.gravitino.v1+json" -H "Content-Type: application/json" https://localhost:8433/api/version ``` + ## Cross-origin resource filter ### Server configuration -| Configuration item | Description | Default value | Required | Since version | -|----------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|----------|---------------| -| `gravitino.server.webserver.enableCorsFilter` | Enable cross-origin resource share filter. | false | No | 0.4.0 | -| `gravitino.server.webserver.allowedOrigins` | A comma separated list of allowed origins to access the resources. The default value is *, which means all origins. | `*` | No | 0.4.0 | -| `gravitino.server.webserver.allowedTimingOrigins` | A comma separated list of allowed origins to time the resource. The default value is the empty string, which means no origins. | `` | No | 0.4.0 | -| `gravitino.server.webserver.allowedMethods` | A comma separated list of allowed HTTP methods used when accessing the resources. The default values are GET, POST, HEAD, and DELETE. | `GET,POST,HEAD,DELETE,PUT` | No | 0.4.0 | -| `gravitino.server.webserver.allowedHeaders` | A comma separated list of allowed HTTP headers specified when accessing the resources. The default value is X-Requested-With,Content-Type,Accept,Origin. If the value is a single *, it accepts all headers. | `X-Requested-With,Content-Type,Accept,Origin` | No | 0.4.0 | -| `gravitino.server.webserver.preflightMaxAgeInSecs` | The number of seconds to cache preflight requests by the client. The default value is 1800 seconds or 30 minutes. | `1800` | No | 0.4.0 | -| `gravitino.server.webserver.allowCredentials` | A boolean indicating if the resource allows requests with credentials. The default value is true. | `true` | No | 0.4.0 | -| `gravitino.server.webserver.exposedHeaders` | A comma separated list of allowed HTTP headers exposed on the client. The default value is the empty list. | `` | No | 0.4.0 | -| `gravitino.server.webserver.chainPreflight` | If true chained preflight requests for normal handling (as an OPTION request). Otherwise, the filter responds to the preflight. The default is true. | `true` | No | 0.4.0 | +| Configuration item | Description | Default value | Required | Since version | +| -------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | -------- | ------------- | +| `gravitino.server.webserver.enableCorsFilter` | Enable cross-origin resource share filter. | false | No | 0.4.0 | +| `gravitino.server.webserver.allowedOrigins` | A comma separated list of allowed origins to access the resources. The default value is \*, which means all origins. | `*` | No | 0.4.0 | +| `gravitino.server.webserver.allowedTimingOrigins` | A comma separated list of allowed origins to time the resource. The default value is the empty string, which means no origins. | `` | No | 0.4.0 | +| `gravitino.server.webserver.allowedMethods` | A comma separated list of allowed HTTP methods used when accessing the resources. The default values are GET, POST, HEAD, and DELETE. | `GET,POST,HEAD,DELETE,PUT` | No | 0.4.0 | +| `gravitino.server.webserver.allowedHeaders` | A comma separated list of allowed HTTP headers specified when accessing the resources. The default value is X-Requested-With,Content-Type,Accept,Origin. If the value is a single \*, it accepts all headers. | `X-Requested-With,Content-Type,Accept,Origin` | No | 0.4.0 | +| `gravitino.server.webserver.preflightMaxAgeInSecs` | The number of seconds to cache preflight requests by the client. The default value is 1800 seconds or 30 minutes. | `1800` | No | 0.4.0 | +| `gravitino.server.webserver.allowCredentials` | A boolean indicating if the resource allows requests with credentials. The default value is true. | `true` | No | 0.4.0 | +| `gravitino.server.webserver.exposedHeaders` | A comma separated list of allowed HTTP headers exposed on the client. The default value is the empty list. | `` | No | 0.4.0 | +| `gravitino.server.webserver.chainPreflight` | If true chained preflight requests for normal handling (as an OPTION request). Otherwise, the filter responds to the preflight. The default is true. | `true` | No | 0.4.0 | ### Apache Iceberg REST service's configuration -| Configuration item | Description | Default value | Required | Since version | -|-----------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------|----------|---------------| -| `gravitino.auxService.iceberg-rest.enableCorsFilter` | Enable cross-origin resource share filter. | false | No | 0.4.0 | -| `gravitino.auxService.iceberg-rest.allowedOrigins` | A comma separated list of allowed origins that access the resources. The default value is *, which means all origins. | `*` | No | 0.4.0 | -| `gravitino.auxService.iceberg-rest.allowedTimingOrigins` | A comma separated list of allowed origins that time the resource. The default value is the empty string, which means no origins. | `` | No | 0.4.0 | -| `gravitino.auxService.iceberg-rest.allowedMethods` | A comma separated list of allowed HTTP methods used when accessing the resources. The default values are GET, POST, HEAD, and DELETE. | `GET,POST,HEAD,DELETE,PUT` | No | 0.4.0 | -| `gravitino.auxService.iceberg-rest.allowedHeaders` | A comma separated list of HTTP allowed headers specified when accessing the resources. The default value is X-Requested-With,Content-Type,Accept,Origin. If the value is a single *, it accepts all headers. | `X-Requested-With,Content-Type,Accept,Origin` | No | 0.4.0 | -| `gravitino.auxService.iceberg-rest.preflightMaxAgeInSecs` | The number of seconds to cache preflight requests by the client. The default value is 1800 seconds or 30 minutes. | `1800` | No | 0.4.0 | -| `gravitino.auxService.iceberg-rest.allowCredentials` | A boolean indicating if the resource allows requests with credentials. The default value is true. | `true` | No | 0.4.0 | -| `gravitino.auxService.iceberg-rest.exposedHeaders` | A comma separated list of allowed HTTP headers exposed on the client. The default value is the empty list. | `` | No | 0.4.0 | -| `gravitino.auxService.iceberg-rest.chainPreflight` | If true chained preflight requests for normal handling (as an OPTION request). Otherwise, the filter responds to the preflight. The default is true. | `true` | No | 0.4.0 | +| Configuration item | Description | Default value | Required | Since version | +| --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------- | -------- | ------------- | +| `gravitino.auxService.iceberg-rest.enableCorsFilter` | Enable cross-origin resource share filter. | false | No | 0.4.0 | +| `gravitino.auxService.iceberg-rest.allowedOrigins` | A comma separated list of allowed origins that access the resources. The default value is \*, which means all origins. | `*` | No | 0.4.0 | +| `gravitino.auxService.iceberg-rest.allowedTimingOrigins` | A comma separated list of allowed origins that time the resource. The default value is the empty string, which means no origins. | `` | No | 0.4.0 | +| `gravitino.auxService.iceberg-rest.allowedMethods` | A comma separated list of allowed HTTP methods used when accessing the resources. The default values are GET, POST, HEAD, and DELETE. | `GET,POST,HEAD,DELETE,PUT` | No | 0.4.0 | +| `gravitino.auxService.iceberg-rest.allowedHeaders` | A comma separated list of HTTP allowed headers specified when accessing the resources. The default value is X-Requested-With,Content-Type,Accept,Origin. If the value is a single \*, it accepts all headers. | `X-Requested-With,Content-Type,Accept,Origin` | No | 0.4.0 | +| `gravitino.auxService.iceberg-rest.preflightMaxAgeInSecs` | The number of seconds to cache preflight requests by the client. The default value is 1800 seconds or 30 minutes. | `1800` | No | 0.4.0 | +| `gravitino.auxService.iceberg-rest.allowCredentials` | A boolean indicating if the resource allows requests with credentials. The default value is true. | `true` | No | 0.4.0 | +| `gravitino.auxService.iceberg-rest.exposedHeaders` | A comma separated list of allowed HTTP headers exposed on the client. The default value is the empty list. | `` | No | 0.4.0 | +| `gravitino.auxService.iceberg-rest.chainPreflight` | If true chained preflight requests for normal handling (as an OPTION request). Otherwise, the filter responds to the preflight. The default is true. | `true` | No | 0.4.0 | diff --git a/docs/spark-connector/spark-catalog-hive.md b/docs/spark-connector/spark-catalog-hive.md index 9214e9746e0..cc540103c10 100644 --- a/docs/spark-connector/spark-catalog-hive.md +++ b/docs/spark-connector/spark-catalog-hive.md @@ -11,7 +11,7 @@ With the Apache Gravitino Spark connector, accessing data or managing metadata i Supports most DDL and DML operations in SparkSQL, except such operations: -- Function operations +- Function operations - Partition operations - View operations - Querying UDF @@ -21,12 +21,11 @@ Supports most DDL and DML operations in SparkSQL, except such operations: ## Requirement -* Hive metastore 2.x -* HDFS 2.x or 3.x +- Hive metastore 2.x +- HDFS 2.x or 3.x ## SQL example - ```sql // Suppose hive_a is the Hive catalog name managed by Gravitino @@ -51,18 +50,16 @@ INSERT OVERWRITE TABLE employees PARTITION(department='Marketing') VALUES (3, 'M SELECT * FROM employees WHERE department = 'Engineering'; ``` - ## Catalog properties Gravitino spark connector will transform below property names which are defined in catalog properties to Spark Hive connector configuration. | Property name in Gravitino catalog properties | Spark Hive connector configuration | Description | Since Version | -|-----------------------------------------------|------------------------------------|----------------------------|---------------| +| --------------------------------------------- | ---------------------------------- | -------------------------- | ------------- | | `metastore.uris` | `hive.metastore.uris` | Hive metastore uri address | 0.5.0 | Gravitino catalog property names with the prefix `spark.bypass.` are passed to Spark Hive connector. For example, using `spark.bypass.hive.exec.dynamic.partition.mode` to pass the `hive.exec.dynamic.partition.mode` to the Spark Hive connector. - :::caution When using the `spark-sql` shell client, you must explicitly set the `spark.bypass.spark.sql.hive.metastore.jars` in the Gravitino Hive catalog properties. Replace the default `builtin` value with the appropriate setting for your setup. -::: \ No newline at end of file +::: diff --git a/docs/spark-connector/spark-catalog-iceberg.md b/docs/spark-connector/spark-catalog-iceberg.md index f6ced796d6d..1cc022d85a6 100644 --- a/docs/spark-connector/spark-catalog-iceberg.md +++ b/docs/spark-connector/spark-catalog-iceberg.md @@ -93,9 +93,10 @@ SELECT * FROM employee FOR SYSTEM_TIME AS OF '2024-05-27 01:01:00'; DESC EXTENDED employee; ``` -For more details about `CALL`, please refer to the [Spark Procedures description](https://iceberg.apache.org/docs/latest/spark-procedures/#spark-procedures) in Iceberg official document. +For more details about `CALL`, please refer to the [Spark Procedures description](https://iceberg.apache.org/docs/latest/spark-procedures/#spark-procedures) in Iceberg official document. ## Apache Iceberg backend-catalog support + - HiveCatalog - JdbcCatalog - RESTCatalog @@ -107,7 +108,7 @@ Gravitino spark connector will transform below property names which are defined #### HiveCatalog | Gravitino catalog property name | Spark Iceberg connector configuration | Default Value | Required | Description | Since Version | -|---------------------------------|---------------------------------------|---------------|----------|---------------------------|---------------| +| ------------------------------- | ------------------------------------- | ------------- | -------- | ------------------------- | ------------- | | `catalog-backend` | `type` | `memory` | Yes | Catalog backend type | 0.5.0 | | `uri` | `uri` | (none) | Yes | Catalog backend uri | 0.5.0 | | `warehouse` | `warehouse` | (none) | Yes | Catalog backend warehouse | 0.5.0 | @@ -115,7 +116,7 @@ Gravitino spark connector will transform below property names which are defined #### JdbcCatalog | Gravitino catalog property name | Spark Iceberg connector configuration | Default Value | Required | Description | Since Version | -|---------------------------------|---------------------------------------|---------------|----------|---------------------------|---------------| +| ------------------------------- | ------------------------------------- | ------------- | -------- | ------------------------- | ------------- | | `catalog-backend` | `type` | `memory` | Yes | Catalog backend type | 0.5.0 | | `uri` | `uri` | (none) | Yes | Catalog backend uri | 0.5.0 | | `warehouse` | `warehouse` | (none) | Yes | Catalog backend warehouse | 0.5.0 | @@ -125,7 +126,7 @@ Gravitino spark connector will transform below property names which are defined #### RESTCatalog | Gravitino catalog property name | Spark Iceberg connector configuration | Default Value | Required | Description | Since Version | -|---------------------------------|---------------------------------------|---------------|----------|---------------------------|---------------| +| ------------------------------- | ------------------------------------- | ------------- | -------- | ------------------------- | ------------- | | `catalog-backend` | `type` | `memory` | Yes | Catalog backend type | 0.5.1 | | `uri` | `uri` | (none) | Yes | Catalog backend uri | 0.5.1 | | `warehouse` | `warehouse` | (none) | No | Catalog backend warehouse | 0.5.1 | @@ -135,4 +136,3 @@ Gravitino catalog property names with the prefix `spark.bypass.` are passed to S :::info Iceberg catalog property `cache-enabled` is setting to `false` internally and not allowed to change. ::: - diff --git a/docs/spark-connector/spark-connector.md b/docs/spark-connector/spark-connector.md index 49ec2748c34..29643033451 100644 --- a/docs/spark-connector/spark-connector.md +++ b/docs/spark-connector/spark-connector.md @@ -1,7 +1,7 @@ --- title: "Apache Gravitino Spark connector" slug: /spark-connector/spark-connector -keyword: spark connector federation query +keyword: spark connector federation query license: "This software is licensed under the Apache License version 2." --- @@ -17,9 +17,9 @@ The Apache Gravitino Spark connector leverages the Spark DataSourceV2 interface ## Requirement -* Spark 3.3 or 3.4 or 3.5 -* Scala 2.12 or 2.13 -* JDK 8 or 11 or 17 +- Spark 3.3 or 3.4 or 3.5 +- Scala 2.12 or 2.13 +- JDK 8 or 11 or 17 :::info Gravitino Spark connector doesn't support Scala 2.13 for Spark3.3. @@ -30,12 +30,12 @@ Gravitino Spark connector doesn't support Scala 2.13 for Spark3.3. 1. [Build](../how-to-build.md) or [download](https://mvnrepository.com/artifact/org.apache.gravitino/spark-connector-runtime) the Gravitino spark connector jar, and place it to the classpath of Spark. 2. Configure the Spark session to use the Gravitino spark connector. -| Property | Type | Default Value | Description | Required | Since Version | -|------------------------------------------|--------|---------------|-----------------------------------------------------------------------------------------------------|----------|---------------| +| Property | Type | Default Value | Description | Required | Since Version | +| ---------------------------------------- | ------ | ------------- | ----------------------------------------------------------------------------------------------- | -------- | ------------- | | spark.plugins | string | (none) | Gravitino spark plugin name, `org.apache.gravitino.spark.connector.plugin.GravitinoSparkPlugin` | Yes | 0.5.0 | -| spark.sql.gravitino.metalake | string | (none) | The metalake name that spark connector used to request to Gravitino. | Yes | 0.5.0 | -| spark.sql.gravitino.uri | string | (none) | The uri of Gravitino server address. | Yes | 0.5.0 | -| spark.sql.gravitino.enableIcebergSupport | string | `false` | Set to `true` to use Iceberg catalog. | No | 0.5.1 | +| spark.sql.gravitino.metalake | string | (none) | The metalake name that spark connector used to request to Gravitino. | Yes | 0.5.0 | +| spark.sql.gravitino.uri | string | (none) | The uri of Gravitino server address. | Yes | 0.5.0 | +| spark.sql.gravitino.enableIcebergSupport | string | `false` | Set to `true` to use Iceberg catalog. | No | 0.5.1 | ```shell ./bin/spark-sql -v \ @@ -48,9 +48,9 @@ Gravitino Spark connector doesn't support Scala 2.13 for Spark3.3. 3. [Download](https://iceberg.apache.org/releases/) corresponding runtime jars and place it to the classpath of Spark if using Iceberg catalog. -4. Execute the Spark SQL query. +4. Execute the Spark SQL query. -Suppose there are two catalogs in the metalake `test`, `hive` for Hive catalog and `iceberg` for Iceberg catalog. +Suppose there are two catalogs in the metalake `test`, `hive` for Hive catalog and `iceberg` for Iceberg catalog. ```sql // use hive catalog @@ -79,7 +79,7 @@ The command `SHOW CATALOGS` will only display the Spark default catalog, named s Gravitino spark connector support the following datatype mapping between Spark and Gravitino. | Spark Data Type | Gravitino Data Type | Since Version | -|--------------------|-------------------------------|---------------| +| ------------------ | ----------------------------- | ------------- | | `BooleanType` | `boolean` | 0.5.0 | | `ByteType` | `byte` | 0.5.0 | | `ShortType` | `short` | 0.5.0 | diff --git a/docs/table-partitioning-bucketing-sort-order-indexes.md b/docs/table-partitioning-bucketing-sort-order-indexes.md index 1e744b564e1..261e5a7bd93 100644 --- a/docs/table-partitioning-bucketing-sort-order-indexes.md +++ b/docs/table-partitioning-bucketing-sort-order-indexes.md @@ -23,7 +23,7 @@ The `score`, `createTime`, and `city` appearing in the table below refer to the ::: | Partitioning strategy | Description | JSON example | Java example | Equivalent SQL semantics | -|-----------------------|----------------------------------------------------------------|---------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|---------------------------------------| +| --------------------- | -------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | ------------------------------------- | | `identity` | Source value, unmodified. | `{"strategy":"identity","fieldName":["score"]}` | `Transforms.identity("score")` | `PARTITION BY score` | | `hour` | Extract a timestamp hour, as hours from '1970-01-01 00:00:00'. | `{"strategy":"hour","fieldName":["createTime"]}` | `Transforms.hour("createTime")` | `PARTITION BY hour(createTime)` | | `day` | Extract a date or timestamp day, as days from '1970-01-01'. | `{"strategy":"day","fieldName":["createTime"]}` | `Transforms.day("createTime")` | `PARTITION BY day(createTime)` | @@ -52,7 +52,7 @@ To create a bucketed table, you should use the following three components to con - Strategy. It defines how Gravitino distributes table data across partitions. | Bucket strategy | Description | JSON | Java | -|-----------------|---------------------------------------------------------------------------------------------------------------------------|---------|------------------| +| --------------- | ------------------------------------------------------------------------------------------------------------------------- | ------- | ---------------- | | hash | Bucket table using hash. Gravitino distributes table data into buckets based on the hash value of the key. | `hash` | `Strategy.HASH` | | range | Bucket table using range. Gravitino distributes table data into buckets based on a specified range or interval of values. | `range` | `Strategy.RANGE` | | even | Bucket table using even. Gravitino distributes table data, ensuring an equal distribution of data. | `even` | `Strategy.EVEN` | @@ -86,7 +86,6 @@ Distributions.of(Strategy.HASH, 4, NamedReference.field("score")); - ## Sort ordering To define a sorted order table, you should use the following three components to construct a valid sorted order table. @@ -94,14 +93,14 @@ To define a sorted order table, you should use the following three components to - Direction. It defines in which direction Gravitino sorts the table. The default value is `ascending`. | Direction | Description | JSON | Java | -|------------|---------------------------------------------|--------|----------------------------| +| ---------- | ------------------------------------------- | ------ | -------------------------- | | ascending | Sorted by a field or a function ascending. | `asc` | `SortDirection.ASCENDING` | | descending | Sorted by a field or a function descending. | `desc` | `SortDirection.DESCENDING` | - Null ordering. It describes how to handle null values when ordering | Null ordering Type | Description | JSON | Java | -|--------------------|-----------------------------------------|---------------|----------------------------| +| ------------------ | --------------------------------------- | ------------- | -------------------------- | | null_first | Puts the null value in the first place. | `nulls_first` | `NullOrdering.NULLS_FIRST` | | null_last | Puts the null value in the last place. | `nulls_last` | `NullOrdering.NULLS_LAST` | @@ -113,10 +112,10 @@ Note: If the direction value is `ascending`, the default ordering value is `null ```json - { +{ "direction": "asc", "nullOrder": "NULLS_LAST", - "sortTerm": { + "sortTerm": { "type": "field", "fieldName": ["score"] } @@ -133,7 +132,6 @@ SortOrders.of(NamedReference.field("score"), SortDirection.ASCENDING, NullOrderi - :::tip **Not all catalogs may support those features**. Please refer to the related document for more details. ::: @@ -242,10 +240,10 @@ To define an indexed table, you should utilize the following three components to - IndexType. Represents the type of index, such as primary key or unique key. -| IndexType | Description | JSON | Java | -|---------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-----------------|---------------------------| -| PRIMARY_KEY | The PRIMARY KEY is a column or set of columns that uniquely identifies each row in a table. It enforces uniqueness and ensures that no two rows have the same values in the specified columns. Additionally, the PRIMARY KEY constraint automatically creates a unique index on the specified columns. | `PRIMARY_KEY` | `IndexType.PRIMARY_KEY` | -| UNIQUE_KEY | The UNIQUE KEY constraint ensures that all values in a specified column or set of columns are unique across the entire table. Unlike the PRIMARY KEY constraint, a table can have multiple UNIQUE KEY constraints, allowing for unique values in multiple columns or sets of columns. | `UNIQUE_KEY` | `IndexType.UNIQUE_KEY` | +| IndexType | Description | JSON | Java | +| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------- | ----------------------- | +| PRIMARY_KEY | The PRIMARY KEY is a column or set of columns that uniquely identifies each row in a table. It enforces uniqueness and ensures that no two rows have the same values in the specified columns. Additionally, the PRIMARY KEY constraint automatically creates a unique index on the specified columns. | `PRIMARY_KEY` | `IndexType.PRIMARY_KEY` | +| UNIQUE_KEY | The UNIQUE KEY constraint ensures that all values in a specified column or set of columns are unique across the entire table. Unlike the PRIMARY KEY constraint, a table can have multiple UNIQUE KEY constraints, allowing for unique values in multiple columns or sets of columns. | `UNIQUE_KEY` | `IndexType.UNIQUE_KEY` | - Name. It defines the name of the index. @@ -255,10 +253,10 @@ To define an indexed table, you should utilize the following three components to ```json - { +{ "indexType": "PRIMARY_KEY", "name": "PRIMARY", - "fieldNames": [["col_1"],["col_2"]] + "fieldNames": [["col_1"], ["col_2"]] } ``` @@ -347,4 +345,4 @@ tableCatalog.createTable( ``` - \ No newline at end of file + diff --git a/docs/trino-connector/catalog-hive.md b/docs/trino-connector/catalog-hive.md index ba1332f4e14..8f22e2526d6 100644 --- a/docs/trino-connector/catalog-hive.md +++ b/docs/trino-connector/catalog-hive.md @@ -35,15 +35,14 @@ per catalog: - CSV (using org.apache.hadoop.hive.serde2.OpenCSVSerde) - TextFile - ## Schema operations -### Create a schema +### Create a schema Users can create a schema with properties through Apache Gravitino Trino connector as follows: ```SQL -CREATE SCHEMA catalog.schema_name +CREATE SCHEMA catalog.schema_name ``` ## Table operations @@ -63,7 +62,6 @@ CREATE TABLE catalog.schema_name.table_name ) ``` - ### Alter table Support for the following alter table operations: @@ -85,10 +83,9 @@ Currently, it doesn't support certain query optimizations, such as pushdown and You can set additional properties for tables and schemas in the Hive catalog using "WITH" keyword in the "CREATE" statement. - ### Create a schema with properties -Users can use the following example to create a schema with properties: +Users can use the following example to create a schema with properties: ```sql CREATE SCHEMA "metalake.catalog".dbname @@ -100,15 +97,14 @@ WITH ( The following tables are the properties supported by the Hive schema: | Property | Description | Default Value | Required | Reserved | Since Version | -|----------|---------------------------------|---------------|----------|----------|---------------| +| -------- | ------------------------------- | ------------- | -------- | -------- | ------------- | | location | HDFS location for table storage | (none) | No | No | 0.2.0 | Reserved properties: A reserved property is one can't be set by users but can be read by users. - ### Create a table with properties -Users can use the following example to create a table with properties: +Users can use the following example to create a table with properties: ```sql CREATE TABLE catalog.dbname.tablename @@ -118,14 +114,14 @@ CREATE TABLE catalog.dbname.tablename ) WITH ( format = 'TEXTFILE', KEY = 'VALUE', - ... + ... ); ``` The following tables are the properties supported by the Hive table: | Property | Description | Default Value | Required | Reserved | Since Version | -|----------------|-----------------------------------------|------------------------------------------------------------|----------|----------|---------------| +| -------------- | --------------------------------------- | ---------------------------------------------------------- | -------- | -------- | ------------- | | format | Hive storage format for the table | TEXTFILE | No | No | 0.2.0 | | total_size | Total size of the table | (none) | No | Yes | 0.2.0 | | num_files | Number of files | 0 | No | Yes | 0.2.0 | @@ -136,7 +132,7 @@ The following tables are the properties supported by the Hive table: | output_format | The output format class for the table | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat | No | No | 0.2.0 | | serde_lib | The serde library class for the table | org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe | No | No | 0.2.0 | | serde_name | Name of the serde | table name by default | No | No | 0.2.0 | -| partitioned_by | Partition columns for the table | (none) | No | No | 0.4.0 | +| partitioned_by | Partition columns for the table | (none) | No | No | 0.4.0 | | bucketed_by | Bucket columns for the table | (none) | No | No | 0.4.0 | | bucket_count | Number of buckets for the table | (none) | No | No | 0.4.0 | | sorted_by | Sorted columns for the table | (none) | No | No | 0.4.0 | @@ -146,7 +142,7 @@ The following tables are the properties supported by the Hive table: You need to do the following steps before you can use the Hive catalog in Trino through Gravitino. - Create a metalake and catalog in Gravitino. Assuming that the metalake name is `test` and the catalog name is `hive_test`, -then you can use the following code to create them in Gravitino: + then you can use the following code to create them in Gravitino: ```bash curl -X POST -H "Content-Type: application/json" \ @@ -177,7 +173,7 @@ Use the Trino CLI to connect to the Trino container and run a query. Listing all Gravitino managed catalogs: -```sql +```sql SHOW CATALOGS; ``` @@ -228,7 +224,7 @@ WITH ( partitioned_by = ARRAY['salary'], bucketed_by = ARRAY['name'], bucket_count = 2, - sorted_by = ARRAY['salary'] + sorted_by = ARRAY['salary'] ); ``` @@ -301,4 +297,4 @@ replacing hdfs_user with the appropriate username: ```text -DHADOOP_USER_NAME=hdfs_user -``` \ No newline at end of file +``` diff --git a/docs/trino-connector/catalog-iceberg.md b/docs/trino-connector/catalog-iceberg.md index 19351412bb1..28dff39fa7f 100644 --- a/docs/trino-connector/catalog-iceberg.md +++ b/docs/trino-connector/catalog-iceberg.md @@ -5,13 +5,14 @@ keyword: gravitino connector trino license: "This software is licensed under the Apache License version 2." --- -Apache Iceberg is an open table format for huge analytic datasets. -The Iceberg catalog allows Trino querying data stored in files written in Iceberg format, +Apache Iceberg is an open table format for huge analytic datasets. +The Iceberg catalog allows Trino querying data stored in files written in Iceberg format, as defined in the Iceberg Table Spec. The catalog supports Apache Iceberg table spec versions 1 and 2. ## Requirements To use Iceberg, you need: + - Network access from the Trino coordinator and workers to the distributed object storage. - Access to a Hive metastore service (HMS), an AWS Glue catalog, a JDBC catalog, a REST catalog, or a Nessie server. - Data files stored in a supported file format. These can be configured using file format configuration properties per catalog: @@ -25,7 +26,7 @@ To use Iceberg, you need: Users can create a schema through Apache Gravitino Trino connector as follows: ```SQL -CREATE SCHEMA "metalake.catalog".schema_name +CREATE SCHEMA "metalake.catalog".schema_name ``` ## Table operations @@ -48,6 +49,7 @@ CREATE TABLE "metalake.catalog".schema_name.table_name ### Alter table Support for the following alter table operations: + - Rename table - Add a column - Drop a column @@ -78,25 +80,25 @@ CREATE TABLE "metalake.catalog".dbname.tablename ) WITH ( format = 'TEXTFILE', KEY = 'VALUE', - ... + ... ); ``` The following tables are the properties supported by the Iceberg table: -| Property | Description | Default Value | Required | Reserved | Since Version | -|----------------|-----------------------------------------|------------------------------------------------------------|----------|----------|---------------| -| partitioning | Partition columns for the table | (none) | No | No | 0.4.0 | -| sorted_by | Sorted columns for the table | (none) | No | No | 0.4.0 | +| Property | Description | Default Value | Required | Reserved | Since Version | +| ------------ | ------------------------------- | ------------- | -------- | -------- | ------------- | +| partitioning | Partition columns for the table | (none) | No | No | 0.4.0 | +| sorted_by | Sorted columns for the table | (none) | No | No | 0.4.0 | -Reserved properties: A reserved property is one can't be set by users but can be read by users. +Reserved properties: A reserved property is one can't be set by users but can be read by users. ## Basic usage examples You need to do the following steps before you can use the Iceberg catalog in Trino through Gravitino. - Create a metalake and catalog in Gravitino. Assuming that the metalake name is `test` and the catalog name is `iceberg_test`, -then you can use the following code to create them in Gravitino: + then you can use the following code to create them in Gravitino: ```bash curl -X POST -H "Content-Type: application/json" \ @@ -128,7 +130,7 @@ Use the Trino CLI to connect to the Trino container and run a query. Listing all Gravitino managed catalogs: -```sql +```sql SHOW CATALOGS; ``` @@ -146,7 +148,7 @@ The results are similar to: Query 20231017_082503_00018_6nt3n, FINISHED, 1 node ``` -The `gravitino` catalog is a catalog defined By Trino catalog configuration. +The `gravitino` catalog is a catalog defined By Trino catalog configuration. The `test.iceberg_test` catalog is the catalog created by you in Gravitino. Other catalogs are regular user-configured Trino catalogs. @@ -229,11 +231,11 @@ DROP TABLE "test.iceberg_test".database_01.table_01; ## HDFS username and permissions -Before running any `Insert` statements for Iceberg tables in Trino, +Before running any `Insert` statements for Iceberg tables in Trino, you must check that the user Trino is using to access HDFS has access to the warehouse directory. -You can override this username by setting the HADOOP_USER_NAME system property in the Trino JVM config, +You can override this username by setting the HADOOP_USER_NAME system property in the Trino JVM config, replacing hdfs_user with the appropriate username: ```text -DHADOOP_USER_NAME=hdfs_user -``` \ No newline at end of file +``` diff --git a/docs/trino-connector/catalog-mysql.md b/docs/trino-connector/catalog-mysql.md index 035a66860e9..83773cbab86 100644 --- a/docs/trino-connector/catalog-mysql.md +++ b/docs/trino-connector/catalog-mysql.md @@ -5,18 +5,19 @@ keyword: gravitino connector trino license: "This software is licensed under the Apache License version 2." --- -The MySQL catalog allows querying and creating tables in an external MySQL instance. +The MySQL catalog allows querying and creating tables in an external MySQL instance. You can join data between different systems like MySQL and Hive, or between two different MySQL instances by this. ## Requirements To connect to MySQL, you need: + - MySQL 5.7, 8.0 or higher. - Network access from the Trino coordinator and workers to MySQL. Port 3306 is the default port. ## Create table -At present, the Apache Gravitino connector only supports basic MySQL table creation statements, which involve fields, null allowances, and comments. +At present, the Apache Gravitino connector only supports basic MySQL table creation statements, which involve fields, null allowances, and comments. However, it does not support advanced features like primary keys, indexes, default values, and auto-increment. The Gravitino connector does not support `CREATE TABLE AS SELECT`. @@ -24,6 +25,7 @@ The Gravitino connector does not support `CREATE TABLE AS SELECT`. ## Alter table Support for the following alter table operations: + - Rename table - Add a column - Drop a column @@ -44,7 +46,7 @@ MySQL's tables and schemas cannot support properties. You need to do the following steps before you can use the MySQL catalog in Trino through Gravitino. - Create a metalake and catalog in Gravitino. Assuming that the metalake name is `test` and the catalog name is `mysql_test`, -then you can use the following code to create them in Gravitino: + then you can use the following code to create them in Gravitino: ```bash curl -X POST -H "Content-Type: application/json" \ @@ -77,7 +79,7 @@ Use the Trino CLI to connect to the Trino container and run a query. Listing all Gravitino managed catalogs: -```sql +```sql SHOW CATALOGS; ``` @@ -95,7 +97,7 @@ The results are similar to: Query 20231017_082503_00018_6nt3n, FINISHED, 1 node ``` -The `gravitino` catalog is a catalog defined By Trino catalog configuration. +The `gravitino` catalog is a catalog defined By Trino catalog configuration. The `test.mysql_test` catalog is the catalog created by you in Gravitino. Other catalogs are regular user-configured Trino catalogs. @@ -171,4 +173,4 @@ Drop a table: ```sql DROP TABLE mysql_test.database_01.table_01; -``` \ No newline at end of file +``` diff --git a/docs/trino-connector/catalog-postgresql.md b/docs/trino-connector/catalog-postgresql.md index 6ae6d7fe346..b86b6df4af1 100644 --- a/docs/trino-connector/catalog-postgresql.md +++ b/docs/trino-connector/catalog-postgresql.md @@ -5,18 +5,19 @@ keyword: gravitino connector trino license: "This software is licensed under the Apache License version 2." --- -The PostgreSQL catalog allows querying and creating tables in an external PostgreSQL database. +The PostgreSQL catalog allows querying and creating tables in an external PostgreSQL database. This can be used to join data between different systems like PostgreSQL and Hive, or between different PostgreSQL instances. ## Requirements To connect to PostgreSQL, you need: + - PostgreSQL 10.x or higher. - Network access from the Trino coordinator and workers to PostgreSQL. Port 5432 is the default port. ## Create table -At present, the Apache Gravitino connector only supports basic PostgreSQL table creation statements, which involve fields, null allowances, and comments. +At present, the Apache Gravitino connector only supports basic PostgreSQL table creation statements, which involve fields, null allowances, and comments. However, it does not support advanced features like primary keys, indexes, default values, and auto-increment. The Gravitino connector does not support `CREATE TABLE AS SELECT`. @@ -24,6 +25,7 @@ The Gravitino connector does not support `CREATE TABLE AS SELECT`. ## Alter table Gravitino connector supports the following alter table operations: + - Rename table - Add a column - Drop a column @@ -69,6 +71,7 @@ curl -X POST -H "Content-Type: application/json" \ } }' http://gravitino-host:8090/api/metalakes/test/catalogs ``` + For more information about the PostgreSQL catalog, please refer to [PostgreSQL catalog](../jdbc-postgresql-catalog.md). - Set the value of configuration `gravitino.metalake` to the metalake you have created, named 'test', and start the Trino container. @@ -77,7 +80,7 @@ Use the Trino CLI to connect to the Trino container and run a query. Listing all Gravitino managed catalogs: -```sql +```sql SHOW CATALOGS; ``` @@ -95,7 +98,7 @@ The results are similar to: Query 20231017_082503_00018_6nt3n, FINISHED, 1 node ``` -The `gravitino` catalog is a catalog defined By Trino catalog configuration. +The `gravitino` catalog is a catalog defined By Trino catalog configuration. The `test.postgresql_test` catalog is the catalog created by you in Gravitino. Other catalogs are regular user-configured Trino catalogs. @@ -171,4 +174,4 @@ Drop a table: ```sql DROP TABLE postgresql_test.database_01.table_01; -``` \ No newline at end of file +``` diff --git a/docs/trino-connector/configuration.md b/docs/trino-connector/configuration.md index 25d5d48712e..d3d5fc88524 100644 --- a/docs/trino-connector/configuration.md +++ b/docs/trino-connector/configuration.md @@ -5,10 +5,10 @@ keyword: gravitino connector trino license: "This software is licensed under the Apache License version 2." --- -| Property | Type | Default Value | Description | Required | Since Version | -|----------------------------------|---------|-----------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------------| -| connector.name | string | (none) | The `connector.name` defines the type of Trino connector, this value is always 'gravitino'. | Yes | 0.2.0 | -| gravitino.metalake | string | (none) | The `gravitino.metalake` defines which metalake in Gravitino server the Trino connector uses. Trino connector should set it at start, the value of `gravitino.metalake` needs to be a valid name, Trino connector can detect and load the metalake with catalogs, schemas and tables once created and keep in sync. | Yes | 0.2.0 | -| gravitino.uri | string | http://localhost:8090 | The `gravitino.uri` defines the connection URL of the Gravitino server, the default value is `http://localhost:8090`. Trino connector can detect and connect to Gravitino server once it is ready, no need to start Gravitino server beforehand. | No | 0.2.0 | -| trino.jdbc.user | string | admin | The jdbc user name of current Trino. | NO | 0.5.1 | -| trino.jdbc.password | string | (none) | The jdbc password of current Trino. | NO | 0.5.1 | +| Property | Type | Default Value | Description | Required | Since Version | +| ------------------- | ------ | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | ------------- | +| connector.name | string | (none) | The `connector.name` defines the type of Trino connector, this value is always 'gravitino'. | Yes | 0.2.0 | +| gravitino.metalake | string | (none) | The `gravitino.metalake` defines which metalake in Gravitino server the Trino connector uses. Trino connector should set it at start, the value of `gravitino.metalake` needs to be a valid name, Trino connector can detect and load the metalake with catalogs, schemas and tables once created and keep in sync. | Yes | 0.2.0 | +| gravitino.uri | string | http://localhost:8090 | The `gravitino.uri` defines the connection URL of the Gravitino server, the default value is `http://localhost:8090`. Trino connector can detect and connect to Gravitino server once it is ready, no need to start Gravitino server beforehand. | No | 0.2.0 | +| trino.jdbc.user | string | admin | The jdbc user name of current Trino. | NO | 0.5.1 | +| trino.jdbc.password | string | (none) | The jdbc password of current Trino. | NO | 0.5.1 | diff --git a/docs/trino-connector/development.md b/docs/trino-connector/development.md index 469d591c2e8..8ef49ee286d 100644 --- a/docs/trino-connector/development.md +++ b/docs/trino-connector/development.md @@ -1,7 +1,7 @@ --- title: "Apache Gravitino connector development" slug: /trino-connector/development -keyword: gravitino connector development +keyword: gravitino connector development license: "This software is licensed under the Apache License version 2." --- @@ -29,7 +29,6 @@ curl -X POST -H "Content-Type: application/json" -d '{"name":"mysql_catalog3","t Please change the above `localhost`, `port` and the names of metalake and catalogs accordingly. ::: - ## Development environment To develop the Gravitino connector locally, you need to do the following steps: @@ -39,12 +38,13 @@ To develop the Gravitino connector locally, you need to do the following steps: 1. Clone the Trino repository from the [GitHub](https://github.com/trinodb/trino) repository. The released version Trino-435 is the least version that Gravitino supports. 2. Open the Trino project in your IDEA. 3. Create a new module for the Gravitino connector in the Trino project as the following picture (we will use the name `trino-gravitino` as the module name in the following steps). ![trino-gravitino](../assets/trino/create-gravitino-connector.jpg) -4. Add a soft link to the Gravitino trino connector module in the Trino project. Assuming the src java main directory of the Gravitino trino connector in project Gravitino is `gravitino/path/to/gravitino-trino-connector/src/main/java`, -and the src java main directory of trino-gravitino in the Trino project is `trino/path/to/trino-gravitino/src/main/java`, you can use the following command to create a soft link: +4. Add a soft link to the Gravitino trino connector module in the Trino project. Assuming the src java main directory of the Gravitino trino connector in project Gravitino is `gravitino/path/to/gravitino-trino-connector/src/main/java`, + and the src java main directory of trino-gravitino in the Trino project is `trino/path/to/trino-gravitino/src/main/java`, you can use the following command to create a soft link: ```shell ln -s gravitino/path/to/trino-connector/src/main/java trino/path/to/trino-gravitino/src/main/java ``` + then you can see the `gravitino-trino-connecor` source files and directories in the `trino-gravitino` module as follows: ![trino-gravitino-structure](../assets/trino/add-link.jpg) @@ -149,7 +149,8 @@ then you can see the `gravitino-trino-connecor` source files and directories in ``` -6. Try to compile module `trino-gravitino` to see if there are any errors. +6. Try to compile module `trino-gravitino` to see if there are any errors. + ```shell # build the whole trino project ./mvnw -pl '!core/trino-server-rpm' package -DskipTests -Dair.check.skip-all=true @@ -158,16 +159,18 @@ then you can see the `gravitino-trino-connecor` source files and directories in # build the trino-gravitino module if we change the code in the trino-gravitino module ./mvnw clean -pl 'plugin/trino-gravitino' package -DskipTests -Dcheckstyle.skip -Dair.check.skip-checkstyle=true -DskipTests -Dair.check.skip-all=true ``` + :::note If a compile error occurs due to `The following artifacts could not be resolved: org.apache.gravitino:xxx:jar`, which can be resolved by executing `./gradlew publishToMavenLocal` in gravitino beforehand. ::: 7. Set up the configuration for the Gravitino connector in the Trino project. You can do as the following picture shows: -![](../assets/trino/add-config.jpg) + ![](../assets/trino/add-config.jpg) The corresponding configuration files are here: - Gravitino properties file: `gravitino.properties` + ```properties # the connector name is always 'gravitino' connector.name=gravitino @@ -179,7 +182,9 @@ gravitino.uri=http://localhost:8090 gravitino.metalake=test ``` + - Trino configuration file: `config.properties` + ```properties # # WARNING @@ -227,18 +232,20 @@ catalog.management=dynamic ``` :::note -Remove the file `/etc/catalogs/xxx.properties` if the corresponding `plugin/trino-xxx/pom.xml` is not recorded in the `/etc/config.properties`. For the hive plugin, please use `plugin/trino-hive/pom.xml` after release version 435. Others should use `plugin/trino-hive-hadoop2/pom.xml`. +Remove the file `/etc/catalogs/xxx.properties` if the corresponding `plugin/trino-xxx/pom.xml` is not recorded in the `/etc/config.properties`. For the hive plugin, please use `plugin/trino-hive/pom.xml` after release version 435. Others should use `plugin/trino-hive-hadoop2/pom.xml`. ::: 8. Start the Trino server and connect to the Gravitino server. -![](../assets/trino/start-trino.jpg) + ![](../assets/trino/start-trino.jpg) 9. If `DevelopmentServer` has started successfully, you can connect to the Trino server using the `trino-cli` and run the following command to see if the Gravitino connector is available: + ```shell java -jar trino-cli-429-executable.jar --server localhost:8180 ``` + :::note The `trino-cli-429-executable.jar` is the Trino CLI jar file, you can download it from the [Trino release page](https://trino.io/docs/current/client/cli.html). **Users can use the version of the Trino CLI jar file according to the version of the Trino server.** ::: 10. If nothing goes wrong, you can start developing the Gravitino connector in the Gravitino project and debug it in the Trino project. -![](../assets/trino/show-catalogs.jpg) + ![](../assets/trino/show-catalogs.jpg) diff --git a/docs/trino-connector/installation.md b/docs/trino-connector/installation.md index 0b4f0db6df4..7ab34b64d14 100644 --- a/docs/trino-connector/installation.md +++ b/docs/trino-connector/installation.md @@ -14,8 +14,8 @@ Please refer to the [Deploying Trino documentation](https://trino.io/docs/curren 2. Copy the connector directory to the Trino's plugin directory. Normally, the directory location is `Trino-server-/plugin`, and the directory contains other catalogs used by Trino. 3. Add Trino JVM arguments `-Dlog4j.configurationFile=file:////etc/trino/log4j2.properties` to enable logging for the Gravitino connector. -4. Update Trino coordinator configuration. - You need to set `catalog.management=dynamic`, The config location is `Trino-server-/etc/config.properteis`, and the contents like: +4. Update Trino coordinator configuration. + You need to set `catalog.management=dynamic`, The config location is `Trino-server-/etc/config.properteis`, and the contents like: ```text coordinator=true @@ -45,7 +45,6 @@ docker run --name trino-gravitino -d -p 8080:8080 trinodb/trino:435 Run `docker ps` to check whether the container is running. - ### Installing the Apache Gravitino connector Download the Gravitino connector tarball and unpack it. diff --git a/docs/trino-connector/sql-support.md b/docs/trino-connector/sql-support.md index 934e989a0c1..46ec76798f3 100644 --- a/docs/trino-connector/sql-support.md +++ b/docs/trino-connector/sql-support.md @@ -45,4 +45,4 @@ The connector provides read access and write access to data and metadata stored - [COMMIT](https://trino.io/docs/current/sql/commit.html) - [ROLLBACK](https://trino.io/docs/current/sql/rollback.html) -For more information, please refer to Trino [SQL statements support](https://trino.io/docs/current/language/sql-support.html#sql-globally-available) \ No newline at end of file +For more information, please refer to Trino [SQL statements support](https://trino.io/docs/current/language/sql-support.html#sql-globally-available) diff --git a/docs/trino-connector/supported-catalog.md b/docs/trino-connector/supported-catalog.md index 306b2dcc2da..18fc63b0ac9 100644 --- a/docs/trino-connector/supported-catalog.md +++ b/docs/trino-connector/supported-catalog.md @@ -14,7 +14,7 @@ The catalogs currently supported by the Apache Gravitino connector are as follow ## Create catalog -Users can create catalogs through the Gravitino connector and then load them into Trino. +Users can create catalogs through the Gravitino connector and then load them into Trino. The Gravitino connector provides the following stored procedures to create, delete, and alter catalogs. User can also use the system table `catalog` to describe all the catalogs. @@ -30,12 +30,12 @@ create_catalog(CATALOG varchar, PROVIDER varchar, PROPERTIES MAP(VARCHAR, VARCHA - IGNORE_EXIST: The flag to ignore the error if the catalog already exists. It's optional, the default value is `false`. The type of catalog properties reference: + - [Hive catalog](../apache-hive-catalog.md#catalog-properties) - [Iceberg catalog](../lakehouse-iceberg-catalog.md#catalog-properties) - [MySQL catalog](../jdbc-mysql-catalog.md#catalog-properties) - [PostgreSQL catalog](../jdbc-postgresql-catalog.md#catalog-properties) - Drop catalog: ```sql @@ -45,7 +45,6 @@ drop_catalog(CATALOG varchar, IGNORE_NOT_EXIST boolean); - CATALOG: The catalog name to be deleted. - IGNORE_NOT_EXIST: The flag to ignore the error if the catalog does not exist. It's optional, the default value is `false`. - Alter catalog: ```sql @@ -59,7 +58,6 @@ alter_catalog(CATALOG varchar, SET_PROPERTIES MAP(VARCHAR, VARCHAR), REMOVE_PROP These stored procedures are under the `gravitino` connector and the `system` schema. So you need to use the following SQL to call them in the `trino-cli`: - Describe catalogs: The system table `gravitino.system.catalog` is used to describe all the catalogs. @@ -121,6 +119,7 @@ if you need more information about catalog, please refer to: [Create a Catalog](../manage-relational-metadata-using-gravitino.md#create-a-catalog). ## Passing Trino connector configuration + A Gravitino catalog is implemented by the Trino connector, so you can pass the Trino connector configuration to the Gravitino catalog. For example, you want to set the `hive.config.resources` configuration for the Hive catalog, you can pass the configuration to the Gravitino catalog like this: @@ -139,6 +138,7 @@ call gravitino.system.create_catalog( A prefix with `trino.bypass.` in the configuration key is used to indicate Gravitino connector to pass the Trino connector configuration to the Gravitino catalog in the Trino runtime. More trino connector configurations can refer to: + - [Hive catalog](https://trino.io/docs/current/connector/hive.html#hive-general-configuration-properties) - [Iceberg catalog](https://trino.io/docs/current/connector/iceberg.html#general-configuration) - [MySQL catalog](https://trino.io/docs/current/connector/mysql.html#general-configuration-properties) @@ -150,7 +150,7 @@ Gravitino connector supports the following data type conversions between Trino a Hive does not support `TIME` data type. | Gravitino Type | Trino Type | -|----------------|------------| +| -------------- | ---------- | | BooleanType | BOOLEAN | | ByteType | TINYINT | | ShortType | SMALLINT | diff --git a/docs/trino-connector/trino-connector.md b/docs/trino-connector/trino-connector.md index f1167fe9a49..97d224915e9 100644 --- a/docs/trino-connector/trino-connector.md +++ b/docs/trino-connector/trino-connector.md @@ -7,14 +7,14 @@ license: "This software is licensed under the Apache License version 2." Trino can manage and access data using the Trino connector provided by `Apache Gravitino`, commonly referred to as the `Gravitino connector`. After configuring the Gravitino connector in Trino, Trino can automatically load catalog metadata from Gravitino, allowing users to directly access these catalogs in Trino. -Once integrated with Gravitino, Trino can operate on all Gravitino data without requiring additional configuration. +Once integrated with Gravitino, Trino can operate on all Gravitino data without requiring additional configuration. The Gravitino connector uses the [Trino dynamic catalog managed mechanism](https://trino.io/docs/current/admin/properties-catalog.html) to load catalogs. -When the Gravitino connector retrieves catalogs from the Gravitino server, it generates a `CREATE CATAGLOG` statement and executes +When the Gravitino connector retrieves catalogs from the Gravitino server, it generates a `CREATE CATAGLOG` statement and executes the statement on the current Trino server to register the catalogs with Trino :::node -Once metadata such as catalogs are changed in Gravitino, Trino can update itself through Gravitino, this process usually takes -about 3~10 seconds. +Once metadata such as catalogs are changed in Gravitino, Trino can update itself through Gravitino, this process usually takes +about 3~10 seconds. ::: By default, the loading of Gravitino's catalogs into Trino follows the naming convention: @@ -28,5 +28,3 @@ Usage in queries is as follows: ```text SELECT * from catalog.dbname.tablename ``` - - diff --git a/docs/webui.md b/docs/webui.md index 94ebefa1525..afc8b03174a 100644 --- a/docs/webui.md +++ b/docs/webui.md @@ -1,11 +1,11 @@ --- -title: 'Apache Gravitino web UI' +title: "Apache Gravitino web UI" slug: /webui keyword: webui last_update: date: 2024-04-12 author: ch3yne -license: 'This software is licensed under the Apache License version 2.' +license: "This software is licensed under the Apache License version 2." --- This document primarily outlines how users can manage metadata within Apache Gravitino using the web UI, the graphical interface is accessible through a web browser as an alternative to writing code or using the REST interface. @@ -150,9 +150,9 @@ Creating a catalog requires these fields: 1. **Catalog name**(**_required_**): the name of the catalog 2. **Type**(**_required_**): `relational`/`fileset`/`messaging`, the default value is `relational` 3. **Provider**(**_required_**): - 1. Type `relational` - `hive`/`iceberg`/`mysql`/`postgresql`/`doris` - 2. Type `fileset` - `hadoop` - 3. Type `messaging` - `kafka` + 1. Type `relational` - `hive`/`iceberg`/`mysql`/`postgresql`/`doris` + 2. Type `fileset` - `hadoop` + 3. Type `messaging` - `kafka` 4. **Comment**(_optional_): the comment of this catalog 5. **Properties**(**each `provider` must fill in the required property fields specifically**) diff --git a/integration-test/trino-it/docker-compose.yaml b/integration-test/trino-it/docker-compose.yaml index 04f9264edb0..7962b350607 100644 --- a/integration-test/trino-it/docker-compose.yaml +++ b/integration-test/trino-it/docker-compose.yaml @@ -17,9 +17,8 @@ # under the License. # -version: '3.0' +version: "3.0" services: - hive: image: datastrato/gravitino-ci-hive:0.1.12 networks: @@ -27,7 +26,7 @@ services: container_name: trino-ci-hive environment: - HADOOP_USER_NAME=anonymous - entrypoint: /bin/bash /tmp/hive/init.sh + entrypoint: /bin/bash /tmp/hive/init.sh volumes: - ./init/hive:/tmp/hive - ../build/trino-ci-container-log/hive:/tmp/root @@ -68,8 +67,7 @@ services: MYSQL_USER: trino MYSQL_PASSWORD: ds123 MYSQL_DATABASE: gt_db - command: - --default-authentication-plugin=mysql_native_password + command: --default-authentication-plugin=mysql_native_password --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --explicit_defaults_for_timestamp=true @@ -91,7 +89,7 @@ services: - GRAVITINO_HOST_PORT=${GRAVITINO_SERVER_PORT:-8090} - GRAVITINO_METALAKE_NAME=test - HIVE_HOST_IP=hive - entrypoint: /bin/bash /tmp/trino/init.sh + entrypoint: /bin/bash /tmp/trino/init.sh volumes: - ./init/trino:/tmp/trino - ../../trino-connector/build/libs:/usr/lib/trino/plugin/gravitino @@ -110,7 +108,6 @@ services: mysql: condition: service_healthy - networks: trino-net: driver: bridge diff --git a/rfc/rfc-1/rfc-1.md b/rfc/rfc-1/rfc-1.md index f8bf8b40c8c..5818e06883f 100644 --- a/rfc/rfc-1/rfc-1.md +++ b/rfc/rfc-1/rfc-1.md @@ -16,6 +16,7 @@ specific language governing permissions and limitations under the License. --> + # RFC-1: Metadata Spec Design | Revision | Owner | @@ -36,14 +37,14 @@ 1. We choose JSON protocol as our user-faced protocol, which is easy to debug for users and systems. 2. We choose Protobuf binary layout to store the schema, the main considerations are here: - 1. Binary layout is much more concise compared to HMS’s schema layout. - 2. A general-purpose NoSQL database can be used to store the schema, which will get better performance and scalability compared to Hive Metastore. + 1. Binary layout is much more concise compared to HMS’s schema layout. + 2. A general-purpose NoSQL database can be used to store the schema, which will get better performance and scalability compared to Hive Metastore. ## Meta System ### Prerequisites -1. The field name of schema should use lowercase with "_" connecting different words, the name convention is `^[a-z](?:_?[a-z0-9]+)*$`. +1. The field name of schema should use lowercase with "_" connecting different words, the name convention is `^[a-z](?:_?[a-z0-9]+)\*$`. 2. The schema system uses Google Protobuf to describe the structs. ### Schema Entities @@ -59,42 +60,42 @@ The schema system in Apache Gravitino is organized like below: #### SchemaVersion -| Field Name | Field Type | Description | Optional | -| ------------- | ---------- | ------------------------------------------------------------ | -------- | +| Field Name | Field Type | Description | Optional | +| ------------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -------- | | major_version | uint32 | The major version of the schema system. Backward compatibility is guaranteed within the major version and is best-effort guaranteed between versions. | Required | -| minor_version | uint32 | The minor version of the schema system. Backward compatibility is guaranteed between versions | Required | +| minor_version | uint32 | The minor version of the schema system. Backward compatibility is guaranteed between versions | Required | #### AuditInfo -| Field Name | Field Type | Description | Optional | -| ------------------ | ---------- | ------------------------------------------------------------ | -------- | -| creator | string | The name of user who creates the schema entity | Required | -| create_time | timestamp | Google Protobuf timestamp type to represent when entity is created | Required | -| last_modifier | string | The name of user who modified the schema entity last time | Optional | +| Field Name | Field Type | Description | Optional | +| ------------------ | ---------- | ------------------------------------------------------------------- | -------- | +| creator | string | The name of user who creates the schema entity | Required | +| create_time | timestamp | Google Protobuf timestamp type to represent when entity is created | Required | +| last_modifier | string | The name of user who modified the schema entity last time | Optional | | last_modified_time | timestamp | Google Protobuf timestamp type to represent when entity is modified | Optional | #### Metalake -| Field Name | Field Type | Description | Optional | -| ---------- | ------------------- | ------------------------------------------------------------ | -------- | +| Field Name | Field Type | Description | Optional | +| ---------- | ------------------- | ---------------------------------------------------------------------- | -------- | | id | uint64 | The unique identifier of the metalake, this is generated by the system | Required | -| name | string | The name of the metalake | Required | -| comment | string | The comment of the metalake | Optional | -| properties | map | The properties of the metalake | Optional | -| audit_info | AuditInfo | The detailed audit info of metalake | Required | -| version | SchemaVersion | The version info of the stored schema | Required | +| name | string | The name of the metalake | Required | +| comment | string | The comment of the metalake | Optional | +| properties | map | The properties of the metalake | Optional | +| audit_info | AuditInfo | The detailed audit info of metalake | Required | +| version | SchemaVersion | The version info of the stored schema | Required | #### Catalog -| Field Name | Field Type | Description | Optional | -| ------------ | -------------------------------------- | ------------------------------------------------------------ | -------- | -| id | uint64 | The unique identifier of the catalog, this is generated by the system | Required | -| metalake_id | uint64 | The unique identifier of the metalake which includes this catalog | Required | -| name | string | The name of the catalog | Required | -| comment | string | The comment of the catalog | Required | -| type | Enum of {RELATIONAL, FILE, STREAM, ML} | The type of the catalog, currently we support is "RELATIONAL" (catalog for relational data structure) | Required | -| properties | map | The properties of the catalog | Optional | -| audit_info | AuditInfo | The audit info of the catalog | Required | +| Field Name | Field Type | Description | Optional | +| ----------- | -------------------------------------- | ----------------------------------------------------------------------------------------------------- | -------- | +| id | uint64 | The unique identifier of the catalog, this is generated by the system | Required | +| metalake_id | uint64 | The unique identifier of the metalake which includes this catalog | Required | +| name | string | The name of the catalog | Required | +| comment | string | The comment of the catalog | Required | +| type | Enum of {RELATIONAL, FILE, STREAM, ML} | The type of the catalog, currently we support is "RELATIONAL" (catalog for relational data structure) | Required | +| properties | map | The properties of the catalog | Optional | +| audit_info | AuditInfo | The audit info of the catalog | Required | ##### Catalog for relational data structure @@ -102,6 +103,6 @@ The relational data structure referrers data stored in DB or DWS, and organized ![catalog-interface](catalog-interface.png) -* **BaseCatalog**: `BaseCatalog` is the base class for catalog, the implementation should inherit it to implement its own. -* **SupportNamespaces**: `SupportNamespaces` provides the APIs to create structured metadata, like `Database`. -* **TableCatalog**: `TableCatalog` defines the APIs to manipulate `Table` and it's `Column` entities. The specific `TableCatalog` implementation should also implement `Table` and `Column` to satisfy the specific underlying metadata source. +- **BaseCatalog**: `BaseCatalog` is the base class for catalog, the implementation should inherit it to implement its own. +- **SupportNamespaces**: `SupportNamespaces` provides the APIs to create structured metadata, like `Database`. +- **TableCatalog**: `TableCatalog` defines the APIs to manipulate `Table` and it's `Column` entities. The specific `TableCatalog` implementation should also implement `Table` and `Column` to satisfy the specific underlying metadata source. diff --git a/rfc/rfc-2/Entity-key-encoding-for-kv-store.md b/rfc/rfc-2/Entity-key-encoding-for-kv-store.md index 7de06eb1af0..1aa50764b4a 100644 --- a/rfc/rfc-2/Entity-key-encoding-for-kv-store.md +++ b/rfc/rfc-2/Entity-key-encoding-for-kv-store.md @@ -19,13 +19,14 @@ # RFC-1: Entity Key Encoding design for KV store -| Revision | Owner | Date | -| :------- |-------| ------| -| v0.1 | Qi Yu | 1/8/2023| -| v0.2 | Qi Yu | 5/9/2023| +| Revision | Owner | Date | +| :------- | ----- | -------- | +| v0.1 | Qi Yu | 1/8/2023 | +| v0.2 | Qi Yu | 5/9/2023 | ## Background -Currently, there will be many data to storage, for example, + +Currently, there will be many data to storage, for example, User information. Such as username, password, user property, this data is structure data Metadata. Metadata is the key point of our product. Metadata is Heterogeneous and data may be very large Other information, such as query history, query log and so on @@ -48,19 +49,19 @@ According to the picture above, Metadata in gravitino can be divided into multip ### Target We should design a key encoding method to encode the key of KV store that should satisfy the following requirements: -- Support fast point queries + +- Support fast point queries - Support efficient range queries -- Not very complicated +- Not very complicated - Good expandability and compatibility +### Design -### Design - -Firstly, we introduce a global auto-increment ID (or simply a UUID) that represents the name of namespace. This ID is unique in the whole system. +Firstly, we introduce a global auto-increment ID (or simply a UUID) that represents the name of namespace. This ID is unique in the whole system. For example, if there exists a catalog named `catalog1` with namespace name `metalake1`, and a schema name `schema3` under `catalog2`, then we will add the following key-value pair to KV store -| Key | Value | Description | -|:------------|-------------|----------------------------------------------| +| Key | Value | Description | +| :---------- | ----------- | -------------------------------------------- | | metalake1 | 1 | name to id mapping, | | 1/catalog2 | 2 | name to id mapping, 1 is the id of metalake1 | | 1/2/schema3 | 3 | name to id mapping, 2 is the id of catalog2 | @@ -71,16 +72,15 @@ For example, if there exists a catalog named `catalog1` with namespace name `met Note, for `catalog` and `makelake`, Considering the global uniqueness, we will use a UUID instead of auto-increment ID. `schema`, `table` and other entities will use auto-increment ID. - Why we introduce this global auto-increment ID? Because we want to support the following features: + - If we want to rename a namespace, we can just update the name to id mapping - If the name is too long, we can use a short name to represent it when encoding key of entity (see below) Then, The whole key of entity can be encoded as the following format - -| Key | Value | Description | -|:-----------------------------------------------|---------------|---------------------------------| +| Key | Value | Description | +| :--------------------------------------------- | ------------- | ------------------------------- | | ml/{ml_id} | metalake info | ml is a short name for metalake | | ml/{ml_id} | metalake info | ml is a short name for metalake | | ca/{ml_id}/{ca_id} | catalog_info | ca is a short name for catalog | @@ -94,6 +94,4 @@ Then, The whole key of entity can be encoded as the following format ## Implementation -Please see code ```BinaryEntityKeyEncoder``` - - +Please see code `BinaryEntityKeyEncoder` diff --git a/rfc/rfc-3/Transaction-implementation-on-kv.md b/rfc/rfc-3/Transaction-implementation-on-kv.md index 4d902700b38..d84ce4252f3 100644 --- a/rfc/rfc-3/Transaction-implementation-on-kv.md +++ b/rfc/rfc-3/Transaction-implementation-on-kv.md @@ -20,7 +20,7 @@ # RFC-1: Design of transaction mechanism on key-value store | Revision | Owner | Date | -| :------- |-------|------------| +| :------- | ----- | ---------- | | v0.1 | Qi Yu | 21/11/2023 | ## Background @@ -43,12 +43,14 @@ The following figure shows the design of transaction mechanism. ![](../resouces/Transaction.jpg) Note: + 1. A, B, C, is the original keys 2. ts1, ts2, ts3 are the timestamp of the transaction 3. tx_ts1, tx_ts2, tx_ts3 are commit marks. Take the above figure as an example, the transaction is as follows: Assuming we want to update three key-values pairs: + 1. Change the value of Key A from 100 to 150 2. Change the value of Key B from 150 to 200 3. Change the value of Key C from 300 to 200 @@ -56,6 +58,7 @@ Assuming we want to update three key-values pairs: The transaction process is as follows: **Prepare stage** + 1. First, we will get a TSO(Timestamp oracle) named ts2 as the transaction id. 2. Then we will read old values of A, B, C using the TSO ts2. 3. Update the value of A, B, C to 150, 200, 200 respectively. @@ -63,14 +66,13 @@ The transaction process is as follows: 5. Then we will write the new key-value pairs to the storage layer. **Commit stage** -We would construct the commit mark tx_ts2 and save it to the storage layer. The value of tx_ts2 contains +We would construct the commit mark tx_ts2 and save it to the storage layer. The value of tx_ts2 contains all keys in the transaction. **Rollback stage** -If any steps in prepare stage or commit stage fails, we will roll back the transaction. In fact, we -need to do nothing to roll back the transaction. Because we have added a version number to each key-value pair and -those keys in the failed transaction will not be visible to users. - +If any steps in prepare stage or commit stage fails, we will roll back the transaction. In fact, we +need to do nothing to roll back the transaction. Because we have added a version number to each key-value pair and +those keys in the failed transaction will not be visible to users. ## Detail implementation @@ -79,10 +81,12 @@ those keys in the failed transaction will not be visible to users. Assuming we want to put key-value pairs 'key1:value1' and 'key2:value2' to the storage layer. The tso we get is 1, The process is as follows: In prepare stage, we will put the following keys into the storage layer: + ``` KEY: 0x6B657931 1F FFFFFFFFFFFFFFFE ---> VALUE: 0x00000000 00000000 76616C756531 KEY: 0x6B657932 1F FFFFFFFFFFFFFFFE ---> VALUE: 0x00000000 00000000 76616C756532 ``` + - `6B657931`: the hex of 'key1' - `1F`: we use `1F` space as the separator of key and TSO. - `FFFFFFFFFFFFFFFE`: Represent tso 1. Note, we use 8 bytes to represent tso. How to convert 1 to `FFFFFFFFFFFFFFFE`? First we convert 1 to 0x0000000000000001, then we use `^` 0xFF to get the complement of 0x0000000000000001, then we get 0xFFFFFFFFFFFFFFFE. @@ -90,51 +94,60 @@ KEY: 0x6B657932 1F FFFFFFFFFFFFFFFE ---> VALUE: 0x00000000 00000000 76616C75653 - `00000000 00000000 76616C756531`: the hex format of 'value1'. The first byte `0x00` means is put operation, if the value is '0x01', it marks the key-value pair has been deleted. In the commit stage, we will put the following keys into the storage layer: + ``` -KEY: 0x1E 1F FFFFFFFFFFFFFFFE ---> VALUE: keys of the transaction involved. +KEY: 0x1E 1F FFFFFFFFFFFFFFFE ---> VALUE: keys of the transaction involved. ``` -- `1E`: prefix of transaction commit mark + +- `1E`: prefix of transaction commit mark - `1F`: separator - `FFFFFFFFFFFFFFFE`: Represent tso 1. Note, we use 8 bytes to represent tso. How to convert 1 to `FFFFFFFFFFFFFFFE`? First we convert 1 to 0x0000000000000001, then we use `^` 0xFF to get the complement of 0x0000000000000001, then we get 0xFFFFFFFFFFFFFFFE. ### Read process Assuming we have the following key-value pairs in storage layer: + ``` KEY: 0x6B657931 1F FFFFFFFFFFFFFFFD ---> VALUE: 0x00000000 00000000 76616C756532 KEY: 0x6B657931 1F FFFFFFFFFFFFFFFE ---> VALUE: 0x00000000 00000000 76616C756531 -KEY: 0x1E 1F FFFFFFFFFFFFFFFD ---> VALUE: keys of the transaction involved. -KEY: 0x1E 1F FFFFFFFFFFFFFFFE ---> VALUE: keys of the transaction involved. +KEY: 0x1E 1F FFFFFFFFFFFFFFFD ---> VALUE: keys of the transaction involved. +KEY: 0x1E 1F FFFFFFFFFFFFFFFE ---> VALUE: keys of the transaction involved. ``` + If we want to get the value of key1, the process is as follows: + 1. First, we will get a TSO(Timestamp oracle) 3 as the transaction id. 2. Construct the start key to scan the storage layer: `0x6B657931 1F FFFFFFFFFFFFFFFC` 3. Find the first key that with prefix `0x6B657931` and greater than start key `0x6B657931 1F FFFFFFFFFFFFFFFC`, we will get `0x6B657931 1F FFFFFFFFFFFFFFFD` 4. If there exists the key `0x1E 1F FFFFFFFFFFFFFFFE`, means the transaction is committed, then we will get the value of key1 from `0x6B657931 1F FFFFFFFFFFFFFFFD`. 5. or repeat steps 3 -6. If the value of key `0x6B657931 1F FFFFFFFFFFFFFFFD` starts will `0x00`, then we will get the value of key1 from `0x6B657931 1F FFFFFFFFFFFFFFFD`. if the value of key `0x6B657931 1F FFFFFFFFFFFFFFFD` starts will `0x01`, it means this key-value pair has been removed, so we return null. +6. If the value of key `0x6B657931 1F FFFFFFFFFFFFFFFD` starts will `0x00`, then we will get the value of key1 from `0x6B657931 1F FFFFFFFFFFFFFFFD`. if the value of key `0x6B657931 1F FFFFFFFFFFFFFFFD` starts will `0x01`, it means this key-value pair has been removed, so we return null. ### Delete process -Delete steps are almost the same as that of write process except that the prefix of it is `0x01` instead of `0x00`. + +Delete steps are almost the same as that of write process except that the prefix of it is `0x01` instead of `0x00`. Put key 'test1': + ``` KEY: 0x6B657931 1F FFFFFFFFFFFFFFFE ---> VALUE: 0x00000000 00000000 76616C756531 ``` Delete key 'test1': + ``` KEY: 0x6B657931 1F FFFFFFFFFFFFFFFE ---> VALUE: 0x01000000 00000000 76616C756531 ``` ### Scan and range query process -Scan and range query are almost the same as that of read process, for more detailed information, please see related implementation `TransactionalKvBackendImpl`. + +Scan and range query are almost the same as that of read process, for more detailed information, please see related implementation `TransactionalKvBackendImpl`. ## Key format after this modification - Keys that start with 0x'1D0000' store the contents of id-name mapping. for more please refer to class `KvNameMappingService`. - Keys that start with 0x'1D0001' store the data of current timestamp which is used for generating transaction id, for more please refer to class `TransactionIdGeneratorImpl`. - Keys that start with 0x'1D0002' store the information of storage layout version. For more please refer to `KvEntityStore#initStorageVersionInfo` -- Keys that start with 0x'1D0003' store tha transaction id that was used by `KvGarbageCollector` last time. +- Keys that start with 0x'1D0003' store tha transaction id that was used by `KvGarbageCollector` last time. - Keys that start with 0x'1E' store transaction marks which mark the transaction is committed or not. -- Other key spaces are used to store gravitino entities like `metalakes`,`catalogs`, `scheams`, `tables` and so on. it usually starts with from 0x'20'(space) to 0x'7F'(delete). For more please refer to class `KvEntityStoreImpl`. \ No newline at end of file +- Other key spaces are used to store gravitino entities like `metalakes`,`catalogs`, `scheams`, `tables` and so on. it usually starts with from 0x'20'(space) to 0x'7F'(delete). For more please refer to class `KvEntityStoreImpl`. diff --git a/web/.eslintrc.js b/web/.eslintrc.js index 2bfd6f9ed70..bfebd11718e 100644 --- a/web/.eslintrc.js +++ b/web/.eslintrc.js @@ -34,21 +34,21 @@ module.exports = { allowBlockStart: true, allowClassStart: true, allowObjectStart: true, - allowArrayStart: true - } + allowArrayStart: true, + }, ], 'newline-before-return': 'error', 'import/newline-after-import': [ 'error', { - count: 1 - } + count: 1, + }, ], 'padding-line-between-statements': [ 'error', { blankLine: 'always', prev: ['export'], next: ['*'] }, - { blankLine: 'always', prev: ['*'], next: ['multiline-const', 'multiline-let', 'multiline-var', 'export'] } - ] - } + { blankLine: 'always', prev: ['*'], next: ['multiline-const', 'multiline-let', 'multiline-var', 'export'] }, + ], + }, } diff --git a/web/.prettierrc.js b/web/.prettierrc.js index 1c02ea995c7..bec7781f4d6 100644 --- a/web/.prettierrc.js +++ b/web/.prettierrc.js @@ -33,5 +33,5 @@ module.exports = { htmlWhitespaceSensitivity: 'css', insertPragma: false, bracketSameLine: false, - proseWrap: 'preserve' + proseWrap: 'preserve', } diff --git a/web/next.config.js b/web/next.config.js index 0b6a33058c0..632f9c57dfb 100644 --- a/web/next.config.js +++ b/web/next.config.js @@ -18,7 +18,7 @@ */ const withBundleAnalyzer = require('@next/bundle-analyzer')({ - enabled: process.env.ANALYZE === 'true' + enabled: process.env.ANALYZE === 'true', }) const isProdEnv = process.env.NODE_ENV === 'production' @@ -38,25 +38,25 @@ const nextConfig = { fallback: [ { source: '/api/:path*', - destination: `${apiUrl}/api/:path*` + destination: `${apiUrl}/api/:path*`, }, { source: '/configs', - destination: `${apiUrl}/configs` + destination: `${apiUrl}/configs`, }, { source: `${oauthPath}`, - destination: `${oauthUri}${oauthPath}` - } - ] + destination: `${oauthUri}${oauthPath}`, + }, + ], } - } + }, }), output: process.env.OUTPUT_MODE || 'standalone', basePath: process.env.BASE_PATH, distDir: process.env.DIST_DIR, trailingSlash: false, - reactStrictMode: true + reactStrictMode: true, } module.exports = withBundleAnalyzer(nextConfig) diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 02efeb4dc2a..cd90e6981b8 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false importers: - .: dependencies: '@emotion/cache': @@ -143,130 +142,161 @@ importers: version: 5.5.3 packages: - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== } + engines: { node: '>=10' } '@ant-design/colors@7.1.0': - resolution: {integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg==} + resolution: + { integrity: sha512-MMoDGWn1y9LdQJQSHiCC20x3uZ3CwQnv9QMz6pCmJOrqdgM9YxsoVVY0wtrdXbmfSgnV0KNk6zi09NAhMR2jvg== } '@ant-design/cssinjs@1.21.0': - resolution: {integrity: sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA==} + resolution: + { integrity: sha512-gIilraPl+9EoKdYxnupxjHB/Q6IHNRjEXszKbDxZdsgv4sAZ9pjkCq8yanDWNvyfjp4leir2OVAJm0vxwKK8YA== } peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' '@ant-design/icons-svg@4.4.2': - resolution: {integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==} + resolution: + { integrity: sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA== } '@ant-design/icons@5.3.7': - resolution: {integrity: sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-bCPXTAg66f5bdccM4TT21SQBDO1Ek2gho9h3nO9DAKXJP4sq+5VBjrQMSxMVXSB3HyEz+cUbHQ5+6ogxCOpaew== } + engines: { node: '>=8' } peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' '@ant-design/react-slick@1.1.2': - resolution: {integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA==} + resolution: + { integrity: sha512-EzlvzE6xQUBrZuuhSAFTdsr4P2bBBHGZwKFemEfq8gIGyIQCxalYfZW/T2ORbtQx5rU69o+WycP3exY/7T1hGA== } peerDependencies: react: '>=16.9.0' '@antfu/install-pkg@0.1.1': - resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + resolution: + { integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ== } '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} + resolution: + { integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww== } '@babel/code-frame@7.24.7': - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA== } + engines: { node: '>=6.9.0' } '@babel/generator@7.24.7': - resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA== } + engines: { node: '>=6.9.0' } '@babel/helper-environment-visitor@7.24.7': - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ== } + engines: { node: '>=6.9.0' } '@babel/helper-function-name@7.24.7': - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA== } + engines: { node: '>=6.9.0' } '@babel/helper-hoist-variables@7.24.7': - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ== } + engines: { node: '>=6.9.0' } '@babel/helper-module-imports@7.24.7': - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA== } + engines: { node: '>=6.9.0' } '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA== } + engines: { node: '>=6.9.0' } '@babel/helper-string-parser@7.24.7': - resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg== } + engines: { node: '>=6.9.0' } '@babel/helper-validator-identifier@7.24.7': - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w== } + engines: { node: '>=6.9.0' } '@babel/highlight@7.24.7': - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw== } + engines: { node: '>=6.9.0' } '@babel/parser@7.24.7': - resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw== } + engines: { node: '>=6.0.0' } hasBin: true '@babel/runtime@7.24.7': - resolution: {integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== } + engines: { node: '>=6.9.0' } '@babel/template@7.24.7': - resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig== } + engines: { node: '>=6.9.0' } '@babel/traverse@7.24.7': - resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA== } + engines: { node: '>=6.9.0' } '@babel/types@7.24.7': - resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q== } + engines: { node: '>=6.9.0' } '@ctrl/tinycolor@3.6.1': - resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA== } + engines: { node: '>=10' } '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} + resolution: + { integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== } + engines: { node: '>=10.0.0' } '@emotion/babel-plugin@11.11.0': - resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==} + resolution: + { integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== } '@emotion/cache@11.11.0': - resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + resolution: + { integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== } '@emotion/hash@0.8.0': - resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + resolution: + { integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== } '@emotion/hash@0.9.1': - resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + resolution: + { integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== } '@emotion/is-prop-valid@1.2.2': - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + resolution: + { integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== } '@emotion/memoize@0.8.1': - resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + resolution: + { integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== } '@emotion/react@11.11.4': - resolution: {integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==} + resolution: + { integrity: sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== } peerDependencies: '@types/react': '*' react: '>=16.8.0' @@ -275,13 +305,16 @@ packages: optional: true '@emotion/serialize@1.1.4': - resolution: {integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==} + resolution: + { integrity: sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ== } '@emotion/sheet@1.2.2': - resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==} + resolution: + { integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== } '@emotion/styled@11.11.5': - resolution: {integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==} + resolution: + { integrity: sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ== } peerDependencies: '@emotion/react': ^11.0.0-rc.0 '@types/react': '*' @@ -291,250 +324,301 @@ packages: optional: true '@emotion/unitless@0.7.5': - resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + resolution: + { integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== } '@emotion/unitless@0.8.1': - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + resolution: + { integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== } '@emotion/use-insertion-effect-with-fallbacks@1.0.1': - resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} + resolution: + { integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== } peerDependencies: react: '>=16.8.0' '@emotion/utils@1.2.1': - resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==} + resolution: + { integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== } '@emotion/weak-memoize@0.3.1': - resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + resolution: + { integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== } '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== } + engines: { node: '>=12' } cpu: [ppc64] os: [aix] '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== } + engines: { node: '>=12' } cpu: [arm64] os: [android] '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== } + engines: { node: '>=12' } cpu: [arm] os: [android] '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== } + engines: { node: '>=12' } cpu: [x64] os: [android] '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== } + engines: { node: '>=12' } cpu: [arm64] os: [darwin] '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== } + engines: { node: '>=12' } cpu: [x64] os: [darwin] '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== } + engines: { node: '>=12' } cpu: [arm64] os: [freebsd] '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== } + engines: { node: '>=12' } cpu: [x64] os: [freebsd] '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== } + engines: { node: '>=12' } cpu: [arm64] os: [linux] '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== } + engines: { node: '>=12' } cpu: [arm] os: [linux] '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== } + engines: { node: '>=12' } cpu: [ia32] os: [linux] '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== } + engines: { node: '>=12' } cpu: [loong64] os: [linux] '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== } + engines: { node: '>=12' } cpu: [mips64el] os: [linux] '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== } + engines: { node: '>=12' } cpu: [ppc64] os: [linux] '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== } + engines: { node: '>=12' } cpu: [riscv64] os: [linux] '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== } + engines: { node: '>=12' } cpu: [s390x] os: [linux] '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== } + engines: { node: '>=12' } cpu: [x64] os: [linux] '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== } + engines: { node: '>=12' } cpu: [x64] os: [netbsd] '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== } + engines: { node: '>=12' } cpu: [x64] os: [openbsd] '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== } + engines: { node: '>=12' } cpu: [x64] os: [sunos] '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== } + engines: { node: '>=12' } cpu: [arm64] os: [win32] '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== } + engines: { node: '>=12' } cpu: [ia32] os: [win32] '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== } + engines: { node: '>=12' } cpu: [x64] os: [win32] '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 '@eslint-community/regexpp@4.11.0': - resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + resolution: + { integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } '@eslint/js@8.57.0': - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } '@floating-ui/core@1.6.4': - resolution: {integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA==} + resolution: + { integrity: sha512-a4IowK4QkXl4SCWTGUR0INAfEOX3wtsYw3rKK5InQEHMGObkR8Xk44qYQD9P4r6HHw0iIfK6GUKECmY8sTkqRA== } '@floating-ui/dom@1.6.7': - resolution: {integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng==} + resolution: + { integrity: sha512-wmVfPG5o2xnKDU4jx/m4w5qva9FWHcnZ8BvzEe90D/RpwsJaTAVYPEPdQ8sbr/N8zZTAHlZUTQdqg8ZUbzHmng== } '@floating-ui/react-dom@2.1.1': - resolution: {integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg==} + resolution: + { integrity: sha512-4h84MJt3CHrtG18mGsXuLCHMrug49d7DFkU0RMIyshRveBeyV2hmV/pDaF2Uxtu8kgq5r46llp5E5FQiR0K2Yg== } peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' '@floating-ui/utils@0.2.4': - resolution: {integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA==} + resolution: + { integrity: sha512-dWO2pw8hhi+WrXq1YJy2yCuWoL20PddgGaqTgVe4cOS9Q6qklXCiA1tJEqX6BEwRNSCP84/afac9hd4MS+zEUA== } '@hookform/resolvers@3.7.0': - resolution: {integrity: sha512-42p5X18noBV3xqOpTlf2V5qJZwzNgO4eLzHzmKGh/w7z4+4XqRw5AsESVkqE+qwAuRRlg2QG12EVEjPkrRIbeg==} + resolution: + { integrity: sha512-42p5X18noBV3xqOpTlf2V5qJZwzNgO4eLzHzmKGh/w7z4+4XqRw5AsESVkqE+qwAuRRlg2QG12EVEjPkrRIbeg== } peerDependencies: react-hook-form: ^7.0.0 '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + resolution: + { integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg== } + engines: { node: '>=10.10.0' } deprecated: Use @eslint/config-array instead '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} + resolution: + { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } + engines: { node: '>=12.22' } '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + resolution: + { integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== } deprecated: Use @eslint/object-schema instead '@iconify/react@4.1.1': - resolution: {integrity: sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg==} + resolution: + { integrity: sha512-jed14EjvKjee8mc0eoscGxlg7mSQRkwQG3iX3cPBCO7UlOjz0DtlvTqxqEcHUJGh+z1VJ31Yhu5B9PxfO0zbdg== } peerDependencies: react: '>=16' '@iconify/tools@4.0.4': - resolution: {integrity: sha512-hX1Z3i1Tm6JxyrDv45jNEijPpepZZfal/4leFGtUC04H9LsgRo597BOBFB9PUZsQdFGLOxVUUfv6lqU/dC+xXw==} + resolution: + { integrity: sha512-hX1Z3i1Tm6JxyrDv45jNEijPpepZZfal/4leFGtUC04H9LsgRo597BOBFB9PUZsQdFGLOxVUUfv6lqU/dC+xXw== } '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + resolution: + { integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg== } '@iconify/utils@2.1.25': - resolution: {integrity: sha512-Y+iGko8uv/Fz5bQLLJyNSZGOdMW0G7cnlEX1CiNcKsRXX9cq/y/vwxrIAtLCZhKHr3m0VJmsjVPsvnM4uX8YLg==} + resolution: + { integrity: sha512-Y+iGko8uv/Fz5bQLLJyNSZGOdMW0G7cnlEX1CiNcKsRXX9cq/y/vwxrIAtLCZhKHr3m0VJmsjVPsvnM4uX8YLg== } '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== } + engines: { node: '>=12' } '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== } + engines: { node: '>=6.0.0' } '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== } + engines: { node: '>=6.0.0' } '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== } + engines: { node: '>=6.0.0' } '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + resolution: + { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== } '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + resolution: + { integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== } '@mui/base@5.0.0-beta.40': - resolution: {integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ== } + engines: { node: '>=12.0.0' } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -544,11 +628,13 @@ packages: optional: true '@mui/core-downloads-tracker@5.15.21': - resolution: {integrity: sha512-dp9lXBaJZzJYeJfQY3Ow4Rb49QaCEdkl2KKYscdQHQm6bMJ+l4XPY3Cd9PCeeJTsHPIDJ60lzXbeRgs6sx/rpw==} + resolution: + { integrity: sha512-dp9lXBaJZzJYeJfQY3Ow4Rb49QaCEdkl2KKYscdQHQm6bMJ+l4XPY3Cd9PCeeJTsHPIDJ60lzXbeRgs6sx/rpw== } '@mui/icons-material@5.15.21': - resolution: {integrity: sha512-yqkq1MbdkmX5ZHyvZTBuAaA6RkvoqkoAgwBSx9Oh0L0jAfj9T/Ih/NhMNjkl8PWVSonjfDUkKroBnjRyo/1M9Q==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-yqkq1MbdkmX5ZHyvZTBuAaA6RkvoqkoAgwBSx9Oh0L0jAfj9T/Ih/NhMNjkl8PWVSonjfDUkKroBnjRyo/1M9Q== } + engines: { node: '>=12.0.0' } peerDependencies: '@mui/material': ^5.0.0 '@types/react': ^17.0.0 || ^18.0.0 @@ -558,8 +644,9 @@ packages: optional: true '@mui/lab@5.0.0-alpha.170': - resolution: {integrity: sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-0bDVECGmrNjd3+bLdcLiwYZ0O4HP5j5WSQm5DV6iA/Z9kr8O6AnvZ1bv9ImQbbX7Gj3pX4o43EKwCutj3EQxQg== } + engines: { node: '>=12.0.0' } peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 @@ -576,8 +663,9 @@ packages: optional: true '@mui/material@5.15.21': - resolution: {integrity: sha512-nTyCcgduKwHqiuQ/B03EQUa+utSMzn2sQp0QAibsnYe4tvc3zkMbO0amKpl48vhABIY3IvT6w9615BFIgMt0YA==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-nTyCcgduKwHqiuQ/B03EQUa+utSMzn2sQp0QAibsnYe4tvc3zkMbO0amKpl48vhABIY3IvT6w9615BFIgMt0YA== } + engines: { node: '>=12.0.0' } peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 @@ -593,8 +681,9 @@ packages: optional: true '@mui/private-theming@5.15.20': - resolution: {integrity: sha512-BK8F94AIqSrnaPYXf2KAOjGZJgWfvqAVQ2gVR3EryvQFtuBnG6RwodxrCvd3B48VuMy6Wsk897+lQMUxJyk+6g==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-BK8F94AIqSrnaPYXf2KAOjGZJgWfvqAVQ2gVR3EryvQFtuBnG6RwodxrCvd3B48VuMy6Wsk897+lQMUxJyk+6g== } + engines: { node: '>=12.0.0' } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -603,8 +692,9 @@ packages: optional: true '@mui/styled-engine@5.15.14': - resolution: {integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw== } + engines: { node: '>=12.0.0' } peerDependencies: '@emotion/react': ^11.4.1 '@emotion/styled': ^11.3.0 @@ -616,8 +706,9 @@ packages: optional: true '@mui/system@5.15.20': - resolution: {integrity: sha512-LoMq4IlAAhxzL2VNUDBTQxAb4chnBe8JvRINVNDiMtHE2PiPOoHlhOPutSxEbaL5mkECPVWSv6p8JEV+uykwIA==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-LoMq4IlAAhxzL2VNUDBTQxAb4chnBe8JvRINVNDiMtHE2PiPOoHlhOPutSxEbaL5mkECPVWSv6p8JEV+uykwIA== } + engines: { node: '>=12.0.0' } peerDependencies: '@emotion/react': ^11.5.0 '@emotion/styled': ^11.3.0 @@ -632,7 +723,8 @@ packages: optional: true '@mui/types@7.2.14': - resolution: {integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==} + resolution: + { integrity: sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ== } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 peerDependenciesMeta: @@ -640,8 +732,9 @@ packages: optional: true '@mui/utils@5.15.20': - resolution: {integrity: sha512-mAbYx0sovrnpAu1zHc3MDIhPqL8RPVC5W5xcO1b7PiSCJPtckIZmBkp8hefamAvUiAV8gpfMOM6Zb+eSisbI2A==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-mAbYx0sovrnpAu1zHc3MDIhPqL8RPVC5W5xcO1b7PiSCJPtckIZmBkp8hefamAvUiAV8gpfMOM6Zb+eSisbI2A== } + engines: { node: '>=12.0.0' } peerDependencies: '@types/react': ^17.0.0 || ^18.0.0 react: ^17.0.0 || ^18.0.0 @@ -650,8 +743,9 @@ packages: optional: true '@mui/x-data-grid@6.20.3': - resolution: {integrity: sha512-VVggwKiEgMdkVqpORZEBgSqcpuBoVKMwYZnO+Q8vns2+otpiFE4yr52TZjKkF+ugDPgZ4rcq8mlj4VsK83XiMQ==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-VVggwKiEgMdkVqpORZEBgSqcpuBoVKMwYZnO+Q8vns2+otpiFE4yr52TZjKkF+ugDPgZ4rcq8mlj4VsK83XiMQ== } + engines: { node: '>=14.0.0' } peerDependencies: '@mui/material': ^5.4.1 '@mui/system': ^5.4.1 @@ -659,8 +753,9 @@ packages: react-dom: ^17.0.0 || ^18.0.0 '@mui/x-tree-view@6.17.0': - resolution: {integrity: sha512-09dc2D+Rjg2z8KOaxbUXyPi0aw7fm2jurEtV8Xw48xJ00joLWd5QJm1/v4CarEvaiyhTQzHImNqdgeJW8ZQB6g==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-09dc2D+Rjg2z8KOaxbUXyPi0aw7fm2jurEtV8Xw48xJ00joLWd5QJm1/v4CarEvaiyhTQzHImNqdgeJW8ZQB6g== } + engines: { node: '>=14.0.0' } peerDependencies: '@emotion/react': ^11.9.0 '@emotion/styled': ^11.8.1 @@ -670,147 +765,175 @@ packages: react-dom: ^17.0.0 || ^18.0.0 '@next/bundle-analyzer@14.2.4': - resolution: {integrity: sha512-ydSDikSgGhYmBlnvzS4tgdGyn40SCFI9uWDldbkRSwXS60tg4WBJR4qJoTSERTmdAFb1PeUYCyFdfC80i2WL1w==} + resolution: + { integrity: sha512-ydSDikSgGhYmBlnvzS4tgdGyn40SCFI9uWDldbkRSwXS60tg4WBJR4qJoTSERTmdAFb1PeUYCyFdfC80i2WL1w== } '@next/env@14.2.3': - resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + resolution: + { integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA== } '@next/eslint-plugin-next@14.0.3': - resolution: {integrity: sha512-j4K0n+DcmQYCVnSAM+UByTVfIHnYQy2ODozfQP+4RdwtRDfobrIvKq1K4Exb2koJ79HSSa7s6B2SA8T/1YR3RA==} + resolution: + { integrity: sha512-j4K0n+DcmQYCVnSAM+UByTVfIHnYQy2ODozfQP+4RdwtRDfobrIvKq1K4Exb2koJ79HSSa7s6B2SA8T/1YR3RA== } '@next/swc-darwin-arm64@14.2.3': - resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A== } + engines: { node: '>= 10' } cpu: [arm64] os: [darwin] '@next/swc-darwin-x64@14.2.3': - resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA== } + engines: { node: '>= 10' } cpu: [x64] os: [darwin] '@next/swc-linux-arm64-gnu@14.2.3': - resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA== } + engines: { node: '>= 10' } cpu: [arm64] os: [linux] '@next/swc-linux-arm64-musl@14.2.3': - resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw== } + engines: { node: '>= 10' } cpu: [arm64] os: [linux] '@next/swc-linux-x64-gnu@14.2.3': - resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w== } + engines: { node: '>= 10' } cpu: [x64] os: [linux] '@next/swc-linux-x64-musl@14.2.3': - resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ== } + engines: { node: '>= 10' } cpu: [x64] os: [linux] '@next/swc-win32-arm64-msvc@14.2.3': - resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A== } + engines: { node: '>= 10' } cpu: [arm64] os: [win32] '@next/swc-win32-ia32-msvc@14.2.3': - resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw== } + engines: { node: '>= 10' } cpu: [ia32] os: [win32] '@next/swc-win32-x64-msvc@14.2.3': - resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA== } + engines: { node: '>= 10' } cpu: [x64] os: [win32] '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } + engines: { node: '>= 8' } '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } + engines: { node: '>= 8' } '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } + engines: { node: '>= 8' } '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== } + engines: { node: '>=14' } '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + resolution: + { integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== } '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + resolution: + { integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== } '@rc-component/async-validator@5.0.4': - resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} - engines: {node: '>=14.x'} + resolution: + { integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg== } + engines: { node: '>=14.x' } '@rc-component/color-picker@1.5.3': - resolution: {integrity: sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw==} + resolution: + { integrity: sha512-+tGGH3nLmYXTalVe0L8hSZNs73VTP5ueSHwUlDC77KKRaN7G4DS4wcpG5DTDzdcV/Yas+rzA6UGgIyzd8fS4cw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' '@rc-component/context@1.4.0': - resolution: {integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w==} + resolution: + { integrity: sha512-kFcNxg9oLRMoL3qki0OMxK+7g5mypjgaaJp/pkOis/6rVxma9nJBF/8kCIuTYHUQNr0ii7MxqE33wirPZLJQ2w== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' '@rc-component/mini-decimal@1.1.0': - resolution: {integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ== } + engines: { node: '>=8.x' } '@rc-component/mutate-observer@1.1.0': - resolution: {integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-QjrOsDXQusNwGZPf4/qRQasg7UFEj06XiCJ8iuiq/Io7CrHrgVi6Uuetw60WAMG1799v+aM8kyc+1L/GBbHSlw== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' '@rc-component/portal@1.1.2': - resolution: {integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' '@rc-component/qrcode@1.0.0': - resolution: {integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-L+rZ4HXP2sJ1gHMGHjsg9jlYBX/SLN2D6OxP9Zn3qgtpMWtO2vUfxVFwiogHpAIqs54FnALxraUy/BCO1yRIgg== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' '@rc-component/tour@1.15.0': - resolution: {integrity: sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-h6hyILDwL+In9GAgRobwRWihLqqsD7Uft3fZGrJ7L4EiyCoxbnNYwzPXDfz7vNDhWeVyvAWQJj9fJCzpI4+b4g== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' '@rc-component/trigger@2.2.0': - resolution: {integrity: sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-QarBCji02YE9aRFhZgRZmOpXBj0IZutRippsVBv85sxvG4FGk/vRxwAlkn3MS9zK5mwbETd86mAVg2tKqTkdJA== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' '@reduxjs/toolkit@1.9.7': - resolution: {integrity: sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==} + resolution: + { integrity: sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ== } peerDependencies: react: ^16.9.0 || ^17.0.0 || ^18 react-redux: ^7.2.1 || ^8.0.2 @@ -821,63 +944,82 @@ packages: optional: true '@rushstack/eslint-patch@1.10.3': - resolution: {integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg==} + resolution: + { integrity: sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg== } '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + resolution: + { integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== } '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + resolution: + { integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A== } '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== } + engines: { node: '>=10.13.0' } '@types/hoist-non-react-statics@3.3.5': - resolution: {integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==} + resolution: + { integrity: sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg== } '@types/js-cookie@2.2.7': - resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==} + resolution: + { integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA== } '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + resolution: + { integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== } '@types/lodash-es@4.17.12': - resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + resolution: + { integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ== } '@types/lodash@4.17.6': - resolution: {integrity: sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==} + resolution: + { integrity: sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA== } '@types/node@20.14.9': - resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + resolution: + { integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg== } '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + resolution: + { integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== } '@types/prop-types@15.7.12': - resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + resolution: + { integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q== } '@types/qs@6.9.15': - resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + resolution: + { integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg== } '@types/react-transition-group@4.4.10': - resolution: {integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==} + resolution: + { integrity: sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q== } '@types/react@18.3.3': - resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} + resolution: + { integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw== } '@types/tar@6.1.13': - resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} + resolution: + { integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw== } '@types/use-sync-external-store@0.0.3': - resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==} + resolution: + { integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== } '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + resolution: + { integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== } '@typescript-eslint/parser@6.21.0': - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: eslint: ^7.0.0 || ^8.0.0 typescript: '*' @@ -886,16 +1028,19 @@ packages: optional: true '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== } + engines: { node: ^16.0.0 || >=18.0.0 } '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== } + engines: { node: ^16.0.0 || >=18.0.0 } '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== } + engines: { node: ^16.0.0 || >=18.0.0 } peerDependencies: typescript: '*' peerDependenciesMeta: @@ -903,335 +1048,425 @@ packages: optional: true '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} + resolution: + { integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== } + engines: { node: ^16.0.0 || >=18.0.0 } '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + resolution: + { integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== } '@xobotyi/scrollbar-width@1.9.5': - resolution: {integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ==} + resolution: + { integrity: sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ== } acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@8.3.3: - resolution: {integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw== } + engines: { node: '>=0.4.0' } acorn@8.12.0: - resolution: {integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw== } + engines: { node: '>=0.4.0' } hasBin: true ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } + engines: { node: '>=8' } ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== } + engines: { node: '>=12' } ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== } + engines: { node: '>=4' } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: '>=8' } ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } + engines: { node: '>=12' } antd@5.19.0: - resolution: {integrity: sha512-+w+3zJUKqwU1GSXUxnKhzSGuWUqwwpHQm/voJr2X0JBdYxr9gkLhKR0HBhQjVSSJzSb86rB48fUbByHKrN05Xg==} + resolution: + { integrity: sha512-+w+3zJUKqwU1GSXUxnKhzSGuWUqwwpHQm/voJr2X0JBdYxr9gkLhKR0HBhQjVSSJzSb86rB48fUbByHKrN05Xg== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + resolution: + { integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } + engines: { node: '>= 8' } arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + resolution: + { integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + resolution: + { integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== } array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== } + engines: { node: '>= 0.4' } array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== } + engines: { node: '>= 0.4' } array-tree-filter@2.1.0: - resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==} + resolution: + { integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw== } array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== } + engines: { node: '>=8' } array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ== } + engines: { node: '>= 0.4' } array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== } + engines: { node: '>= 0.4' } array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== } + engines: { node: '>= 0.4' } array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== } + engines: { node: '>= 0.4' } array.prototype.toreversed@1.1.2: - resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + resolution: + { integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== } array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA== } + engines: { node: '>= 0.4' } arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== } + engines: { node: '>= 0.4' } ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + resolution: + { integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ== } asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + resolution: + { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } autoprefixer@10.4.19: - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew== } + engines: { node: ^10 || ^12 || >=14 } hasBin: true peerDependencies: postcss: ^8.1.0 available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== } + engines: { node: '>= 0.4' } axe-core@4.9.1: - resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw== } + engines: { node: '>=4' } axios@1.7.2: - resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + resolution: + { integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== } axobject-query@3.1.1: - resolution: {integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==} + resolution: + { integrity: sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg== } babel-plugin-macros@3.1.0: - resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} - engines: {node: '>=10', npm: '>=6'} + resolution: + { integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== } + engines: { node: '>=10', npm: '>=6' } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== } + engines: { node: '>=8' } boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + resolution: + { integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== } brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + resolution: + { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== } + engines: { node: '>=8' } browserslist@4.23.1: - resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + resolution: + { integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw== } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + resolution: + { integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== } busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + resolution: + { integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== } + engines: { node: '>=10.16.0' } call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== } + engines: { node: '>= 0.4' } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } + engines: { node: '>=6' } camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== } + engines: { node: '>= 6' } caniuse-lite@1.0.30001639: - resolution: {integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==} + resolution: + { integrity: sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg== } chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== } + engines: { node: '>=4' } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } + engines: { node: '>=10' } cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + resolution: + { integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== } cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== } + engines: { node: '>= 6' } chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + resolution: + { integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== } + engines: { node: '>= 8.10.0' } chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== } + engines: { node: '>=10' } chroma-js@2.4.2: - resolution: {integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==} + resolution: + { integrity: sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A== } classnames@2.5.1: - resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + resolution: + { integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== } client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + resolution: + { integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== } clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== } + engines: { node: '>=6' } color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + resolution: + { integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } + engines: { node: '>=7.0.0' } color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + resolution: + { integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== } + engines: { node: '>= 0.8' } commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== } + engines: { node: '>= 6' } commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== } + engines: { node: '>= 10' } compute-scroll-into-view@3.1.0: - resolution: {integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg==} + resolution: + { integrity: sha512-rj8l8pD4bJ1nx+dAkMhV1xB5RuZEyVysfxJqB1pRchh1KVvwOv9b7CGB8ZfjTImVv2oF+sYMUkMZq6Na5Ftmbg== } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } confbox@0.1.7: - resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + resolution: + { integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA== } convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + resolution: + { integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== } copy-to-clipboard@3.3.3: - resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + resolution: + { integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== } cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== } + engines: { node: '>=10' } cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== } + engines: { node: '>= 8' } css-in-js-utils@3.1.0: - resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} + resolution: + { integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A== } css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + resolution: + { integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== } css-tree@1.1.3: - resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} - engines: {node: '>=8.0.0'} + resolution: + { integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== } + engines: { node: '>=8.0.0' } css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + resolution: + { integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0' } css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + resolution: + { integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== } + engines: { node: '>= 6' } cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== } + engines: { node: '>=4' } hasBin: true csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + resolution: + { integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0' } csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + resolution: + { integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== } damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + resolution: + { integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== } data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== } + engines: { node: '>= 0.4' } data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== } + engines: { node: '>= 0.4' } data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== } + engines: { node: '>= 0.4' } dayjs@1.11.11: - resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + resolution: + { integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg== } debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + resolution: + { integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== } debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + resolution: + { integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1239,8 +1474,9 @@ packages: optional: true debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== } + engines: { node: '>=6.0' } peerDependencies: supports-color: '*' peerDependenciesMeta: @@ -1248,148 +1484,188 @@ packages: optional: true deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA== } + engines: { node: '>= 0.4' } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== } + engines: { node: '>= 0.4' } define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== } + engines: { node: '>= 0.4' } delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== } + engines: { node: '>=0.4.0' } didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + resolution: + { integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== } dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== } + engines: { node: '>=8' } dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + resolution: + { integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== } doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== } + engines: { node: '>=0.10.0' } doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== } + engines: { node: '>=6.0.0' } dom-helpers@5.2.1: - resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + resolution: + { integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== } dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + resolution: + { integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== } domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + resolution: + { integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== } domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== } + engines: { node: '>= 4' } domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + resolution: + { integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== } duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + resolution: + { integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== } eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } electron-to-chromium@1.4.816: - resolution: {integrity: sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==} + resolution: + { integrity: sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw== } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + resolution: + { integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== } enhanced-resolve@5.17.0: - resolution: {integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA== } + engines: { node: '>=10.13.0' } entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + resolution: + { integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== } + engines: { node: '>=0.12' } env-cmd@10.1.0: - resolution: {integrity: sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==} - engines: {node: '>=8.0.0'} + resolution: + { integrity: sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA== } + engines: { node: '>=8.0.0' } hasBin: true error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== } error-stack-parser@2.1.4: - resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + resolution: + { integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== } es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== } + engines: { node: '>= 0.4' } es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== } + engines: { node: '>= 0.4' } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== } + engines: { node: '>= 0.4' } es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + resolution: + { integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== } es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw== } + engines: { node: '>= 0.4' } es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== } + engines: { node: '>= 0.4' } es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== } + engines: { node: '>= 0.4' } es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + resolution: + { integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== } es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== } + engines: { node: '>= 0.4' } esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== } + engines: { node: '>=12' } hasBin: true escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== } + engines: { node: '>=6' } escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== } + engines: { node: '>=0.8.0' } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } + engines: { node: '>=10' } eslint-config-next@14.0.3: - resolution: {integrity: sha512-IKPhpLdpSUyKofmsXUfrvBC49JMUTdeaD8ZIH4v9Vk0sC1X6URTuTJCLtA0Vwuj7V/CQh0oISuSTvNn5//Buew==} + resolution: + { integrity: sha512-IKPhpLdpSUyKofmsXUfrvBC49JMUTdeaD8ZIH4v9Vk0sC1X6URTuTJCLtA0Vwuj7V/CQh0oISuSTvNn5//Buew== } peerDependencies: eslint: ^7.23.0 || ^8.0.0 typescript: '>=3.3.1' @@ -1398,24 +1674,28 @@ packages: optional: true eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + resolution: + { integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== } hasBin: true peerDependencies: eslint: '>=7.0.0' eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + resolution: + { integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== } eslint-import-resolver-typescript@3.6.1: - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} + resolution: + { integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg== } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: eslint: '*' eslint-plugin-import: '*' eslint-module-utils@2.8.1: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q== } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -1435,8 +1715,9 @@ packages: optional: true eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== } + engines: { node: '>=4' } peerDependencies: '@typescript-eslint/parser': '*' eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 @@ -1445,118 +1726,147 @@ packages: optional: true eslint-plugin-jsx-a11y@6.9.0: - resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g== } + engines: { node: '>=4.0' } peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== } + engines: { node: '>=10' } peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 eslint-plugin-react@7.34.3: - resolution: {integrity: sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA== } + engines: { node: '>=4' } peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } hasBin: true espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== } + engines: { node: '>=0.10' } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } + engines: { node: '>=4.0' } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } + engines: { node: '>=4.0' } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } + engines: { node: '>=0.10.0' } execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== } + engines: { node: '>=10' } extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} + resolution: + { integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== } + engines: { node: '>= 10.17.0' } hasBin: true fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + resolution: + { integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== } + engines: { node: '>=8.6.0' } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } fast-loops@1.1.3: - resolution: {integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==} + resolution: + { integrity: sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g== } fast-shallow-equal@1.0.0: - resolution: {integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw==} + resolution: + { integrity: sha512-HPtaa38cPgWvaCFmRNhlc6NG7pv6NUHqjPgVAkWGoB9mQMwYB27/K0CvOM5Czy+qpT3e8XJ6Q4aPAnzpNpzNaw== } fastest-stable-stringify@2.0.2: - resolution: {integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q==} + resolution: + { integrity: sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q== } fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + resolution: + { integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== } fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + resolution: + { integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== } file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + resolution: + { integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== } + engines: { node: ^10.12.0 || >=12.0.0 } fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== } + engines: { node: '>=8' } find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + resolution: + { integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } + engines: { node: '>=10' } flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + resolution: + { integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== } + engines: { node: ^10.12.0 || >=12.0.0 } flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + resolution: + { integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== } follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== } + engines: { node: '>=4.0' } peerDependencies: debug: '*' peerDependenciesMeta: @@ -1564,523 +1874,663 @@ packages: optional: true for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + resolution: + { integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== } foreground-child@3.2.1: - resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== } + engines: { node: '>=14' } form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== } + engines: { node: '>= 6' } fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + resolution: + { integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== } fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== } + engines: { node: '>= 8' } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== } function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== } + engines: { node: '>= 0.4' } functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== } get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== } + engines: { node: '>= 0.4' } get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== } + engines: { node: '>=8' } get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== } + engines: { node: '>=10' } get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== } + engines: { node: '>= 0.4' } get-tsconfig@4.7.5: - resolution: {integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==} + resolution: + { integrity: sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } + engines: { node: '>= 6' } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } + engines: { node: '>=10.13.0' } glob@10.4.2: - resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} - engines: {node: '>=16 || 14 >=14.18'} + resolution: + { integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w== } + engines: { node: '>=16 || 14 >=14.18' } hasBin: true glob@7.1.7: - resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==} + resolution: + { integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== } deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== } deprecated: Glob versions prior to v9 are no longer supported globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== } + engines: { node: '>=4' } globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== } + engines: { node: '>=8' } globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== } + engines: { node: '>= 0.4' } globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== } + engines: { node: '>=10' } goober@2.1.14: - resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} + resolution: + { integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg== } peerDependencies: csstype: ^3.0.10 gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + resolution: + { integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + resolution: + { integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== } gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== } + engines: { node: '>=10' } has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + resolution: + { integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== } has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== } + engines: { node: '>=4' } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: '>=8' } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== } has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== } + engines: { node: '>= 0.4' } has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== } + engines: { node: '>= 0.4' } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== } + engines: { node: '>= 0.4' } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== } + engines: { node: '>= 0.4' } hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + resolution: + { integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== } html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + resolution: + { integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== } htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + resolution: + { integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== } human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + resolution: + { integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== } + engines: { node: '>=10.17.0' } hyphenate-style-name@1.1.0: - resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} + resolution: + { integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw== } ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== } + engines: { node: '>= 4' } immer@9.0.21: - resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==} + resolution: + { integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== } import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } + engines: { node: '>=6' } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } + engines: { node: '>=0.8.19' } inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } inline-style-prefixer@7.0.0: - resolution: {integrity: sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ==} + resolution: + { integrity: sha512-I7GEdScunP1dQ6IM2mQWh6v0mOYdYmH3Bp31UecKdrcUgcURTcctSe1IECdUznSHKSmsHtjrT3CwCPI1pyxfUQ== } internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== } + engines: { node: '>= 0.4' } is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== } + engines: { node: '>= 0.4' } is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== } + engines: { node: '>= 0.4' } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== } + engines: { node: '>= 0.4' } is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + resolution: + { integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== } is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== } + engines: { node: '>=8' } is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== } + engines: { node: '>= 0.4' } is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== } + engines: { node: '>= 0.4' } is-core-module@2.14.0: - resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== } + engines: { node: '>= 0.4' } is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== } + engines: { node: '>= 0.4' } is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== } + engines: { node: '>= 0.4' } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } + engines: { node: '>=0.10.0' } is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + resolution: + { integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } + engines: { node: '>=8' } is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== } + engines: { node: '>= 0.4' } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } + engines: { node: '>=0.10.0' } is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== } + engines: { node: '>= 0.4' } is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== } + engines: { node: '>= 0.4' } is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== } + engines: { node: '>= 0.4' } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: '>=0.12.0' } is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== } + engines: { node: '>=8' } is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== } + engines: { node: '>=0.10.0' } is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== } + engines: { node: '>= 0.4' } is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== } + engines: { node: '>= 0.4' } is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== } + engines: { node: '>= 0.4' } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== } + engines: { node: '>=8' } is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== } + engines: { node: '>= 0.4' } is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== } + engines: { node: '>= 0.4' } is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== } + engines: { node: '>= 0.4' } is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== } + engines: { node: '>= 0.4' } is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + resolution: + { integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== } is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ== } + engines: { node: '>= 0.4' } isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + resolution: + { integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + resolution: + { integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== } jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw== } + engines: { node: '>=14' } jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + resolution: + { integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w== } hasBin: true js-cookie@2.2.1: - resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==} + resolution: + { integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ== } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } hasBin: true jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== } + engines: { node: '>=4' } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } json2mq@0.2.0: - resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==} + resolution: + { integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA== } json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + resolution: + { integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== } hasBin: true jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== } + engines: { node: '>=4.0' } keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + resolution: + { integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== } kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + resolution: + { integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ== } language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} + resolution: + { integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ== } language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA== } + engines: { node: '>=0.10' } levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } + engines: { node: '>= 0.8.0' } lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== } + engines: { node: '>=10' } lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== } + engines: { node: '>=14' } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } local-pkg@0.5.0: - resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg== } + engines: { node: '>=14' } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } + engines: { node: '>=10' } lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + resolution: + { integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + resolution: + { integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== } hasBin: true lru-cache@10.3.0: - resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} - engines: {node: 14 || >=16.14} + resolution: + { integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ== } + engines: { node: 14 || >=16.14 } mdn-data@2.0.14: - resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + resolution: + { integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== } mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + resolution: + { integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== } mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + resolution: + { integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } + engines: { node: '>= 8' } micromatch@4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== } + engines: { node: '>=8.6' } mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== } + engines: { node: '>= 0.6' } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== } + engines: { node: '>= 0.6' } mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== } + engines: { node: '>=6' } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== } + engines: { node: '>=16 || 14 >=14.17' } minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } + engines: { node: '>=16 || 14 >=14.17' } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== } + engines: { node: '>=8' } minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== } + engines: { node: '>=8' } minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== } + engines: { node: '>=8' } minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== } + engines: { node: '>=16 || 14 >=14.17' } minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== } + engines: { node: '>= 8' } mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== } + engines: { node: '>=10' } hasBin: true mlly@1.7.1: - resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + resolution: + { integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA== } mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== } + engines: { node: '>=10' } ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + resolution: + { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + resolution: + { integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== } nano-css@5.6.1: - resolution: {integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw==} + resolution: + { integrity: sha512-T2Mhc//CepkTa3X4pUhKgbEheJHYAxD0VptuqFhDbGMUWVV2m+lkNiW/Ieuj35wrfC8Zm0l7HvssQh7zcEttSw== } peerDependencies: react: '*' react-dom: '*' nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + resolution: + { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } next@14.2.3: - resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} - engines: {node: '>=18.17.0'} + resolution: + { integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A== } + engines: { node: '>=18.17.0' } hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 @@ -2097,176 +2547,221 @@ packages: optional: true node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + resolution: + { integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw== } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } + engines: { node: '>=0.10.0' } normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== } + engines: { node: '>=0.10.0' } npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== } + engines: { node: '>=8' } nprogress@0.2.0: - resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + resolution: + { integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== } nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + resolution: + { integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== } object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== } + engines: { node: '>=0.10.0' } object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== } + engines: { node: '>= 6' } object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g== } + engines: { node: '>= 0.4' } object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== } + engines: { node: '>= 0.4' } object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== } + engines: { node: '>= 0.4' } object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== } + engines: { node: '>= 0.4' } object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ== } + engines: { node: '>= 0.4' } object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== } + engines: { node: '>= 0.4' } object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== } + engines: { node: '>= 0.4' } object.hasown@1.1.4: - resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg== } + engines: { node: '>= 0.4' } object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== } + engines: { node: '>= 0.4' } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } + engines: { node: '>=6' } opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + resolution: + { integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== } hasBin: true optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== } + engines: { node: '>= 0.8.0' } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } + engines: { node: '>=10' } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } + engines: { node: '>=10' } package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + resolution: + { integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } + engines: { node: '>=6' } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== } + engines: { node: '>=8' } parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + resolution: + { integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== } parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + resolution: + { integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } + engines: { node: '>=8' } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== } + engines: { node: '>=0.10.0' } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: '>=8' } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + resolution: + { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== } path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + resolution: + { integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== } + engines: { node: '>=16 || 14 >=14.18' } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } + engines: { node: '>=8' } pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + resolution: + { integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== } pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + resolution: + { integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== } picocolors@1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + resolution: + { integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } + engines: { node: '>=8.6' } pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== } + engines: { node: '>=0.10.0' } pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== } + engines: { node: '>= 6' } pkg-types@1.1.3: - resolution: {integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==} + resolution: + { integrity: sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA== } possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== } + engines: { node: '>= 0.4' } postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== } + engines: { node: '>=14.0.0' } peerDependencies: postcss: ^8.0.0 postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} + resolution: + { integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== } + engines: { node: ^12 || ^14 || >= 16 } peerDependencies: postcss: ^8.4.21 postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== } + engines: { node: '>= 14' } peerDependencies: postcss: '>=8.0.9' ts-node: '>=9.0.0' @@ -2277,159 +2772,190 @@ packages: optional: true postcss-nested@6.0.1: - resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} - engines: {node: '>=12.0'} + resolution: + { integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== } + engines: { node: '>=12.0' } peerDependencies: postcss: ^8.2.14 postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ== } + engines: { node: '>=4' } postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + resolution: + { integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== } postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== } + engines: { node: ^10 || ^12 || >=14 } postcss@8.4.39: - resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw== } + engines: { node: ^10 || ^12 || >=14 } prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } + engines: { node: '>= 0.8.0' } prettier@3.3.2: - resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA== } + engines: { node: '>=14' } hasBin: true prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + resolution: + { integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== } property-expr@2.0.6: - resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==} + resolution: + { integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA== } proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + resolution: + { integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== } pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + resolution: + { integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } + engines: { node: '>=6' } qs@6.12.2: - resolution: {integrity: sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg==} - engines: {node: '>=0.6'} + resolution: + { integrity: sha512-x+NLUpx9SYrcwXtX7ob1gnkSems4i/mGZX5SlYxwIau6RrUSODO89TR/XDGGpn5RPWSYIB+aSfuSlV5+CmbTBg== } + engines: { node: '>=0.6' } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } rc-cascader@3.27.0: - resolution: {integrity: sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg==} + resolution: + { integrity: sha512-z5uq8VvQadFUBiuZJ7YF5UAUGNkZtdEtcEYiIA94N/Kc2MIKr6lEbN5HyVddvYSgwWlKqnL6pH5bFXFuIK3MNg== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-checkbox@3.3.0: - resolution: {integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw==} + resolution: + { integrity: sha512-Ih3ZaAcoAiFKJjifzwsGiT/f/quIkxJoklW4yKGho14Olulwn8gN7hOBve0/WGDg5o/l/5mL0w7ff7/YGvefVw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-collapse@3.7.3: - resolution: {integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw==} + resolution: + { integrity: sha512-60FJcdTRn0X5sELF18TANwtVi7FtModq649H11mYF1jh83DniMoM4MqY627sEKRCTm4+WXfGDcB7hY5oW6xhyw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-dialog@9.5.2: - resolution: {integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw==} + resolution: + { integrity: sha512-qVUjc8JukG+j/pNaHVSRa2GO2/KbV2thm7yO4hepQ902eGdYK913sGkwg/fh9yhKYV1ql3BKIN2xnud3rEXAPw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-drawer@7.2.0: - resolution: {integrity: sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg==} + resolution: + { integrity: sha512-9lOQ7kBekEJRdEpScHvtmEtXnAsy+NGDXiRWc2ZVC7QXAazNVbeT4EraQKYwCME8BJLa8Bxqxvs5swwyOepRwg== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-dropdown@4.2.0: - resolution: {integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng==} + resolution: + { integrity: sha512-odM8Ove+gSh0zU27DUj5cG1gNKg7mLWBYzB5E4nNLrLwBmYEgYP43vHKDGOVZcJSVElQBI0+jTQgjnq0NfLjng== } peerDependencies: react: '>=16.11.0' react-dom: '>=16.11.0' rc-field-form@2.2.1: - resolution: {integrity: sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-uoNqDoR7A4tn4QTSqoWPAzrR7ZwOK5I+vuZ/qdcHtbKx+ZjEsTg7QXm2wk/jalDiSksAQmATxL0T5LJkRREdIA== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-image@7.9.0: - resolution: {integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g==} + resolution: + { integrity: sha512-l4zqO5E0quuLMCtdKfBgj4Suv8tIS011F5k1zBBlK25iMjjiNHxA0VeTzGFtUZERSA45gvpXDg8/P6qNLjR25g== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-input-number@9.1.0: - resolution: {integrity: sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA==} + resolution: + { integrity: sha512-NqJ6i25Xn/AgYfVxynlevIhX3FuKlMwIFpucGG1h98SlK32wQwDK0zhN9VY32McOmuaqzftduNYWWooWz8pXQA== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-input@1.5.1: - resolution: {integrity: sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g==} + resolution: + { integrity: sha512-+nOzQJDeIfIpNP/SgY45LXSKbuMlp4Yap2y8c+ZpU7XbLmNzUd6+d5/S75sA/52jsVE6S/AkhkkDEAOjIu7i6g== } peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' rc-mentions@2.14.0: - resolution: {integrity: sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A==} + resolution: + { integrity: sha512-qKR59FMuF8PK4ZqsbWX3UuA5P1M/snzyqV6Yt3y1DCFbCEdqUGIBgQp6vEfLCO6Z0RoRFlzXtCeSlBTcDDpg1A== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-menu@9.14.1: - resolution: {integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ==} + resolution: + { integrity: sha512-5wlRb3M8S4yGlWhSoEYJ7ZVRElyScdcpUHxgiLxkeig1tEdyKrnED3B2fhpN0Rrpdp9jyhnmZR/Lwq2fH5VvDQ== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-motion@2.9.2: - resolution: {integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw==} + resolution: + { integrity: sha512-fUAhHKLDdkAXIDLH0GYwof3raS58dtNUmzLF2MeiR8o6n4thNpSDQhOqQzWE4WfFZDCi9VEN8n7tiB7czREcyw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-notification@5.6.0: - resolution: {integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-TGQW5T7waOxLwgJG7fXcw8l7AQiFOjaZ7ISF5PrU526nunHRNcTMuzKihQHaF4E/h/KfOCDk3Mv8eqzbu2e28w== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-overflow@1.3.2: - resolution: {integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==} + resolution: + { integrity: sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-pagination@4.2.0: - resolution: {integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw==} + resolution: + { integrity: sha512-V6qeANJsT6tmOcZ4XiUmj8JXjRLbkusuufpuoBw2GiAn94fIixYjFLmbruD1Sbhn8fPLDnWawPp4CN37zQorvw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-picker@4.6.6: - resolution: {integrity: sha512-sEWARCNlodubP7/IM6nXHDDIuKZ3gYd5CpS2cYcNORa2telX3nAfllqnGSGjGEFvdtyW+IqGAVatLOmFT0lKYg==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-sEWARCNlodubP7/IM6nXHDDIuKZ3gYd5CpS2cYcNORa2telX3nAfllqnGSGjGEFvdtyW+IqGAVatLOmFT0lKYg== } + engines: { node: '>=8.x' } peerDependencies: date-fns: '>= 2.x' dayjs: '>= 1.x' @@ -2448,141 +2974,164 @@ packages: optional: true rc-progress@4.0.0: - resolution: {integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw==} + resolution: + { integrity: sha512-oofVMMafOCokIUIBnZLNcOZFsABaUw8PPrf1/y0ZBvKZNpOiu5h4AO9vv11Sw0p4Hb3D0yGWuEattcQGtNJ/aw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-rate@2.13.0: - resolution: {integrity: sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-oxvx1Q5k5wD30sjN5tqAyWTvJfLNNJn7Oq3IeS4HxWfAiC4BOXMITNAsw7u/fzdtO4MS8Ki8uRLOzcnEuoQiAw== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-resize-observer@1.4.0: - resolution: {integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==} + resolution: + { integrity: sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-segmented@2.3.0: - resolution: {integrity: sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg==} + resolution: + { integrity: sha512-I3FtM5Smua/ESXutFfb8gJ8ZPcvFR+qUgeeGFQHBOvRiRKyAk4aBE5nfqrxXx+h8/vn60DQjOt6i4RNtrbOobg== } peerDependencies: react: '>=16.0.0' react-dom: '>=16.0.0' rc-select@14.15.0: - resolution: {integrity: sha512-BDqnDLhhm/8VyyyDlX7ju06S75k6ObJvbsN86zqZ4SY1Fu2ANQxeSWPo7pnwx5nwA5JgG+HcQevtddAgsdeBVQ==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-BDqnDLhhm/8VyyyDlX7ju06S75k6ObJvbsN86zqZ4SY1Fu2ANQxeSWPo7pnwx5nwA5JgG+HcQevtddAgsdeBVQ== } + engines: { node: '>=8.x' } peerDependencies: react: '*' react-dom: '*' rc-slider@10.6.2: - resolution: {integrity: sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-FjkoFjyvUQWcBo1F3RgSglky3ar0+qHLM41PlFVYB4Bj3RD8E/Mv7kqMouLFBU+3aFglMzzctAIWRwajEuueSw== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-steps@6.0.1: - resolution: {integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-lKHL+Sny0SeHkQKKDJlAjV5oZ8DwCdS2hFhAkIjuQt1/pB81M0cA0ErVFdHq9+jmPmFw1vJB2F5NBzFXLJxV+g== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-switch@4.1.0: - resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==} + resolution: + { integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-table@7.45.7: - resolution: {integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-wi9LetBL1t1csxyGkMB2p3mCiMt+NDexMlPbXHvQFmBBAsMxrgNSAPwUci2zDLUq9m8QdWc1Nh8suvrpy9mXrg== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-tabs@15.1.1: - resolution: {integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-Tc7bJvpEdkWIVCUL7yQrMNBJY3j44NcyWS48jF/UKMXuUlzaXK+Z/pEL5LjGcTadtPvVmNqA40yv7hmr+tCOAw== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-textarea@1.7.0: - resolution: {integrity: sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg==} + resolution: + { integrity: sha512-UxizYJkWkmxP3zofXgc487QiGyDmhhheDLLjIWbFtDmiru1ls30KpO8odDaPyqNUIy9ugj5djxTEuezIn6t3Jg== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-tooltip@6.2.0: - resolution: {integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw==} + resolution: + { integrity: sha512-iS/3iOAvtDh9GIx1ulY7EFUXUtktFccNLsARo3NPgLf0QW9oT0w3dA9cYWlhqAKmD+uriEwdWz1kH0Qs4zk2Aw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-tree-select@5.22.1: - resolution: {integrity: sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg==} + resolution: + { integrity: sha512-b8mAK52xEpRgS+b2PTapCt29GoIrO5cO8jB7AfHttFsIJfcnynY9FCtnYzURsKXJkGHbFY6UzSEB2I3TETtdWg== } peerDependencies: react: '*' react-dom: '*' rc-tree@5.8.8: - resolution: {integrity: sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag==} - engines: {node: '>=10.x'} + resolution: + { integrity: sha512-S+mCMWo91m5AJqjz3PdzKilGgbFm7fFJRFiTDOcoRbD7UfMOPnerXwMworiga0O2XIo383UoWuEfeHs1WOltag== } + engines: { node: '>=10.x' } peerDependencies: react: '*' react-dom: '*' rc-upload@4.5.2: - resolution: {integrity: sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA==} + resolution: + { integrity: sha512-QO3ne77DwnAPKFn0bA5qJM81QBjQi0e0NHdkvpFyY73Bea2NfITiotqJqVjHgeYPOJu5lLVR32TNGP084aSoXA== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-util@5.43.0: - resolution: {integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw==} + resolution: + { integrity: sha512-AzC7KKOXFqAdIBqdGWepL9Xn7cm3vnAmjlHqUnoQaTMZYhM4VlXGLkkHHxj/BZ7Td0+SOPKB4RGPboBVKT9htw== } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' rc-virtual-list@3.14.5: - resolution: {integrity: sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg==} - engines: {node: '>=8.x'} + resolution: + { integrity: sha512-ZMOnkCLv2wUN8Jz7yI4XiSLa9THlYvf00LuMhb1JlsQCewuU7ydPuHw1rGVPhe9VZYl/5UqODtNd7QKJ2DMGfg== } + engines: { node: '>=8.x' } peerDependencies: react: '>=16.9.0' react-dom: '>=16.9.0' react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + resolution: + { integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== } peerDependencies: react: ^18.3.1 react-hook-form@7.52.1: - resolution: {integrity: sha512-uNKIhaoICJ5KQALYZ4TOaOLElyM+xipord+Ha3crEFhTntdLvWZqVY49Wqd/0GiVCA/f9NjemLeiNPjG7Hpurg==} - engines: {node: '>=12.22.0'} + resolution: + { integrity: sha512-uNKIhaoICJ5KQALYZ4TOaOLElyM+xipord+Ha3crEFhTntdLvWZqVY49Wqd/0GiVCA/f9NjemLeiNPjG7Hpurg== } + engines: { node: '>=12.22.0' } peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 react-hot-toast@2.4.1: - resolution: {integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-j8z+cQbWIM5LY37pR6uZR6D4LfseplqnuAO4co4u8917hBUvXlEqyP1ZzqVLcqoyUesZZv/ImreoCeHVDpE5pQ== } + engines: { node: '>=10' } peerDependencies: react: '>=16' react-dom: '>=16' react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + resolution: + { integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== } react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + resolution: + { integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== } react-redux@8.1.3: - resolution: {integrity: sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==} + resolution: + { integrity: sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw== } peerDependencies: '@types/react': ^16.8 || ^17.0 || ^18.0 '@types/react-dom': ^16.8 || ^17.0 || ^18.0 @@ -2603,243 +3152,305 @@ packages: optional: true react-transition-group@4.4.5: - resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + resolution: + { integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== } peerDependencies: react: '>=16.6.0' react-dom: '>=16.6.0' react-universal-interface@0.6.2: - resolution: {integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw==} + resolution: + { integrity: sha512-dg8yXdcQmvgR13RIlZbTRQOoUrDciFVoSBZILwjE2LFISxZZ8loVJKAkuzswl5js8BHda79bIb2b84ehU8IjXw== } peerDependencies: react: '*' tslib: '*' react-use@17.5.0: - resolution: {integrity: sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg==} + resolution: + { integrity: sha512-PbfwSPMwp/hoL847rLnm/qkjg3sTRCvn6YhUZiHaUa3FA6/aNoFX79ul5Xt70O1rK+9GxSVqkY0eTwMdsR/bWg== } peerDependencies: react: '*' react-dom: '*' react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== } + engines: { node: '>=0.10.0' } read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + resolution: + { integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== } readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== } + engines: { node: '>=8.10.0' } redux-thunk@2.4.2: - resolution: {integrity: sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==} + resolution: + { integrity: sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== } peerDependencies: redux: ^4 redux@4.2.1: - resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==} + resolution: + { integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== } reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg== } + engines: { node: '>= 0.4' } regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + resolution: + { integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== } regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== } + engines: { node: '>= 0.4' } reselect@4.1.8: - resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + resolution: + { integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== } resize-observer-polyfill@1.5.1: - resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==} + resolution: + { integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } + engines: { node: '>=4' } resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolution: + { integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== } resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolution: + { integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== } hasBin: true resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + resolution: + { integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== } hasBin: true reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== } + engines: { iojs: '>=1.0.0', node: '>=0.10.0' } rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + resolution: + { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== } deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rtl-css-js@1.16.1: - resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + resolution: + { integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg== } run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + resolution: + { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} + resolution: + { integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== } + engines: { node: '>=0.4' } safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== } + engines: { node: '>= 0.4' } scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + resolution: + { integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== } screenfull@5.2.0: - resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA== } + engines: { node: '>=0.10.0' } scroll-into-view-if-needed@3.1.0: - resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==} + resolution: + { integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ== } semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } hasBin: true semver@7.6.2: - resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== } + engines: { node: '>=10' } hasBin: true set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== } + engines: { node: '>= 0.4' } set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== } + engines: { node: '>= 0.4' } set-harmonic-interval@1.0.1: - resolution: {integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g==} - engines: {node: '>=6.9'} + resolution: + { integrity: sha512-AhICkFV84tBP1aWqPwLZqFvAwqEoVA9kxNMniGEUvzOlm4vLmOFLiTT3UZ6bziJTy4bOVpzWGTfSCbmaayGx8g== } + engines: { node: '>=6.9' } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } + engines: { node: '>=8' } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } + engines: { node: '>=8' } side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== } + engines: { node: '>= 0.4' } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== } + engines: { node: '>=14' } sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ== } + engines: { node: '>= 10' } slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } + engines: { node: '>=8' } source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== } + engines: { node: '>=0.10.0' } source-map@0.5.6: - resolution: {integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA== } + engines: { node: '>=0.10.0' } source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== } + engines: { node: '>=0.10.0' } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== } + engines: { node: '>=0.10.0' } stack-generator@2.0.10: - resolution: {integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==} + resolution: + { integrity: sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ== } stackframe@1.3.4: - resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + resolution: + { integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== } stacktrace-gps@3.1.2: - resolution: {integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==} + resolution: + { integrity: sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ== } stacktrace-js@2.0.2: - resolution: {integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==} + resolution: + { integrity: sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg== } stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== } + engines: { node: '>= 0.4' } streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + resolution: + { integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== } + engines: { node: '>=10.0.0' } string-convert@0.2.1: - resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} + resolution: + { integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A== } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } + engines: { node: '>=8' } string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } + engines: { node: '>=12' } string.prototype.includes@2.0.0: - resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} + resolution: + { integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg== } string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg== } + engines: { node: '>= 0.4' } string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== } + engines: { node: '>= 0.4' } string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + resolution: + { integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== } string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== } + engines: { node: '>= 0.4' } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } + engines: { node: '>=8' } strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== } + engines: { node: '>=12' } strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } + engines: { node: '>=4' } strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== } + engines: { node: '>=6' } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } + engines: { node: '>=8' } styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw== } + engines: { node: '>= 12.0.0' } peerDependencies: '@babel/core': '*' babel-plugin-macros: '*' @@ -2851,210 +3462,263 @@ packages: optional: true stylis@4.2.0: - resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + resolution: + { integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== } stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} + resolution: + { integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg== } sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== } + engines: { node: '>=16 || 14 >=14.17' } hasBin: true supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== } + engines: { node: '>=4' } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } + engines: { node: '>=8' } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } + engines: { node: '>= 0.4' } svgo@3.3.2: - resolution: {integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== } + engines: { node: '>=14.0.0' } hasBin: true tailwindcss@3.4.4: - resolution: {integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A==} - engines: {node: '>=14.0.0'} + resolution: + { integrity: sha512-ZoyXOdJjISB7/BcLTR6SEsLgKtDStYyYZVLsUtWChO4Ps20CBad7lfJKVDiejocV4ME1hLmyY0WJE3hSDcmQ2A== } + engines: { node: '>=14.0.0' } hasBin: true tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== } + engines: { node: '>=6' } tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== } + engines: { node: '>=10' } text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + resolution: + { integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== } thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} + resolution: + { integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== } + engines: { node: '>=0.8' } thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + resolution: + { integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== } throttle-debounce@3.0.1: - resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg== } + engines: { node: '>=10' } throttle-debounce@5.0.2: - resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} - engines: {node: '>=12.22'} + resolution: + { integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A== } + engines: { node: '>=12.22' } tiny-case@1.0.3: - resolution: {integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==} + resolution: + { integrity: sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q== } to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== } + engines: { node: '>=4' } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } + engines: { node: '>=8.0' } toggle-selection@1.0.6: - resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + resolution: + { integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== } toposort@2.0.2: - resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==} + resolution: + { integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== } totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== } + engines: { node: '>=6' } ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== } + engines: { node: '>=16' } peerDependencies: typescript: '>=4.2.0' ts-easing@0.2.0: - resolution: {integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==} + resolution: + { integrity: sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ== } ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + resolution: + { integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== } tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + resolution: + { integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== } tslib@2.6.3: - resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} + resolution: + { integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== } tsx@4.16.0: - resolution: {integrity: sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ==} - engines: {node: '>=18.0.0'} + resolution: + { integrity: sha512-MPgN+CuY+4iKxGoJNPv+1pyo5YWZAQ5XfsyobUG+zoKG7IkvCPLZDEyoIb8yLS2FcWci1nlxAqmvPlFWD5AFiQ== } + engines: { node: '>=18.0.0' } hasBin: true type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } + engines: { node: '>= 0.8.0' } type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== } + engines: { node: '>=10' } type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + resolution: + { integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== } + engines: { node: '>=12.20' } typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== } + engines: { node: '>= 0.4' } typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== } + engines: { node: '>= 0.4' } typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== } + engines: { node: '>= 0.4' } typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== } + engines: { node: '>= 0.4' } typescript@5.5.3: - resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} - engines: {node: '>=14.17'} + resolution: + { integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== } + engines: { node: '>=14.17' } hasBin: true ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + resolution: + { integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw== } unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + resolution: + { integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== } undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + resolution: + { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== } update-browserslist-db@1.1.0: - resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} + resolution: + { integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ== } hasBin: true peerDependencies: browserslist: '>= 4.21.0' uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } use-sync-external-store@1.2.2: - resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + resolution: + { integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw== } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } webpack-bundle-analyzer@4.10.1: - resolution: {integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ==} - engines: {node: '>= 10.13.0'} + resolution: + { integrity: sha512-s3P7pgexgT/HTUSYgxJyn28A+99mmLq4HsJepMPzu0R8ImJc52QNqaFYW1Z2z2uIb1/J3eYgaAWVpaC+v/1aAQ== } + engines: { node: '>= 10.13.0' } hasBin: true which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + resolution: + { integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== } which-builtin-type@1.1.3: - resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== } + engines: { node: '>= 0.4' } which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== } + engines: { node: '>= 0.4' } which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== } + engines: { node: '>= 0.4' } which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: '>= 8' } hasBin: true word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== } + engines: { node: '>=0.10.0' } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } + engines: { node: '>=10' } wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } + engines: { node: '>=12' } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} + resolution: + { integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== } + engines: { node: '>=8.3.0' } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -3065,29 +3729,34 @@ packages: optional: true yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + resolution: + { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== } + engines: { node: '>= 6' } yaml@2.4.5: - resolution: {integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== } + engines: { node: '>= 14' } hasBin: true yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + resolution: + { integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } + engines: { node: '>=10' } yup@1.4.0: - resolution: {integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==} + resolution: + { integrity: sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg== } snapshots: - '@alloc/quick-lru@5.2.0': {} '@ant-design/colors@7.1.0': diff --git a/web/postcss.config.js b/web/postcss.config.js index 2a0e03a816c..7102bc44b87 100644 --- a/web/postcss.config.js +++ b/web/postcss.config.js @@ -20,6 +20,6 @@ module.exports = { plugins: { tailwindcss: {}, - autoprefixer: {} - } + autoprefixer: {}, + }, } diff --git a/web/src/app/layout.js b/web/src/app/layout.js index 70027d0b75c..4f8b8c2510e 100644 --- a/web/src/app/layout.js +++ b/web/src/app/layout.js @@ -30,8 +30,8 @@ export const metadata = { title: 'Gravitino', description: 'A high-performance, geo-distributed and federated metadata lake.', icons: { - icon: process.env.NEXT_PUBLIC_BASE_PATH + '/icons/gravitino.svg' - } + icon: process.env.NEXT_PUBLIC_BASE_PATH + '/icons/gravitino.svg', + }, } const RootLayout = ({ children }) => { diff --git a/web/src/app/login/page.js b/web/src/app/login/page.js index cc7e225e18b..f0390d4c9bf 100644 --- a/web/src/app/login/page.js +++ b/web/src/app/login/page.js @@ -39,14 +39,14 @@ const defaultValues = { grant_type: 'client_credentials', client_id: '', client_secret: '', - scope: '' + scope: '', } const schema = yup.object().shape({ grant_type: yup.string().required(), client_id: yup.string().required(), client_secret: yup.string().required(), - scope: yup.string().required() + scope: yup.string().required(), }) const LoginPage = () => { @@ -57,11 +57,11 @@ const LoginPage = () => { control, handleSubmit, reset, - formState: { errors } + formState: { errors }, } = useForm({ defaultValues: Object.assign({}, defaultValues), mode: 'onChange', - resolver: yupResolver(schema) + resolver: yupResolver(schema), }) const onSubmit = async data => { diff --git a/web/src/app/metalakes/CreateMetalakeDialog.js b/web/src/app/metalakes/CreateMetalakeDialog.js index 9dc50df5f53..35c06a8bd39 100644 --- a/web/src/app/metalakes/CreateMetalakeDialog.js +++ b/web/src/app/metalakes/CreateMetalakeDialog.js @@ -32,7 +32,7 @@ import { Grid, TextField, FormControl, - FormHelperText + FormHelperText, } from '@mui/material' import Icon from '@/components/Icon' @@ -50,11 +50,11 @@ import { nameRegex, nameRegexDesc, keyRegex } from '@/lib/utils/regex' const defaultValues = { name: '', - comment: '' + comment: '', } const schema = yup.object().shape({ - name: yup.string().required().matches(nameRegex, nameRegexDesc) + name: yup.string().required().matches(nameRegex, nameRegexDesc), }) const Transition = forwardRef(function Transition(props, ref) { @@ -76,11 +76,11 @@ const CreateMetalakeDialog = props => { reset, setValue, handleSubmit, - formState: { errors } + formState: { errors }, } = useForm({ defaultValues, mode: 'onChange', - resolver: yupResolver(schema) + resolver: yupResolver(schema), }) const handleFormChange = (index, event) => { @@ -158,7 +158,7 @@ const CreateMetalakeDialog = props => { const metalakeData = { ...data, - properties + properties, } if (type === 'create') { @@ -188,7 +188,7 @@ const CreateMetalakeDialog = props => { const propsArr = Object.keys(properties).map(item => { return { key: item, - value: properties[item] + value: properties[item], } }) @@ -206,7 +206,7 @@ const CreateMetalakeDialog = props => { className={'twc-relative twc-pb-8'} sx={{ px: theme => [`${theme.spacing(5)} !important`, `${theme.spacing(15)} !important`], - pt: theme => [`${theme.spacing(8)} !important`, `${theme.spacing(12.5)} !important`] + pt: theme => [`${theme.spacing(8)} !important`, `${theme.spacing(12.5)} !important`], }} > { maxWidth: 240, overflow: 'hidden', textOverflow: 'ellipsis', - '&:hover': { color: 'primary.main', textDecoration: 'underline' } + '&:hover': { color: 'primary.main', textDecoration: 'underline' }, }} data-refer={`metalake-link-${name}`} > @@ -130,7 +130,7 @@ const TableBody = props => { ) - } + }, }, { flex: 0.15, @@ -146,7 +146,7 @@ const TableBody = props => { {row.audit?.creator} ) - } + }, }, { flex: 0.15, @@ -162,7 +162,7 @@ const TableBody = props => { {formatToDateTime(row.audit?.createTime)} ) - } + }, }, { flex: 0.1, @@ -202,8 +202,8 @@ const TableBody = props => { - ) - } + ), + }, ] function TableToolbar(props) { @@ -229,14 +229,14 @@ const TableBody = props => { slotProps={{ toolbar: { printOptions: { disableToolbarButton: true }, - csvOptions: { disableToolbarButton: true } - } + csvOptions: { disableToolbarButton: true }, + }, }} sx={{ '& .MuiDataGrid-virtualScroller': { - minHeight: 36 + minHeight: 36, }, - maxHeight: 'calc(100vh - 23.2rem)' + maxHeight: 'calc(100vh - 23.2rem)', }} data-refer='metalake-table-grid' getRowId={row => row?.name} diff --git a/web/src/app/metalakes/metalake/MetalakePageLeftBar.js b/web/src/app/metalakes/metalake/MetalakePageLeftBar.js index 9faab1f0456..ef26ae8f9b9 100644 --- a/web/src/app/metalakes/metalake/MetalakePageLeftBar.js +++ b/web/src/app/metalakes/metalake/MetalakePageLeftBar.js @@ -26,7 +26,7 @@ import Loading from '@/app/rootLayout/Loading' const DynamicMetalakeTree = dynamic(() => import('./MetalakeTree'), { loading: () => , - ssr: false + ssr: false, }) const MetalakePageLeftBar = () => { diff --git a/web/src/app/metalakes/metalake/MetalakeTree.js b/web/src/app/metalakes/metalake/MetalakeTree.js index d0d8da6461b..852f0bf343e 100644 --- a/web/src/app/metalakes/metalake/MetalakeTree.js +++ b/web/src/app/metalakes/metalake/MetalakeTree.js @@ -38,7 +38,7 @@ import { setLoadedNodes, getTableDetails, getFilesetDetails, - getTopicDetails + getTopicDetails, } from '@/lib/store/metalakes' import { extractPlaceholder } from '@/lib/utils' @@ -261,7 +261,7 @@ const MetalakeTree = props => { whiteSpace: 'nowrap', maxWidth, overflow: 'hidden', - textOverflow: 'ellipsis' + textOverflow: 'ellipsis', }} data-refer='tree-node' data-refer-node={nodeData.key} @@ -298,8 +298,8 @@ const MetalakeTree = props => { ref={treeRef} rootStyle={{ '& .antTreeTitle': { - width: '100%' - } + width: '100%', + }, }} treeData={store.metalakeTree} loadData={onLoadData} @@ -327,7 +327,7 @@ const MetalakeTree = props => { '[&_.ant-tree-node-content-wrapper]:twc-inline-flex', '[&_.ant-tree-node-content-wrapper]:twc-items-center', - '[&_.ant-tree-node-content-wrapper]:twc-leading-[28px]' + '[&_.ant-tree-node-content-wrapper]:twc-leading-[28px]', ])} data-refer='tree-view' icon={nodeProps => renderIcon(nodeProps)} diff --git a/web/src/app/metalakes/metalake/MetalakeView.js b/web/src/app/metalakes/metalake/MetalakeView.js index a7726bea587..b397c61dbde 100644 --- a/web/src/app/metalakes/metalake/MetalakeView.js +++ b/web/src/app/metalakes/metalake/MetalakeView.js @@ -40,7 +40,7 @@ import { getTableDetails, getFilesetDetails, getTopicDetails, - setSelectedNodes + setSelectedNodes, } from '@/lib/store/metalakes' const MetalakeView = () => { @@ -57,7 +57,7 @@ const MetalakeView = () => { schema: searchParams.get('schema'), table: searchParams.get('table'), fileset: searchParams.get('fileset'), - topic: searchParams.get('topic') + topic: searchParams.get('topic'), } async function fetchDependsData() { if ([...searchParams.keys()].length) { @@ -124,7 +124,7 @@ const MetalakeView = () => { routeParams.schema ? `{{${routeParams.schema}}}` : '' }${routeParams.table ? `{{${routeParams.table}}}` : ''}${ routeParams.fileset ? `{{${routeParams.fileset}}}` : '' - }${routeParams.topic ? `{{${routeParams.topic}}}` : ''}` + }${routeParams.topic ? `{{${routeParams.topic}}}` : ''}`, ] : [] ) diff --git a/web/src/app/metalakes/metalake/rightContent/CreateCatalogDialog.js b/web/src/app/metalakes/metalake/rightContent/CreateCatalogDialog.js index fadc29fe080..53d40dc1e79 100644 --- a/web/src/app/metalakes/metalake/rightContent/CreateCatalogDialog.js +++ b/web/src/app/metalakes/metalake/rightContent/CreateCatalogDialog.js @@ -36,7 +36,7 @@ import { MenuItem, InputLabel, FormControl, - FormHelperText + FormHelperText, } from '@mui/material' import Icon from '@/components/Icon' @@ -59,7 +59,7 @@ const defaultValues = { type: 'relational', provider: '', comment: '', - propItems: [] + propItems: [], } const schema = yup.object().shape({ @@ -83,10 +83,10 @@ const schema = yup.object().shape({ key: yup.string().required(), value: yup.string().when('required', { is: true, - then: schema => schema.required() - }) + then: schema => schema.required(), + }), }) - ) + ), }) const Transition = forwardRef(function Transition(props, ref) { @@ -114,11 +114,11 @@ const CreateCatalogDialog = props => { getValues, handleSubmit, trigger, - formState: { errors } + formState: { errors }, } = useForm({ defaultValues, mode: 'all', - resolver: yupResolver(schema) + resolver: yupResolver(schema), }) const providerSelect = watch('provider') @@ -262,7 +262,7 @@ const CreateCatalogDialog = props => { if (catalogBackend && catalogBackend === 'hive') { properties = { 'catalog-backend': catalogBackend, - ...others + ...others, } } else { properties = prevProperties @@ -270,7 +270,7 @@ const CreateCatalogDialog = props => { const catalogData = { ...mainData, - properties + properties, } if (type === 'create') { @@ -376,7 +376,7 @@ const CreateCatalogDialog = props => { propsItems = propsItems.map((it, idx) => { let propItem = { ...it, - disabled: true + disabled: true, } const findProp = Object.keys(properties).find(i => i === it.key) @@ -395,7 +395,7 @@ const CreateCatalogDialog = props => { let propItem = { key: item, value: properties[item], - disabled: data.type === 'fileset' && item === 'location' && type === 'update' + disabled: data.type === 'fileset' && item === 'location' && type === 'update', } propsItems.push(propItem) } @@ -414,7 +414,7 @@ const CreateCatalogDialog = props => { position: 'relative', pb: theme => `${theme.spacing(8)} !important`, px: theme => [`${theme.spacing(5)} !important`, `${theme.spacing(15)} !important`], - pt: theme => [`${theme.spacing(8)} !important`, `${theme.spacing(12.5)} !important`] + pt: theme => [`${theme.spacing(8)} !important`, `${theme.spacing(12.5)} !important`], }} > { {item.description} @@ -653,7 +653,7 @@ const CreateCatalogDialog = props => { sx={{ justifyContent: 'center', px: theme => [`${theme.spacing(5)} !important`, `${theme.spacing(15)} !important`], - pb: theme => [`${theme.spacing(5)} !important`, `${theme.spacing(12.5)} !important`] + pb: theme => [`${theme.spacing(5)} !important`, `${theme.spacing(12.5)} !important`], }} >