├── cfg ├── config_development.json ├── config_production.json └── config.json ├── .cargo └── config.toml ├── lint.sh ├── .dockerignore ├── docs ├── antora.yml └── modules │ └── ROOT │ ├── assets │ └── images │ │ └── fonts.png │ ├── nav.adoc │ └── pages │ └── index.adoc ├── .editorconfig ├── .gitignore ├── .github └── workflows │ ├── pr-lint.yml │ ├── approve-merge.yaml │ ├── build.yaml │ ├── release-pr.yaml │ └── release.yaml ├── src ├── types.rs ├── proto.rs ├── main.rs ├── s3.rs ├── pdf_utils.rs ├── server.rs └── renderer.rs ├── .releaserc.json ├── README.adoc ├── TODO.md ├── Cargo.toml ├── LICENSE ├── Dockerfile ├── pdf_rendering.proto └── Cargo.lock /cfg/config_development.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /.cargo/config.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | rustflags = ["--cfg", "tokio_unstable"] 3 | -------------------------------------------------------------------------------- /lint.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | set -ex 4 | 5 | cargo +nightly fmt 6 | cargo +nightly clippy -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | * 2 | !Cargo.lock 3 | !Cargo.toml 4 | !src/ 5 | !build.rs 6 | !pdf_rendering.proto 7 | !cfg 8 | !.cargo -------------------------------------------------------------------------------- /docs/antora.yml: -------------------------------------------------------------------------------- 1 | name: pdf-rendering-srv 2 | title: PDF Rendering Service 3 | version: master 4 | nav: 5 | - modules/ROOT/nav.adoc 6 | -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/fonts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/restorecommerce/pdf-rendering-srv/HEAD/docs/modules/ROOT/assets/images/fonts.png -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = true 13 | -------------------------------------------------------------------------------- /cfg/config_production.json: -------------------------------------------------------------------------------- 1 | { 2 | "server": { 3 | "port": 50051 4 | }, 5 | 6 | "s3": { 7 | "client": { 8 | "endpoint": "http://cloudserver:8000" 9 | } 10 | }, 11 | 12 | "client": { 13 | "user": { 14 | "address": "http://identity-srv:50051" 15 | } 16 | } 17 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | target 4 | 5 | .nyc_output 6 | .project 7 | .settings 8 | .directory 9 | .vscode 10 | .env 11 | .vscode/* 12 | .DS_Store 13 | .idea 14 | 15 | *.js 16 | *.d.ts 17 | !.eslintrc.js 18 | !setupTopics.js 19 | config 20 | id_rsa 21 | id_rsa.pub 22 | known_hosts 23 | # 24 | -------------------------------------------------------------------------------- /.github/workflows/pr-lint.yml: -------------------------------------------------------------------------------- 1 | name: "Lint PR" 2 | 3 | on: 4 | pull_request_target: 5 | types: 6 | - opened 7 | - edited 8 | - synchronize 9 | 10 | permissions: 11 | pull-requests: read 12 | 13 | jobs: 14 | lint: 15 | name: pr-lint 16 | runs-on: ubuntu-latest 17 | steps: 18 | - uses: amannn/action-semantic-pull-request@v5 19 | env: 20 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /src/types.rs: -------------------------------------------------------------------------------- 1 | use crate::proto::pdf_rendering::RenderData; 2 | use std::error::Error; 3 | use tokio::sync::mpsc; 4 | 5 | pub struct InternalRequest { 6 | pub data: Vec, 7 | pub response: mpsc::Sender, 8 | } 9 | 10 | pub type InternalResponse = anyhow::Result, Box>; 11 | 12 | pub struct RendererResponse { 13 | pub resp: InternalResponse, 14 | pub order: usize, 15 | } 16 | 17 | #[derive(Copy, Clone)] 18 | pub struct IDExtension { 19 | pub id: ulid::Ulid, 20 | } 21 | -------------------------------------------------------------------------------- /.releaserc.json: -------------------------------------------------------------------------------- 1 | { 2 | "branches": [ 3 | "master" 4 | ], 5 | "plugins": [ 6 | "@semantic-release/commit-analyzer", 7 | "@semantic-release/release-notes-generator", 8 | "@semantic-release/github", 9 | [ 10 | "@semantic-release-plus/docker", 11 | { 12 | "name": "docker.io/restorecommerce/pdf-rendering-srv", 13 | "skipLogin": true 14 | } 15 | ], 16 | [ 17 | "@semantic-release-plus/docker", 18 | { 19 | "name": "ghcr.io/restorecommerce/pdf-rendering-srv", 20 | "skipLogin": true 21 | } 22 | ] 23 | ] 24 | } -------------------------------------------------------------------------------- /README.adoc: -------------------------------------------------------------------------------- 1 | = PDF Rendering Service 2 | 3 | https://github.com/restorecommerce/pdf-rendering-srv/actions/workflows/build.yaml[image:https://img.shields.io/github/actions/workflow/status/restorecommerce/pdf-rendering-srv/build.yaml?style=flat-square[Build Status]] 4 | 5 | A microservice for PDF rendering from URLs. 6 | 7 | Please consult the documentation for using it: 8 | 9 | - *link:https://docs.restorecommerce.io/pdf-rendering-srv/index.html[Usage]* 10 | - *link:https://docs.restorecommerce.io/architecture/index.html[Restorecommerce Architecture]* 11 | 12 | Part of link:https://github.com/restorecommerce[Restorecommerce]. 13 | -------------------------------------------------------------------------------- /TODO.md: -------------------------------------------------------------------------------- 1 | - ~~Authentication/ authorization (+ subject propagation)~~ 2 | - ~~Let service directly upload to a pre defined S3 endpoint (provide bucket, key, meta data in the request)~~ 3 | - ~~Combine PDFs~~ 4 | - Embed attachments like XML data 5 | - PDF/A support 6 | - Proxy support for downloads 7 | - Content caching 8 | - ~~Add docs also explaining how to add fonts~~ 9 | - ~~Info endpoint that provides chrome version~~ 10 | - ~~Modify PDF meta data~~ 11 | - Emit Kafka event on successful render/ upload 12 | - ~~Batch rendering of multiple documents~~ 13 | - ~~Add logging~~ 14 | - Store objects via Ostorage service instead of S3 directly 15 | - return the actual URL instead of n/a when the object is stored 16 | -------------------------------------------------------------------------------- /docs/modules/ROOT/nav.adoc: -------------------------------------------------------------------------------- 1 | // INDEX 2 | * xref:index.adoc[PDF Rendering Service] 3 | 4 | // FEATURES 5 | * xref:index.adoc#features[Features] 6 | 7 | // EXAMPLE 8 | * xref:index.adoc#example[Example] 9 | 10 | // USAGE 11 | * xref:index.adoc#usage[Usage] 12 | ** xref:index.adoc#usage_running_as_container[Running as Container] 13 | ** xref:index.adoc#usage_from_url[From URL] 14 | ** xref:index.adoc#usage_from_html[From HTML] 15 | 16 | // CUSTOMIZATION 17 | * xref:index.adoc#customization[Customization] 18 | ** xref:index.adoc#customization_install_additional_fonts[Installing Extra Fonts] 19 | 20 | // CONFIGURATION 21 | * xref:index.adoc#configuration[Configuration] 22 | 23 | // API 24 | * xref:index.adoc#api[API] 25 | ** xref:index.adoc#api_render[Render] 26 | -------------------------------------------------------------------------------- /.github/workflows/approve-merge.yaml: -------------------------------------------------------------------------------- 1 | name: Merge Release PR 2 | 3 | on: 4 | pull_request_review: 5 | types: [submitted] 6 | 7 | jobs: 8 | pr_approved: 9 | if: ${{ github.event.review.state == 'approved' && github.event.pull_request.base.ref == 'master' && github.event.pull_request.head.ref == 'next' }} 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Clone git repo 13 | uses: actions/checkout@v4 14 | with: 15 | fetch-depth: 0 16 | 17 | - name: Merge PR 18 | run: | 19 | git config --global user.email "bot@restorecommerce.io" 20 | git config --global user.name "Restorecommerce Bot" 21 | git checkout master 22 | git merge --ff origin/next 23 | git push -u origin master 24 | - uses: benc-uk/workflow-dispatch@v1 25 | with: 26 | workflow: release.yaml 27 | ref: master -------------------------------------------------------------------------------- /.github/workflows/build.yaml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: push 4 | 5 | jobs: 6 | image: 7 | runs-on: ubuntu-22.04 8 | steps: 9 | - name: Checkout 10 | uses: actions/checkout@v2 11 | 12 | - name: Setup buildx 13 | uses: docker/setup-buildx-action@v1 14 | 15 | - name: Set variables 16 | id: vars 17 | run: | 18 | echo ::set-output name=version_tag::$(echo ${GITHUB_REF#refs/*/}) 19 | echo ::set-output name=repo_name::$(echo ${GITHUB_REPOSITORY#*/*}) 20 | 21 | - name: Build 22 | uses: docker/build-push-action@v2 23 | with: 24 | context: . 25 | file: ./Dockerfile 26 | platforms: linux/amd64 27 | push: false 28 | build-args: | 29 | APP_HOME=/home/node/${{ steps.vars.outputs.repo_name }} 30 | cache-from: | 31 | ${{ github.repository }}:latest 32 | -------------------------------------------------------------------------------- /src/proto.rs: -------------------------------------------------------------------------------- 1 | pub mod attribute { 2 | tonic::include_proto!("io.restorecommerce.attribute"); 3 | } 4 | pub mod status { 5 | tonic::include_proto!("io.restorecommerce.status"); 6 | } 7 | pub mod auth { 8 | tonic::include_proto!("io.restorecommerce.auth"); 9 | } 10 | pub mod meta { 11 | tonic::include_proto!("io.restorecommerce.meta"); 12 | } 13 | pub mod user { 14 | tonic::include_proto!("io.restorecommerce.user"); 15 | } 16 | pub mod image { 17 | tonic::include_proto!("io.restorecommerce.image"); 18 | } 19 | pub mod role { 20 | tonic::include_proto!("io.restorecommerce.role"); 21 | } 22 | pub mod resourcebase { 23 | tonic::include_proto!("io.restorecommerce.resourcebase"); 24 | } 25 | pub mod filter { 26 | tonic::include_proto!("io.restorecommerce.filter"); 27 | } 28 | 29 | pub mod pdf_rendering { 30 | tonic::include_proto!("io.restorecommerce.pdf_rendering"); 31 | 32 | pub(crate) const FILE_DESCRIPTOR_SET: &[u8] = tonic::include_file_descriptor_set!("proto_fd"); 33 | } 34 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "pdf-rendering-srv" 3 | version = "0.1.5" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | tokio = { version = "1.47.1", features = ["macros", "rt-multi-thread", "rt", "full"] } 10 | prost = "0.14.1" 11 | headless_chrome = "1.0.18" 12 | tonic = "0.14.2" 13 | tonic-prost = "0.14.2" 14 | tonic-prost-build = "0.14.2" 15 | prost-types = "0.14.1" 16 | tokio-stream = "0.1.17" 17 | tiny_http = "0.12.0" 18 | tonic-reflection = "0.14.2" 19 | tonic-health = "0.14.2" 20 | anyhow = "1.0.100" 21 | log = "0.4.28" 22 | env_logger = "0.11.8" 23 | config = "0.15.17" 24 | aws-sdk-s3 = "1.106.0" 25 | aws-sdk-config = "1.89.0" 26 | aws-smithy-runtime-api = "1.9.0" 27 | lopdf = "0.38.0" 28 | serde_json = "1.0.145" 29 | serde = { version = "1.0.228", features = ["derive"] } 30 | prost-wkt-types = "0.7.0" 31 | ulid = "1.2.1" 32 | 33 | [build-dependencies] 34 | tonic-build = "0.14.2" 35 | tonic-prost-build = "0.14.2" 36 | reqwest = { version = "0.12.23", features = ["blocking", "json"] } 37 | flate2 = "1.1.2" 38 | tar = "0.4.44" 39 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) n-fuse GmbH and other contributors. 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of 4 | this software and associated documentation files (the "Software"), to deal in 5 | the Software without restriction, including without limitation the rights to 6 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 7 | of the Software, and to permit persons to whom the Software is furnished to do 8 | so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. 20 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM lukemathwalker/cargo-chef:latest-rust-1.84-alpine3.20 AS planner 2 | WORKDIR /app 3 | COPY . . 4 | RUN cargo chef prepare --recipe-path recipe.json 5 | 6 | 7 | FROM rust:1.90.0-alpine3.22 AS build 8 | 9 | RUN rustup target add x86_64-unknown-linux-musl 10 | RUN apk add --no-cache build-base pkgconfig dbus-dev libressl-dev protoc protobuf-dev 11 | 12 | WORKDIR /app 13 | 14 | RUN cargo install cargo-chef 15 | 16 | COPY --from=planner /app/recipe.json recipe.json 17 | RUN cargo chef cook --release --target x86_64-unknown-linux-musl --recipe-path recipe.json 18 | 19 | COPY . . 20 | RUN cargo build --target x86_64-unknown-linux-musl --release 21 | 22 | RUN strip /app/target/x86_64-unknown-linux-musl/release/pdf-rendering-srv 23 | 24 | 25 | FROM alpine:3.22 26 | 27 | RUN apk --update --upgrade --no-cache add fontconfig font-noto font-noto-emoji font-liberation \ 28 | && fc-cache -f \ 29 | && fc-list | sort 30 | 31 | # Don't install M$ fonts because of license issues 32 | # RUN apk --update add fontconfig msttcorefonts-installer \ 33 | # && update-ms-fonts \ 34 | # && fc-cache -f 35 | 36 | RUN apk add --no-cache chromium 37 | 38 | WORKDIR /app 39 | 40 | COPY --from=build /app/target/x86_64-unknown-linux-musl/release/pdf-rendering-srv /app/pdf-rendering-srv 41 | COPY ./cfg /app/cfg 42 | 43 | ENV NODE_ENV=production 44 | 45 | EXPOSE 50051 46 | 47 | CMD ["/app/pdf-rendering-srv"] 48 | -------------------------------------------------------------------------------- /.github/workflows/release-pr.yaml: -------------------------------------------------------------------------------- 1 | name: Release PR 2 | 3 | on: 4 | push: 5 | branches: 6 | - next 7 | 8 | permissions: 9 | contents: read 10 | 11 | jobs: 12 | release_pr: 13 | permissions: 14 | issues: write 15 | pull-requests: write 16 | contents: write 17 | runs-on: ubuntu-latest 18 | steps: 19 | - uses: actions/checkout@v4 20 | with: 21 | fetch-depth: 0 22 | 23 | - name: Generate Changes 24 | env: 25 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 26 | run: | 27 | set -ex 28 | echo '# Release Changes' > changes.md 29 | npx semantic-release@22.0.12 -d -p '@semantic-release/release-notes-generator' -b next | grep -v semantic-release | tee -a changes.md 30 | printf '\n---\n\n### Approve this PR to release above packages!' >> changes.md 31 | - name: Create PR 32 | env: 33 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 34 | run: | 35 | set -ex 36 | export PR_NUMBER=$(gh pr list -B master -H next --json number | jq -r '.[0].number') 37 | if [[ "$(git rev-parse origin/master)" == "$(git rev-parse origin/next)" ]]; then exit 0; fi 38 | if [[ "$PR_NUMBER" == "null" ]]; then gh pr create -B master -H next -t "chore: release" -F changes.md; fi 39 | if [[ "$PR_NUMBER" != "null" ]]; then gh pr edit $PR_NUMBER -F changes.md; fi -------------------------------------------------------------------------------- /.github/workflows/release.yaml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | workflow_dispatch: 8 | 9 | permissions: 10 | contents: read 11 | 12 | jobs: 13 | release: 14 | permissions: 15 | contents: write 16 | issues: write 17 | pull-requests: write 18 | runs-on: ubuntu-22.04 19 | steps: 20 | - uses: actions/checkout@v4 21 | with: 22 | ref: master 23 | 24 | - uses: docker/login-action@v3 25 | with: 26 | username: ${{ secrets.DOCKERHUB_USERNAME }} 27 | password: ${{ secrets.DOCKERHUB_TOKEN }} 28 | 29 | - uses: docker/login-action@v3 30 | with: 31 | registry: ghcr.io 32 | username: ${{ github.repository_owner }} 33 | password: ${{ secrets.CR_PAT }} 34 | 35 | - uses: docker/setup-buildx-action@v3 36 | with: 37 | install: true 38 | 39 | - name: Set variables 40 | id: vars 41 | run: | 42 | echo ::set-output name=repo_name::$(echo ${GITHUB_REPOSITORY#*/*}) 43 | 44 | - uses: docker/metadata-action@v5 45 | id: docker_meta 46 | with: 47 | images: ${{ github.repository }} 48 | 49 | - uses: docker/build-push-action@v5 50 | with: 51 | load: true 52 | tags: ${{ github.repository }} 53 | labels: ${{ steps.docker_meta.outputs.labels }} 54 | 55 | - name: Install Dependencies 56 | run: npm i --no-save @semantic-release-plus/docker 57 | 58 | - run: npx semantic-release@22.0.12 59 | env: 60 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 61 | 62 | - uses: benc-uk/workflow-dispatch@v1 63 | with: 64 | workflow: upgrade-services.yaml 65 | ref: master 66 | repo: restorecommerce/charts 67 | token: "${{ secrets.CHARTS_WORKFLOW_TOKEN }}" -------------------------------------------------------------------------------- /cfg/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "logger": { 3 | "console": { 4 | "level": "info" 5 | } 6 | }, 7 | 8 | "server": { 9 | "host": "0.0.0.0", 10 | "port": 50062, 11 | "message_size_limit": 128000000 12 | }, 13 | 14 | "s3": { 15 | "client": { 16 | "region": "eu-central-1", 17 | "endpoint": "http://127.0.0.1:8000", 18 | "access_key": "accessKey1", 19 | "secret_key": "verySecretKey1", 20 | "s3_force_path_style": true 21 | } 22 | }, 23 | 24 | "serviceNames": { 25 | "ostorage": "io-restorecommerce-ostorage-srv", 26 | "reflection": "io-restorecommerce-ostorage-reflection", 27 | "cis": "io-restorecommerce-ostorage-cis", 28 | "health": "grpc-health-v1" 29 | }, 30 | 31 | "client": { 32 | "user": { 33 | "address": "http://localhost:50051" 34 | } 35 | }, 36 | 37 | "authorization": { 38 | "urns": { 39 | "entity": "urn:restorecommerce:acs:names:model:entity", 40 | "user": "urn:restorecommerce:acs:model:user.User", 41 | "model": "urn:restorecommerce:acs:model", 42 | "role": "urn:restorecommerce:acs:names:role", 43 | "roleScopingEntity": "urn:restorecommerce:acs:names:roleScopingEntity", 44 | "roleScopingInstance": "urn:restorecommerce:acs:names:roleScopingInstance", 45 | "unauthenticated_user": "urn:restorecommerce:acs:names:unauthenticated-user", 46 | "property": "urn:restorecommerce:acs:names:model:property", 47 | "ownerIndicatoryEntity": "urn:restorecommerce:acs:names:ownerIndicatoryEntity", 48 | "ownerInstance": "urn:restorecommerce:acs:names:ownerInstance", 49 | "orgScope": "urn:restorecommerce:acs:model:organization.Organization", 50 | "subjectID": "urn:oasis:names:tc:xacml:1.0:subject:subject-id", 51 | "resourceID": "urn:oasis:names:tc:xacml:1.0:resource:resource-id", 52 | "actionID": "urn:oasis:names:tc:xacml:1.0:action:action-id", 53 | "action": "urn:restorecommerce:acs:names:action", 54 | "operation": "urn:restorecommerce:acs:names:operation", 55 | "execute": "urn:restorecommerce:acs:names:action:execute", 56 | "permitOverrides": "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:permit-overrides", 57 | "denyOverrides": "urn:oasis:names:tc:xacml:3.0:rule-combining-algorithm:deny-overrides", 58 | "create": "urn:restorecommerce:acs:names:action:create", 59 | "read": "urn:restorecommerce:acs:names:action:read", 60 | "modify": "urn:restorecommerce:acs:names:action:modify", 61 | "delete": "urn:restorecommerce:acs:names:action:delete", 62 | "organization": "urn:restorecommerce:acs:model:organization.Organization", 63 | "aclIndicatoryEntity": "urn:restorecommerce:acs:names:aclIndicatoryEntity", 64 | "aclInstance": "urn:restorecommerce:acs:names:aclInstance", 65 | "skipACL": "urn:restorecommerce:acs:names:skipACL", 66 | "maskedProperty": "urn:restorecommerce:acs:names:obligation:maskedProperty" 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use config::{Case, Config, File}; 2 | use env_logger::WriteStyle; 3 | use log::info; 4 | use std::str::FromStr; 5 | use std::{env, error::Error, net::ToSocketAddrs}; 6 | use tokio::sync::mpsc; 7 | 8 | use tonic::codegen::InterceptedService; 9 | use tonic::{transport::Server, Request, Status}; 10 | use tonic_health::ServingStatus; 11 | 12 | use crate::proto::pdf_rendering::pdf_rendering_service_server::PdfRenderingServiceServer; 13 | use crate::renderer::start_renderer; 14 | use crate::server::PDFServer; 15 | use crate::types::{IDExtension, InternalRequest}; 16 | 17 | mod pdf_utils; 18 | mod proto; 19 | mod renderer; 20 | mod s3; 21 | mod server; 22 | mod types; 23 | 24 | #[tokio::main] 25 | async fn main() -> Result<(), Box> { 26 | let config = load_config(); 27 | 28 | let level = log::LevelFilter::from_str( 29 | config 30 | .get_string("logger.console.level") 31 | .unwrap_or("info".to_string()) 32 | .as_str(), 33 | ); 34 | 35 | env_logger::builder() 36 | .filter_level(level.expect("invalid level")) 37 | .write_style(WriteStyle::Always) 38 | .init(); 39 | 40 | let metrics = tokio::runtime::Handle::current().metrics(); 41 | info!("worker count: {}", metrics.num_workers()); 42 | 43 | let reflection_service = tonic_reflection::server::Builder::configure() 44 | .register_encoded_file_descriptor_set(proto::pdf_rendering::FILE_DESCRIPTOR_SET) 45 | .build_v1() 46 | .unwrap(); 47 | 48 | let (health_reporter, health_service) = tonic_health::server::health_reporter(); 49 | 50 | health_reporter 51 | .set_serving::>() 52 | .await; 53 | 54 | health_reporter 55 | .set_service_status("readiness", ServingStatus::Serving) 56 | .await; 57 | 58 | let (tx, rx) = mpsc::channel::(32); 59 | 60 | let pdf_server = PDFServer { 61 | config: config.clone(), 62 | renderer: tx, 63 | }; 64 | 65 | start_renderer(rx).await?; 66 | 67 | let pdf_service = 68 | InterceptedService::new( 69 | PdfRenderingServiceServer::new(pdf_server) 70 | .max_decoding_message_size( 71 | config.get_int("server.message_size_limit").unwrap() as usize 72 | ) 73 | .max_encoding_message_size( 74 | config.get_int("server.message_size_limit").unwrap() as usize 75 | ), 76 | logging, 77 | ); 78 | 79 | let server = Server::builder() 80 | .add_service(health_service) 81 | .add_service(reflection_service) 82 | .add_service(pdf_service) 83 | .serve( 84 | (format!( 85 | "{}:{}", 86 | config.get_string("server.host").unwrap(), 87 | config.get_int("server.port").unwrap() 88 | )) 89 | .to_socket_addrs() 90 | .unwrap() 91 | .next() 92 | .unwrap(), 93 | ); 94 | 95 | info!( 96 | "Serving gRPC on port {}.", 97 | config.get_int("server.port").unwrap() 98 | ); 99 | 100 | server.await?; 101 | 102 | Ok(()) 103 | } 104 | 105 | fn logging(mut req: Request<()>) -> Result, Status> { 106 | let id = ulid::Ulid::new(); 107 | 108 | req.extensions_mut().insert(IDExtension { id }); 109 | 110 | info!("[{}] Received request: {:?}", id, req); 111 | Ok(req) 112 | } 113 | 114 | fn load_config() -> Config { 115 | let run_mode = env::var("NODE_ENV").unwrap_or_else(|_| "development".into()); 116 | 117 | println!("Running in mode: {}", run_mode); 118 | 119 | Config::builder() 120 | .add_source(File::with_name("cfg/config")) 121 | .add_source(File::with_name(&format!("cfg/config_{}", run_mode))) 122 | .add_source(config::Environment::with_convert_case(Case::Lower).separator("__")) 123 | .build() 124 | .unwrap() 125 | } 126 | -------------------------------------------------------------------------------- /pdf_rendering.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package io.restorecommerce.pdf_rendering; 4 | 5 | import "google/protobuf/any.proto"; 6 | import "google/protobuf/empty.proto"; 7 | import "io/restorecommerce/auth.proto"; 8 | import "io/restorecommerce/status.proto"; 9 | 10 | // Service 11 | 12 | service PdfRenderingService { 13 | rpc Render(RenderRequest) returns (RenderingResponse); 14 | rpc Info(google.protobuf.Empty) returns (InfoResponse); 15 | } 16 | 17 | // Requests 18 | 19 | message RenderRequest { 20 | oneof type { 21 | IndividualRequest individual = 1; 22 | CombinedRequest combined = 2; 23 | } 24 | optional io.restorecommerce.auth.Subject subject = 3; 25 | } 26 | 27 | message IndividualRequest { 28 | message IndividualRequestData { 29 | RenderData data = 1; 30 | optional OutputOptions output = 2; 31 | } 32 | 33 | repeated IndividualRequestData data = 1; 34 | } 35 | 36 | message CombinedRequest { 37 | repeated RenderData data = 1; 38 | optional OutputOptions output = 2; 39 | } 40 | 41 | message RenderData { 42 | RenderSource source = 1; 43 | optional RenderOptions options = 2; 44 | } 45 | 46 | message OutputOptions { 47 | optional bool generate_pdfa = 1; 48 | optional MetaData meta_data = 2; 49 | optional UploadOptions upload_options = 3; 50 | } 51 | 52 | message RenderOptions { 53 | oneof header_template { 54 | string header_url = 1; 55 | string header_html = 2; 56 | } 57 | oneof footer_template { 58 | string footer_url = 3; 59 | string footer_html = 4; 60 | } 61 | optional uint64 wait_after_load_time = 5; 62 | optional PuppeteerOptions puppeteer_options = 6; 63 | } 64 | 65 | message RenderSource { 66 | oneof content { 67 | string url = 1; 68 | string html = 2; 69 | } 70 | } 71 | 72 | message UploadOptions { 73 | optional string bucket = 1; 74 | optional string key = 2; 75 | optional string content_disposition = 3; 76 | } 77 | 78 | message MetaData { 79 | optional string title = 1; 80 | optional string creator = 2; 81 | optional string producer = 3; 82 | } 83 | 84 | // Responses 85 | 86 | message RenderingResponse { 87 | oneof response { 88 | IndividualResponse individual = 1; 89 | ResponsePayloadWithStatus combined = 2; 90 | } 91 | optional io.restorecommerce.status.OperationStatus operation_status = 3; 92 | } 93 | 94 | message IndividualResponse { 95 | repeated ResponsePayloadWithStatus RenderingResponse = 1; 96 | } 97 | 98 | message ResponsePayloadWithStatus { 99 | optional ResponsePayload payload = 1; 100 | optional io.restorecommerce.status.Status status = 3; 101 | } 102 | 103 | message ResponsePayload { 104 | oneof response { 105 | ResponsePDF pdf = 1; 106 | ResponseS3Upload upload_result = 2; 107 | } 108 | } 109 | 110 | message ResponsePDF { 111 | bytes data = 1; 112 | } 113 | 114 | message ResponseS3Upload { 115 | string url = 1; 116 | int32 length = 2; 117 | } 118 | 119 | // Info 120 | 121 | message InfoResponse { 122 | message ChromeVersion { 123 | string protocol_version = 1; 124 | string product = 2; 125 | string revision = 3; 126 | string user_agent = 4; 127 | string js_version = 5; 128 | } 129 | 130 | ChromeVersion chrome = 1; 131 | } 132 | 133 | // Puppeteer 134 | 135 | message PuppeteerOptions { 136 | optional PDFOptions pdf_options = 1; 137 | } 138 | 139 | message PDFOptions { 140 | enum PaperFormat { 141 | A0 = 0; 142 | A1 = 1; 143 | A2 = 2; 144 | A3 = 3; 145 | A4 = 4; 146 | A5 = 5; 147 | A6 = 6; 148 | A7 = 7; 149 | LETTER = 8; 150 | LEGAL = 9; 151 | TABLOID = 10; 152 | } 153 | 154 | optional bool landscape = 1; 155 | optional bool display_header_footer = 2; 156 | optional bool print_background = 3; 157 | optional PaperFormat format = 4; 158 | optional float scale = 5; 159 | optional float paper_width = 6; 160 | optional float paper_height = 7; 161 | optional float margin_top = 8; 162 | optional float margin_bottom = 9; 163 | optional float margin_left = 10; 164 | optional float margin_right = 11; 165 | optional string page_ranges = 12; 166 | optional bool ignore_invalid_page_ranges = 13; 167 | optional string header_template = 14; 168 | optional string footer_template = 15; 169 | optional bool prefer_css_page_size = 16; 170 | } 171 | -------------------------------------------------------------------------------- /src/s3.rs: -------------------------------------------------------------------------------- 1 | use crate::proto::attribute::Attribute; 2 | use crate::proto::auth::Subject; 3 | use crate::proto::meta; 4 | use crate::proto::pdf_rendering::UploadOptions; 5 | use crate::proto::user::user_service_client::UserServiceClient; 6 | use crate::proto::user::FindByTokenRequest; 7 | use aws_sdk_s3::config::Credentials; 8 | use aws_sdk_s3::error::SdkError; 9 | use aws_sdk_s3::operation::put_object::{PutObjectError, PutObjectOutput}; 10 | use aws_sdk_s3::primitives::ByteStream; 11 | use aws_smithy_runtime_api::client::orchestrator::HttpResponse; 12 | use config::Config; 13 | use serde_json::json; 14 | use std::time::SystemTime; 15 | 16 | pub async fn upload_to_s3( 17 | config: Config, 18 | upload_opt: UploadOptions, 19 | data: Vec, 20 | subject: Option, 21 | ) -> Result> { 22 | let endpoint = config.get_string("s3.client.endpoint").unwrap(); 23 | let region = config.get_string("s3.client.region").unwrap(); 24 | let access_key = config.get_string("s3.client.access_key").unwrap(); 25 | let secret_key = config.get_string("s3.client.secret_key").unwrap(); 26 | 27 | let s3_config = aws_sdk_s3::Config::builder() 28 | .behavior_version_latest() 29 | .endpoint_url(endpoint) 30 | .region(aws_sdk_config::config::Region::new(region)) 31 | .credentials_provider(Credentials::new( 32 | access_key, secret_key, None, None, "Static", 33 | )) 34 | .force_path_style( 35 | config 36 | .get_bool("s3.client.s3_force_path_style") 37 | .unwrap_or(false), 38 | ) 39 | .build(); 40 | 41 | let client = aws_sdk_s3::Client::from_conf(s3_config); 42 | 43 | let bucket_name = upload_opt.bucket.unwrap(); 44 | let key = upload_opt.key.unwrap(); 45 | let meta = create_metadata(config.clone(), subject.clone()); 46 | let mut subject_value = "{}".to_owned(); 47 | 48 | if subject.clone().is_some() && subject.clone().unwrap().token.is_some() { 49 | let mut ids_client = 50 | UserServiceClient::connect(config.get_string("client.user.address").unwrap()) 51 | .await 52 | .unwrap(); 53 | 54 | let response = ids_client 55 | .find_by_token(tonic::Request::new(FindByTokenRequest { 56 | token: subject.clone().unwrap().token, 57 | })) 58 | .await 59 | .unwrap(); 60 | 61 | match response.get_ref().clone().payload { 62 | None => {} 63 | Some(user) => { 64 | subject_value = json!({ 65 | "id": user.id.unwrap() 66 | }) 67 | .to_string(); 68 | } 69 | } 70 | } 71 | 72 | client 73 | .put_object() 74 | .bucket(bucket_name.clone()) 75 | .key(key.clone()) 76 | .body(ByteStream::from(data.clone())) 77 | .content_type("application/pdf") 78 | .set_content_disposition(upload_opt.content_disposition) 79 | .metadata("Data", "{}") 80 | .metadata("Key", key.clone()) 81 | .metadata( 82 | "Meta", 83 | serde_json::to_string(&meta).expect("failed json serialization"), 84 | ) 85 | .metadata("Subject", subject_value) 86 | .send() 87 | .await 88 | } 89 | 90 | fn create_metadata(config: Config, subject: Option) -> meta::Meta { 91 | let mut out = meta::Meta::default(); 92 | 93 | let now: prost_wkt_types::Timestamp = SystemTime::now().into(); 94 | out.created = Some(now); 95 | out.modified = Some(now); 96 | 97 | out.created_by = subject.clone().and_then(|s| s.id); 98 | out.modified_by = subject.clone().and_then(|s| s.id); 99 | 100 | match subject.clone() { 101 | None => {} 102 | Some(s) => match s.scope { 103 | None => {} 104 | Some(target_scope) => out.owners.push(Attribute { 105 | id: Some( 106 | config 107 | .get_string("authorization.urns.ownerIndicatoryEntity") 108 | .unwrap(), 109 | ), 110 | value: Some( 111 | config 112 | .get_string("authorization.urns.organization") 113 | .unwrap(), 114 | ), 115 | attributes: vec![Attribute { 116 | id: Some( 117 | config 118 | .get_string("authorization.urns.ownerInstance") 119 | .unwrap(), 120 | ), 121 | value: Some(target_scope), 122 | attributes: Vec::new(), 123 | }], 124 | }), 125 | }, 126 | } 127 | 128 | out 129 | } 130 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/index.adoc: -------------------------------------------------------------------------------- 1 | = PDF Rendering Service 2 | 3 | A microservice for rendering PDFs from HTML using the Chromium browser. 4 | 5 | [#features] 6 | == Features 7 | 8 | * Good for any kind of content like receipts, invoices, reports. 9 | * gRPC interface including health checks. 10 | * Batch rendering. 11 | * Return or upload render results to an S3 endpoint. 12 | * Uses link:https://www.chromium.org/[Chromium] to render PDF. 13 | * Supports various fonts out of the box and adding custom fonts. 14 | 15 | [#rendering] 16 | == Rendering 17 | 18 | The rendering of the HTML page is considered complete when the `networkidle0` event is fired, i.e. when there are no more than 0 network connections for at least 500 ms. If this does still yield in an incomplete document, there is a parameter `wait_after_load_time` which can be used to add an additional delay after the `networkidle0` event. 19 | 20 | [#example] 21 | == Example 22 | 23 | [source,html] 24 | ---- 25 | 26 | 27 | 28 | 29 |

This is a paragraph - Liberation.

30 |

This is a paragraph - Liberation Sans.

31 |

This is a paragraph - Noto Serif.

32 |

This is a paragraph - Noto Sans.

33 |

This is a paragraph - Arial (without font being installed).

34 |

This is a paragraph - Comic Sans MS (without font being installed).

35 |

This is a paragraph - Times New Roman (without font being installed).

36 | 37 | 38 | 39 | ---- 40 | 41 | renders like this in PDF: 42 | image:https://github.com/restorecommerce/pdf-rendering-srv/blob/master/docs/modules/ROOT/assets/images/fonts.png[fonts.png]. 43 | 44 | [#usage] 45 | == Usage 46 | 47 | [#usage_running_as_container] 48 | === Running as Container 49 | 50 | [source,sh] 51 | ---- 52 | docker run -d -p 50051:50051 --name pdf-rendering-srv ghcr.io/restorecommerce/pdf-rendering-srv 53 | ---- 54 | 55 | [#example_calls] 56 | === Example calls 57 | 58 | These examples use the link:https://github.com/fullstorydev/grpcurl[grpcurl] CLI tool to make gRPC calls. 59 | 60 | [#example_call_from_url] 61 | ==== From URL 62 | 63 | Produces a PDF file called `out.pdf` 64 | 65 | [source,sh] 66 | ---- 67 | grpcurl -plaintext -d '{ 68 | "individual": { 69 | "data": [ 70 | { 71 | "data": { 72 | "source": { 73 | "url": "https://en.wikipedia.org/wiki/WebKit" 74 | } 75 | } 76 | } 77 | ] 78 | } 79 | }' 127.0.0.1:50051 io.restorecommerce.pdf_rendering.PdfRenderingService.Render | jq -r '.individual.RenderingResponse[0].payload.pdf.data' | base64 -d > out.pdf 80 | ---- 81 | 82 | [#example_call_from_html] 83 | ==== From HTML 84 | 85 | Produces a PDF file called `out.pdf` 86 | 87 | [source,sh] 88 | ---- 89 | grpcurl -plaintext -d '{ 90 | "individual": { 91 | "data": [ 92 | { 93 | "data": { 94 | "source": { 95 | "html": "Hello World" 96 | } 97 | } 98 | } 99 | ] 100 | } 101 | }' 127.0.0.1:50051 io.restorecommerce.pdf_rendering.PdfRenderingService.Render | jq -r '.individual.RenderingResponse[0].payload.pdf.data' | base64 -d > out.pdf 102 | ---- 103 | 104 | [#example_call_combine] 105 | ==== Combine Multiple PDFs 106 | 107 | Produces a PDF file called `combined.pdf` 108 | 109 | [source,sh] 110 | ---- 111 | grpcurl -plaintext -d '{ 112 | "combined": { 113 | "data": [ 114 | { 115 | "source": { 116 | "url": "https://en.wikipedia.org/wiki/WebKit" 117 | } 118 | }, 119 | { 120 | "source": { 121 | "html": "Hello World" 122 | } 123 | } 124 | ] 125 | } 126 | }' 127.0.0.1:50051 io.restorecommerce.pdf_rendering.PdfRenderingService.Render | jq -r '.combined.payload.pdf.data' | base64 -d > combined.pdf 127 | ---- 128 | 129 | [#example_s3] 130 | ==== Upload directly to S3 131 | 132 | Produces a PDF file and uploads it to the `pdf` bucket at the `sample.pdf` key. 133 | 134 | [source,sh] 135 | ---- 136 | grpcurl -plaintext -d '{ 137 | "individual": { 138 | "data": [ 139 | { 140 | "data": { 141 | "source": { 142 | "html": "Hello World" 143 | } 144 | }, 145 | "output": { 146 | "metaData": { 147 | "title": "Replacement Title", 148 | "creator": "Replacement Creator", 149 | "producer": "Replacement Producer" 150 | }, 151 | "uploadOptions": { 152 | "bucket": "pdf", 153 | "key": "sample.pdf" 154 | } 155 | } 156 | } 157 | ] 158 | } 159 | }' 127.0.0.1:50051 io.restorecommerce.pdf_rendering.PdfRenderingService.Render | jq 160 | ---- 161 | 162 | [#customization] 163 | == Customization 164 | 165 | [#customization_install_additional_fonts] 166 | === Installing Additional Fonts 167 | 168 | See the Dockerfile how fonts are installed in Alpine Linux. 169 | 170 | [#configuration] 171 | == Configuration 172 | 173 | All configuration options and their defaults are available in `./cfg/config.json`. 174 | 175 | [#api] 176 | == API 177 | 178 | This microservice exposes the following gRPC endpoints: 179 | 180 | [#api_info] 181 | === Info 182 | 183 | Return data about the used chromium instance. 184 | 185 | `io.restorecommerce.pdf_rendering.PdfRenderingService.Info` 186 | 187 | [#api_render] 188 | === Render 189 | 190 | Render provided request into a PDF. 191 | 192 | `io.restorecommerce.pdf_rendering.PdfRenderingService.Render` 193 | 194 | [width="100%",cols="20%,16%,20%,44%",options="header",] 195 | |========================================================================================================================== 196 | |Field |Type |Label |Description 197 | |individual |`io.restorecommerce.pdf_rendering.IndividualRequest` |optional |Individual render request 198 | |combined |`io.restorecommerce.pdf_rendering.CombinedRequest` |optional |Combined render request 199 | |subject |`io.restorecommerce.auth.Subject` |optional |Subject details 200 | |========================================================================================================================== 201 | 202 | For details of the meaning of these options check the link:https://pptr.dev/api/puppeteer.pdfoptions[PDFOptions interface] of Puppeteer. 203 | 204 | -------------------------------------------------------------------------------- /src/pdf_utils.rs: -------------------------------------------------------------------------------- 1 | use log::error; 2 | use std::collections::BTreeMap; 3 | use std::io::{Cursor, Write}; 4 | 5 | use crate::proto::pdf_rendering::MetaData; 6 | use lopdf::Dictionary as LoDictionary; 7 | use lopdf::Object::*; 8 | use lopdf::StringFormat::Literal; 9 | use lopdf::{Bookmark, Document, Object, ObjectId}; 10 | 11 | pub fn merge_pdfs(documents: Vec) -> std::io::Result> { 12 | // Define a starting max_id (will be used as start index for object_ids) 13 | let mut max_id = 1; 14 | let mut pagenum = 1; 15 | // Collect all Documents Objects grouped by a map 16 | let mut documents_pages = BTreeMap::new(); 17 | let mut documents_objects = BTreeMap::new(); 18 | let mut document = Document::with_version("1.5"); 19 | 20 | for mut doc in documents { 21 | let mut first = false; 22 | doc.renumber_objects_with(max_id); 23 | 24 | max_id = doc.max_id + 1; 25 | 26 | documents_pages.extend( 27 | doc.get_pages() 28 | .into_values() 29 | .map(|object_id| { 30 | if !first { 31 | let bookmark = Bookmark::new( 32 | format!("Page_{}", pagenum), 33 | [0.0, 0.0, 1.0], 34 | 0, 35 | object_id, 36 | ); 37 | document.add_bookmark(bookmark, None); 38 | first = true; 39 | pagenum += 1; 40 | } 41 | 42 | (object_id, doc.get_object(object_id).unwrap().to_owned()) 43 | }) 44 | .collect::>(), 45 | ); 46 | documents_objects.extend(doc.objects); 47 | } 48 | 49 | // Catalog and Pages are mandatory 50 | let mut catalog_object: Option<(ObjectId, Object)> = None; 51 | let mut pages_object: Option<(ObjectId, Object)> = None; 52 | 53 | // Process all objects except "Page" type 54 | for (object_id, object) in documents_objects.iter() { 55 | // We have to ignore "Page" (as are processed later), "Outlines" and "Outline" objects 56 | // All other objects should be collected and inserted into the main Document 57 | match object.type_name().unwrap_or("".as_bytes()) { 58 | b"Catalog" => { 59 | // Collect a first "Catalog" object and use it for the future "Pages" 60 | catalog_object = Some(( 61 | if let Some((id, _)) = catalog_object { 62 | id 63 | } else { 64 | *object_id 65 | }, 66 | object.clone(), 67 | )); 68 | } 69 | b"Pages" => { 70 | // Collect and update a first "Pages" object and use it for the future "Catalog" 71 | // We have also to merge all dictionaries of the old and the new "Pages" object 72 | if let Ok(dictionary) = object.as_dict() { 73 | let mut dictionary = dictionary.clone(); 74 | if let Some((_, ref object)) = pages_object { 75 | if let Ok(old_dictionary) = object.as_dict() { 76 | dictionary.extend(old_dictionary); 77 | } 78 | } 79 | 80 | pages_object = Some(( 81 | if let Some((id, _)) = pages_object { 82 | id 83 | } else { 84 | *object_id 85 | }, 86 | Dictionary(dictionary), 87 | )); 88 | } 89 | } 90 | b"Page" => {} // Ignored, processed later and separately 91 | b"Outlines" => {} // Ignored, not supported yet 92 | b"Outline" => {} // Ignored, not supported yet 93 | _ => { 94 | document.objects.insert(*object_id, object.clone()); 95 | } 96 | } 97 | } 98 | 99 | // If no "Pages" object found abort 100 | if pages_object.is_none() { 101 | error!("Pages root not found."); 102 | 103 | return Ok(vec![]); 104 | } 105 | 106 | // Iterate over all "Page" objects and collect into the parent "Pages" created before 107 | for (object_id, object) in documents_pages.iter() { 108 | if let Ok(dictionary) = object.as_dict() { 109 | let mut dictionary = dictionary.clone(); 110 | dictionary.set("Parent", pages_object.as_ref().unwrap().0); 111 | 112 | document.objects.insert(*object_id, Dictionary(dictionary)); 113 | } 114 | } 115 | 116 | // If no "Catalog" found abort 117 | if catalog_object.is_none() { 118 | error!("Catalog root not found."); 119 | 120 | return Ok(vec![]); 121 | } 122 | 123 | let catalog_object = catalog_object.unwrap(); 124 | let pages_object = pages_object.unwrap(); 125 | 126 | // Build a new "Pages" with updated fields 127 | if let Ok(dictionary) = pages_object.1.as_dict() { 128 | let mut dictionary = dictionary.clone(); 129 | 130 | // Set new pages count 131 | dictionary.set("Count", documents_pages.len() as u32); 132 | 133 | // Set new "Kids" list (collected from documents pages) for "Pages" 134 | dictionary.set( 135 | "Kids", 136 | documents_pages 137 | .into_keys() 138 | .map(Reference) 139 | .collect::>(), 140 | ); 141 | 142 | document 143 | .objects 144 | .insert(pages_object.0, Dictionary(dictionary)); 145 | } 146 | 147 | // Build a new "Catalog" with updated fields 148 | if let Ok(dictionary) = catalog_object.1.as_dict() { 149 | let mut dictionary = dictionary.clone(); 150 | dictionary.set("Pages", pages_object.0); 151 | dictionary.remove(b"Outlines"); // Outlines not supported in merged PDFs 152 | 153 | document 154 | .objects 155 | .insert(catalog_object.0, Dictionary(dictionary)); 156 | } 157 | 158 | document.trailer.set("Root", catalog_object.0); 159 | 160 | // Update the max internal ID as wasn't updated before due to direct objects insertion 161 | document.max_id = document.objects.len() as u32; 162 | 163 | // Reorder all new Document objects 164 | document.renumber_objects(); 165 | 166 | //Set any Bookmarks to the First child if they are not set to a page 167 | document.adjust_zero_pages(); 168 | 169 | //Set all bookmarks to the PDF Object tree then set the Outlines to the Bookmark content map. 170 | if let Some(n) = document.build_outline() { 171 | if let Ok(Dictionary(ref mut dict)) = document.get_object_mut(catalog_object.0) { 172 | dict.set("Outlines", Reference(n)); 173 | } 174 | } 175 | 176 | document.compress(); 177 | 178 | let out_buf = Vec::new(); 179 | let mut memory_cursor = Cursor::new(out_buf.clone()); 180 | 181 | document 182 | .save_to(&mut memory_cursor) 183 | .expect("failed saving pdf"); 184 | 185 | memory_cursor.flush().expect("failed flushing"); 186 | 187 | Ok(memory_cursor.get_ref().to_vec()) 188 | } 189 | 190 | pub fn add_pdf_metadata(file: Vec, meta: Option) -> std::io::Result> { 191 | match meta { 192 | None => Ok(file), 193 | Some(m) => { 194 | let mut document = Document::load_mem(&file).expect("failed parsing pdf"); 195 | 196 | let mut meta_list = Vec::new(); 197 | 198 | if m.title.is_some() { 199 | meta_list.push(("Title", String(m.title.unwrap().into(), Literal))); 200 | } 201 | 202 | if m.creator.is_some() { 203 | meta_list.push(("Creator", String(m.creator.unwrap().into(), Literal))); 204 | } 205 | 206 | if m.producer.is_some() { 207 | meta_list.push(("Producer", String(m.producer.unwrap().into(), Literal))); 208 | } 209 | 210 | document.set_object((1, 0), LoDictionary::from_iter(meta_list.clone())); 211 | 212 | document.compress(); 213 | 214 | let out_buf = Vec::new(); 215 | let mut memory_cursor = Cursor::new(out_buf.clone()); 216 | 217 | document 218 | .save_to(&mut memory_cursor) 219 | .expect("failed saving PDF"); 220 | 221 | memory_cursor.flush().expect("failed flushing"); 222 | 223 | Ok(memory_cursor.get_ref().to_vec()) 224 | } 225 | } 226 | } 227 | -------------------------------------------------------------------------------- /src/server.rs: -------------------------------------------------------------------------------- 1 | use crate::pdf_utils::{add_pdf_metadata, merge_pdfs}; 2 | use crate::proto::auth::Subject; 3 | use crate::proto::pdf_rendering::info_response::ChromeVersion; 4 | use crate::proto::pdf_rendering::pdf_rendering_service_server::PdfRenderingService; 5 | use crate::proto::pdf_rendering::render_request::Type; 6 | use crate::proto::pdf_rendering::{ 7 | rendering_response, response_payload, CombinedRequest, IndividualRequest, IndividualResponse, 8 | InfoResponse, OutputOptions, RenderRequest, RenderingResponse, ResponsePayload, 9 | ResponsePayloadWithStatus, ResponsePdf, ResponseS3Upload, 10 | }; 11 | use crate::proto::status; 12 | use crate::proto::status::OperationStatus; 13 | use crate::s3::upload_to_s3; 14 | use crate::types::{IDExtension, InternalRequest, InternalResponse}; 15 | use config::Config; 16 | use log::{debug, error, info}; 17 | use lopdf::Document; 18 | use prost_wkt_types::Empty; 19 | use tokio::sync::mpsc; 20 | use tonic::{Request, Response, Status}; 21 | 22 | pub struct PDFServer { 23 | pub config: Config, 24 | pub renderer: mpsc::Sender, 25 | } 26 | 27 | #[tonic::async_trait] 28 | impl PdfRenderingService for PDFServer { 29 | async fn render( 30 | &self, 31 | request: Request, 32 | ) -> Result, Status> { 33 | let (tx, mut rx) = mpsc::channel::(32); 34 | 35 | let id = request.extensions().get::().unwrap(); 36 | 37 | debug!("[{}] Rendering request: {:?}", id.id, request.get_ref()); 38 | 39 | let data = match request.get_ref().clone().r#type.unwrap() { 40 | Type::Individual(req) => req.data.iter().map(|x| x.clone().data.unwrap()).collect(), 41 | Type::Combined(req) => req.data, 42 | }; 43 | 44 | match self 45 | .renderer 46 | .send(InternalRequest { 47 | response: tx, 48 | data: data.clone(), 49 | }) 50 | .await 51 | { 52 | Ok(_) => {} 53 | Err(err) => { 54 | error!("error sending rendering request: {}", err); 55 | } 56 | } 57 | 58 | let mut rendered = Vec::with_capacity(data.len()); 59 | 60 | for _ in data.iter() { 61 | rendered.push(rx.recv().await); 62 | } 63 | 64 | info!("[{}] Rendering success", id.id); 65 | 66 | let output = match request.get_ref().clone().r#type.unwrap() { 67 | Type::Individual(req) => Ok(Self::individual_response( 68 | req, 69 | self.config.clone(), 70 | rendered, 71 | request.get_ref().clone().subject, 72 | ) 73 | .await), 74 | Type::Combined(req) => Ok(Self::combined_response( 75 | req, 76 | self.config.clone(), 77 | rendered, 78 | request.get_ref().clone().subject, 79 | ) 80 | .await), 81 | }; 82 | 83 | return output; 84 | } 85 | 86 | async fn info(&self, _: Request) -> Result, Status> { 87 | let version = headless_chrome::Browser::default() 88 | .expect("failed opening browser") 89 | .get_version() 90 | .expect("failed fetching version"); 91 | Ok(Response::new(InfoResponse { 92 | chrome: Some(ChromeVersion { 93 | js_version: version.js_version, 94 | product: version.product, 95 | protocol_version: version.protocol_version, 96 | revision: version.revision, 97 | user_agent: version.user_agent, 98 | }), 99 | })) 100 | } 101 | } 102 | 103 | impl PDFServer { 104 | async fn individual_response( 105 | req: IndividualRequest, 106 | config: Config, 107 | rendered: Vec>, 108 | subject: Option, 109 | ) -> Response { 110 | let mut out = Vec::with_capacity(rendered.len()); 111 | 112 | for (i, opt) in rendered.iter().enumerate() { 113 | match opt { 114 | None => { 115 | out.push(ResponsePayloadWithStatus { 116 | status: Some(status::Status { 117 | id: None, 118 | code: Some(500), 119 | message: Some("unknown error".to_string()), 120 | }), 121 | payload: None, 122 | }); 123 | } 124 | Some(response) => match response { 125 | Err(err) => { 126 | out.push(ResponsePayloadWithStatus { 127 | status: Some(status::Status { 128 | id: None, 129 | code: Some(400), 130 | message: Some(format!("rendering failed: {}", err)), 131 | }), 132 | payload: None, 133 | }); 134 | } 135 | Ok(data) => { 136 | let output = req.data[i].output.clone(); 137 | 138 | let mut out_data = data.clone(); 139 | if output.is_some() { 140 | out_data = add_pdf_metadata( 141 | out_data.clone(), 142 | output.clone().unwrap().meta_data, 143 | ) 144 | .expect("failed adding meta"); 145 | } 146 | 147 | out.push( 148 | Self::construct_response( 149 | config.clone(), 150 | out_data.clone(), 151 | output, 152 | subject.clone(), 153 | ) 154 | .await, 155 | ) 156 | } 157 | }, 158 | } 159 | } 160 | 161 | Response::new(RenderingResponse { 162 | operation_status: Some(OperationStatus { 163 | code: Some(200), 164 | message: Some("success".to_string()), 165 | }), 166 | response: Some(rendering_response::Response::Individual( 167 | IndividualResponse { 168 | rendering_response: out, 169 | }, 170 | )), 171 | }) 172 | } 173 | 174 | async fn combined_response( 175 | req: CombinedRequest, 176 | config: Config, 177 | rendered: Vec>, 178 | subject: Option, 179 | ) -> Response { 180 | let mut merged = merge_pdfs( 181 | rendered 182 | .iter() 183 | .map(|x| match x { 184 | None => { 185 | panic!("missing pdf") 186 | } 187 | Some(r) => match r { 188 | Err(err) => { 189 | panic!("missing pdf: {}", err) 190 | } 191 | Ok(response) => Document::load_mem(response).expect("failed parsing PDF"), 192 | }, 193 | }) 194 | .collect(), 195 | ) 196 | .expect("render failed"); 197 | 198 | if req.output.is_some() { 199 | merged = add_pdf_metadata(merged, req.output.clone().unwrap().meta_data) 200 | .expect("failed adding meta"); 201 | } 202 | 203 | Response::new(RenderingResponse { 204 | operation_status: Some(OperationStatus { 205 | code: Some(200), 206 | message: Some("success".to_string()), 207 | }), 208 | response: Some(rendering_response::Response::Combined( 209 | Self::construct_response( 210 | config.clone(), 211 | merged.clone(), 212 | req.output.clone(), 213 | subject, 214 | ) 215 | .await, 216 | )), 217 | }) 218 | } 219 | 220 | async fn construct_response( 221 | config: Config, 222 | data: Vec, 223 | output: Option, 224 | subject: Option, 225 | ) -> ResponsePayloadWithStatus { 226 | if output.clone().is_some() && output.clone().unwrap().upload_options.is_some() { 227 | let output_clone = output.clone().unwrap(); 228 | let upload_options = output_clone.upload_options.clone().unwrap(); 229 | let bucket = upload_options.bucket.clone().unwrap(); 230 | let key = upload_options.key.clone().unwrap(); 231 | 232 | match upload_to_s3( 233 | config.clone(), 234 | upload_options, 235 | data.clone(), 236 | subject, 237 | ) 238 | .await 239 | { 240 | Ok(_) => { 241 | ResponsePayloadWithStatus { 242 | status: Some(status::Status { 243 | id: None, 244 | code: Some(200), 245 | message: Some("success".to_string()), 246 | }), 247 | payload: Some(ResponsePayload { 248 | response: Some(response_payload::Response::UploadResult( 249 | ResponseS3Upload { 250 | length: data.len() as i32, 251 | url: format!("/bucket-{}/key-{}", bucket, key), 252 | }, 253 | )), 254 | }), 255 | } 256 | }, 257 | Err(err) => ResponsePayloadWithStatus { 258 | status: Some(status::Status { 259 | id: None, 260 | code: Some(400), 261 | message: Some(format!("render failed: {}", err)), 262 | }), 263 | payload: None, 264 | }, 265 | } 266 | } else { 267 | ResponsePayloadWithStatus { 268 | status: Some(status::Status { 269 | id: None, 270 | code: Some(200), 271 | message: Some("success".to_string()), 272 | }), 273 | payload: Some(ResponsePayload { 274 | response: Some(response_payload::Response::Pdf(ResponsePdf { 275 | data: data.clone(), 276 | })), 277 | }), 278 | } 279 | } 280 | } 281 | } 282 | -------------------------------------------------------------------------------- /src/renderer.rs: -------------------------------------------------------------------------------- 1 | use crate::proto::pdf_rendering::pdf_options::PaperFormat; 2 | use crate::proto::pdf_rendering::render_source::Content; 3 | use crate::proto::pdf_rendering::{RenderData, RenderOptions}; 4 | use crate::types::{InternalRequest, RendererResponse}; 5 | use anyhow::{anyhow, Result}; 6 | use headless_chrome::browser::default_executable; 7 | use headless_chrome::protocol::cdp::types::Event; 8 | use headless_chrome::types::PrintToPdfOptions; 9 | use headless_chrome::{Browser, LaunchOptionsBuilder, Tab}; 10 | use std::error::Error; 11 | use std::io; 12 | use std::sync::{Arc, Condvar, Mutex}; 13 | use std::time::Duration; 14 | use std::thread::sleep; 15 | use tokio::sync::mpsc; 16 | use tokio::sync::mpsc::Receiver; 17 | 18 | impl PaperFormat { 19 | pub fn width(&self) -> f32 { 20 | match self { 21 | PaperFormat::A0 => 33.1, 22 | PaperFormat::A1 => 23.4, 23 | PaperFormat::A2 => 16.5, 24 | PaperFormat::A3 => 11.7, 25 | PaperFormat::A4 => 8.27, 26 | PaperFormat::A5 => 5.83, 27 | PaperFormat::A6 => 4.13, 28 | PaperFormat::A7 => 2.91, 29 | PaperFormat::Letter => 8.5, 30 | PaperFormat::Legal => 8.5, 31 | PaperFormat::Tabloid => 11.0, 32 | } 33 | } 34 | 35 | pub fn height(&self) -> f32 { 36 | match self { 37 | PaperFormat::A0 => 46.8, 38 | PaperFormat::A1 => 33.1, 39 | PaperFormat::A2 => 23.4, 40 | PaperFormat::A3 => 16.5, 41 | PaperFormat::A4 => 11.69, 42 | PaperFormat::A5 => 8.27, 43 | PaperFormat::A6 => 5.83, 44 | PaperFormat::A7 => 4.13, 45 | PaperFormat::Letter => 11.0, 46 | PaperFormat::Legal => 14.0, 47 | PaperFormat::Tabloid => 17.0, 48 | } 49 | } 50 | } 51 | 52 | pub fn content_to_pdf( 53 | tab: Arc, 54 | content: Content, 55 | options: Option, 56 | ) -> Result, Box> { 57 | let mut landscape = None; 58 | let mut display_header_footer = None; 59 | let mut print_background = Some(true); 60 | let mut format = Some(PaperFormat::A4); 61 | let mut scale = None; 62 | let mut paper_width = None; 63 | let mut paper_height = None; 64 | let mut margin_top = Some(0.0); 65 | let mut margin_bottom = Some(0.0); 66 | let mut margin_left = Some(0.0); 67 | let mut margin_right = Some(0.0); 68 | let mut page_ranges = None; 69 | let mut ignore_invalid_page_ranges = None; 70 | let mut header_template = None; 71 | let mut footer_template = None; 72 | let mut prefer_css_page_size = Some(true); 73 | let mut wait_after_load_time = Some(0); 74 | 75 | match options { 76 | None => {} 77 | Some(opt) => { 78 | wait_after_load_time = opt.wait_after_load_time.or(wait_after_load_time); 79 | match opt.puppeteer_options { 80 | None => {} 81 | Some(puppeteer) => match puppeteer.pdf_options { 82 | None => {} 83 | Some(pdf) => { 84 | paper_width = pdf.paper_width.or(paper_width); 85 | paper_height = pdf.paper_height.or(paper_height); 86 | 87 | landscape = pdf.landscape.or(landscape); 88 | display_header_footer = pdf.display_header_footer.or(display_header_footer); 89 | print_background = pdf.print_background.or(print_background); 90 | format = pdf 91 | .format 92 | .map(|t| PaperFormat::try_from(t).unwrap()) 93 | .or(format); 94 | scale = pdf.scale.or(scale); 95 | paper_width = pdf.paper_width.or(paper_width); 96 | paper_height = pdf.paper_height.or(paper_height); 97 | margin_top = pdf.margin_top.or(margin_top); 98 | margin_bottom = pdf.margin_bottom.or(margin_bottom); 99 | margin_left = pdf.margin_left.or(margin_left); 100 | margin_right = pdf.margin_right.or(margin_right); 101 | page_ranges = pdf.page_ranges.or(page_ranges); 102 | ignore_invalid_page_ranges = pdf 103 | .ignore_invalid_page_ranges 104 | .or(ignore_invalid_page_ranges); 105 | header_template = pdf.header_template.or(header_template); 106 | footer_template = pdf.footer_template.or(footer_template); 107 | prefer_css_page_size = pdf.prefer_css_page_size.or(prefer_css_page_size); 108 | } 109 | }, 110 | }; 111 | }, 112 | } 113 | 114 | paper_width = paper_width.or(Some(format.unwrap().width())); 115 | paper_height = paper_height.or(Some(format.unwrap().height())); 116 | 117 | let pdf_options = PrintToPdfOptions { 118 | paper_width: paper_width.map(|t| t as f64), 119 | paper_height: paper_height.map(|t| t as f64), 120 | margin_top: margin_top.map(|t| t as f64), 121 | margin_right: margin_right.map(|t| t as f64), 122 | margin_bottom: margin_bottom.map(|t| t as f64), 123 | margin_left: margin_left.map(|t| t as f64), 124 | scale: scale.map(|t| t as f64), 125 | landscape, 126 | prefer_css_page_size, 127 | print_background, 128 | page_ranges, 129 | ignore_invalid_page_ranges, 130 | header_template, 131 | display_header_footer, 132 | footer_template, 133 | ..Default::default() 134 | }; 135 | 136 | let pdf = match content { 137 | Content::Url(url) => { 138 | // Synchronization primitives 139 | let pair = Arc::new((Mutex::new(false), Condvar::new())); 140 | let pair_clone = pair.clone(); 141 | 142 | let sync_event = Arc::new(move |event: &Event| match event { 143 | Event::PageLifecycleEvent(lifecycle) => { 144 | if lifecycle.params.name == "networkidle0" { 145 | let (lock, cvar) = &*pair_clone; 146 | let mut fired = lock.lock().unwrap(); 147 | *fired = true; 148 | cvar.notify_one(); 149 | } 150 | } 151 | _ => {} 152 | }); 153 | 154 | tab.add_event_listener(sync_event).unwrap(); 155 | 156 | tab.navigate_to(url.as_str())? 157 | .wait_until_navigated().ok(); 158 | 159 | // Wait for networkidle0 event 160 | let (lock, cvar) = &*pair; 161 | let mut fired = lock.lock().unwrap(); 162 | while !*fired { 163 | fired = cvar.wait(fired).unwrap(); 164 | } 165 | 166 | // Additional wait after event 167 | sleep(Duration::from_millis(wait_after_load_time.unwrap())); 168 | 169 | // Now safe to print to PDF 170 | tab.print_to_pdf(Some(pdf_options))? 171 | }, 172 | Content::Html(data) => { 173 | let server = Arc::new(tiny_http::Server::http("127.0.0.1:0").unwrap()); 174 | 175 | let response = tiny_http::Response::new( 176 | 200.into(), 177 | vec![ 178 | tiny_http::Header::from_bytes(&b"Content-Type"[..], &b"text/html"[..]).unwrap(), 179 | ], 180 | io::Cursor::new(data.clone()), 181 | Some(data.clone().len()), 182 | None, 183 | ); 184 | 185 | let srv = server.clone(); 186 | std::thread::spawn(move || { 187 | let request = match srv.recv() { 188 | Ok(rq) => rq, 189 | Err(e) => { 190 | panic!("error: {}", e); 191 | } 192 | }; 193 | 194 | let _ = request.respond(response); 195 | 196 | drop(srv) 197 | }); 198 | 199 | // Synchronization primitives 200 | let pair = Arc::new((Mutex::new(false), Condvar::new())); 201 | let pair_clone = pair.clone(); 202 | 203 | let sync_event = Arc::new(move |event: &Event| match event { 204 | Event::PageLifecycleEvent(lifecycle) => { 205 | if lifecycle.params.name == "DOMContentLoaded" { 206 | let (lock, cvar) = &*pair_clone; 207 | let mut fired = lock.lock().unwrap(); 208 | *fired = true; 209 | cvar.notify_one(); 210 | } 211 | } 212 | _ => {} 213 | }); 214 | 215 | tab.add_event_listener(sync_event).unwrap(); 216 | 217 | tab.navigate_to( 218 | format!( 219 | "http://127.0.0.1:{}", 220 | server.server_addr().to_ip().unwrap().port() 221 | ) 222 | .as_str(), 223 | )? 224 | .wait_until_navigated().ok(); 225 | 226 | // Wait for DOMContentLoaded event 227 | let (lock, cvar) = &*pair; 228 | let mut fired = lock.lock().unwrap(); 229 | while !*fired { 230 | fired = cvar.wait(fired).unwrap(); 231 | } 232 | 233 | // Additional wait after event 234 | sleep(Duration::from_millis(wait_after_load_time.unwrap())); 235 | 236 | // Now safe to print to PDF 237 | tab.print_to_pdf(Some(pdf_options))? 238 | } 239 | }; 240 | 241 | tab.close(true)?; 242 | Ok(pdf) 243 | } 244 | 245 | pub async fn start_renderer(mut rx: Receiver) -> Result<(), Box> { 246 | let options = LaunchOptionsBuilder::default() 247 | .path(Some(default_executable().map_err(|e| anyhow!(e))?)) 248 | .sandbox(false) 249 | .idle_browser_timeout(Duration::MAX) 250 | .build() 251 | .unwrap(); 252 | 253 | tokio::spawn(async move { 254 | let browser = Arc::new(Browser::new(options).expect("failed instantiating browser")); 255 | 256 | while let Some(cmd) = rx.recv().await { 257 | handle_cmd(browser.clone(), cmd); 258 | } 259 | }); 260 | 261 | Ok(()) 262 | } 263 | 264 | pub fn handle_cmd(browser: Arc, cmd: InternalRequest) { 265 | tokio::spawn(async move { 266 | let (tx, mut rx) = mpsc::channel::(32); 267 | 268 | let data = cmd.data; 269 | for (i, req) in data.iter().enumerate() { 270 | let tab = browser.new_tab().expect("failed opening new browser tab"); 271 | handle_req(tab, req, tx.clone(), i); 272 | } 273 | 274 | let mut rendered = Vec::with_capacity(data.clone().len()); 275 | 276 | for _ in data.clone().iter() { 277 | rendered.push(rx.recv().await.unwrap()); 278 | } 279 | 280 | rendered.sort_by_key(|r| r.order); 281 | 282 | for out in rendered { 283 | let _ = cmd.response.send(out.resp).await; 284 | } 285 | }); 286 | } 287 | 288 | pub fn handle_req( 289 | tab: Arc, 290 | req: &RenderData, 291 | tx: mpsc::Sender, 292 | order: usize, 293 | ) { 294 | let req2 = req.clone(); 295 | tokio::spawn(async move { 296 | let content = req2 297 | .clone() 298 | .source 299 | .expect("no source") 300 | .content 301 | .expect("no content"); 302 | let options = req2.clone().options; 303 | let out = content_to_pdf(tab, content, options.clone()); 304 | let _ = tx.clone().send(RendererResponse { resp: out, order }).await; 305 | }); 306 | } 307 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.25.1" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.1" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" 19 | 20 | [[package]] 21 | name = "aes" 22 | version = "0.8.4" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" 25 | dependencies = [ 26 | "cfg-if", 27 | "cipher", 28 | "cpufeatures", 29 | ] 30 | 31 | [[package]] 32 | name = "aho-corasick" 33 | version = "1.1.3" 34 | source = "registry+https://github.com/rust-lang/crates.io-index" 35 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 36 | dependencies = [ 37 | "memchr", 38 | ] 39 | 40 | [[package]] 41 | name = "allocator-api2" 42 | version = "0.2.21" 43 | source = "registry+https://github.com/rust-lang/crates.io-index" 44 | checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 45 | 46 | [[package]] 47 | name = "android_system_properties" 48 | version = "0.1.5" 49 | source = "registry+https://github.com/rust-lang/crates.io-index" 50 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 51 | dependencies = [ 52 | "libc", 53 | ] 54 | 55 | [[package]] 56 | name = "anstream" 57 | version = "0.6.21" 58 | source = "registry+https://github.com/rust-lang/crates.io-index" 59 | checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" 60 | dependencies = [ 61 | "anstyle", 62 | "anstyle-parse", 63 | "anstyle-query", 64 | "anstyle-wincon", 65 | "colorchoice", 66 | "is_terminal_polyfill", 67 | "utf8parse", 68 | ] 69 | 70 | [[package]] 71 | name = "anstyle" 72 | version = "1.0.13" 73 | source = "registry+https://github.com/rust-lang/crates.io-index" 74 | checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" 75 | 76 | [[package]] 77 | name = "anstyle-parse" 78 | version = "0.2.7" 79 | source = "registry+https://github.com/rust-lang/crates.io-index" 80 | checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" 81 | dependencies = [ 82 | "utf8parse", 83 | ] 84 | 85 | [[package]] 86 | name = "anstyle-query" 87 | version = "1.1.4" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "9e231f6134f61b71076a3eab506c379d4f36122f2af15a9ff04415ea4c3339e2" 90 | dependencies = [ 91 | "windows-sys 0.60.2", 92 | ] 93 | 94 | [[package]] 95 | name = "anstyle-wincon" 96 | version = "3.0.10" 97 | source = "registry+https://github.com/rust-lang/crates.io-index" 98 | checksum = "3e0633414522a32ffaac8ac6cc8f748e090c5717661fddeea04219e2344f5f2a" 99 | dependencies = [ 100 | "anstyle", 101 | "once_cell_polyfill", 102 | "windows-sys 0.60.2", 103 | ] 104 | 105 | [[package]] 106 | name = "anyhow" 107 | version = "1.0.100" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" 110 | 111 | [[package]] 112 | name = "arraydeque" 113 | version = "0.5.1" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" 116 | 117 | [[package]] 118 | name = "ascii" 119 | version = "1.1.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" 122 | 123 | [[package]] 124 | name = "async-trait" 125 | version = "0.1.89" 126 | source = "registry+https://github.com/rust-lang/crates.io-index" 127 | checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" 128 | dependencies = [ 129 | "proc-macro2", 130 | "quote", 131 | "syn", 132 | ] 133 | 134 | [[package]] 135 | name = "atomic-waker" 136 | version = "1.1.2" 137 | source = "registry+https://github.com/rust-lang/crates.io-index" 138 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 139 | 140 | [[package]] 141 | name = "auto_generate_cdp" 142 | version = "0.4.5" 143 | source = "registry+https://github.com/rust-lang/crates.io-index" 144 | checksum = "d6e1961a0d5d77969057eba90d448e610d3c439024d135d9dbd98e33ec973520" 145 | dependencies = [ 146 | "convert_case 0.4.0", 147 | "proc-macro2", 148 | "quote", 149 | "serde", 150 | "serde_json", 151 | "ureq", 152 | ] 153 | 154 | [[package]] 155 | name = "autocfg" 156 | version = "1.5.0" 157 | source = "registry+https://github.com/rust-lang/crates.io-index" 158 | checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" 159 | 160 | [[package]] 161 | name = "aws-credential-types" 162 | version = "1.2.8" 163 | source = "registry+https://github.com/rust-lang/crates.io-index" 164 | checksum = "faf26925f4a5b59eb76722b63c2892b1d70d06fa053c72e4a100ec308c1d47bc" 165 | dependencies = [ 166 | "aws-smithy-async", 167 | "aws-smithy-runtime-api", 168 | "aws-smithy-types", 169 | "zeroize", 170 | ] 171 | 172 | [[package]] 173 | name = "aws-lc-rs" 174 | version = "1.14.1" 175 | source = "registry+https://github.com/rust-lang/crates.io-index" 176 | checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" 177 | dependencies = [ 178 | "aws-lc-sys", 179 | "zeroize", 180 | ] 181 | 182 | [[package]] 183 | name = "aws-lc-sys" 184 | version = "0.32.2" 185 | source = "registry+https://github.com/rust-lang/crates.io-index" 186 | checksum = "a2b715a6010afb9e457ca2b7c9d2b9c344baa8baed7b38dc476034c171b32575" 187 | dependencies = [ 188 | "bindgen", 189 | "cc", 190 | "cmake", 191 | "dunce", 192 | "fs_extra", 193 | "libloading", 194 | ] 195 | 196 | [[package]] 197 | name = "aws-runtime" 198 | version = "1.5.12" 199 | source = "registry+https://github.com/rust-lang/crates.io-index" 200 | checksum = "bfa006bb32360ed90ac51203feafb9d02e3d21046e1fd3a450a404b90ea73e5d" 201 | dependencies = [ 202 | "aws-credential-types", 203 | "aws-sigv4", 204 | "aws-smithy-async", 205 | "aws-smithy-eventstream", 206 | "aws-smithy-http", 207 | "aws-smithy-runtime", 208 | "aws-smithy-runtime-api", 209 | "aws-smithy-types", 210 | "aws-types", 211 | "bytes", 212 | "fastrand", 213 | "http 0.2.12", 214 | "http-body 0.4.6", 215 | "percent-encoding", 216 | "pin-project-lite", 217 | "tracing", 218 | "uuid", 219 | ] 220 | 221 | [[package]] 222 | name = "aws-sdk-config" 223 | version = "1.91.0" 224 | source = "registry+https://github.com/rust-lang/crates.io-index" 225 | checksum = "a7e28d134bf69173fe4d5e69360d2ae5e2dde826d575a4c62f18a4ef2feac5fd" 226 | dependencies = [ 227 | "aws-credential-types", 228 | "aws-runtime", 229 | "aws-smithy-async", 230 | "aws-smithy-http", 231 | "aws-smithy-json", 232 | "aws-smithy-runtime", 233 | "aws-smithy-runtime-api", 234 | "aws-smithy-types", 235 | "aws-types", 236 | "bytes", 237 | "fastrand", 238 | "http 0.2.12", 239 | "regex-lite", 240 | "tracing", 241 | ] 242 | 243 | [[package]] 244 | name = "aws-sdk-s3" 245 | version = "1.108.0" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "200be4aed61e3c0669f7268bacb768f283f1c32a7014ce57225e1160be2f6ccb" 248 | dependencies = [ 249 | "aws-credential-types", 250 | "aws-runtime", 251 | "aws-sigv4", 252 | "aws-smithy-async", 253 | "aws-smithy-checksums", 254 | "aws-smithy-eventstream", 255 | "aws-smithy-http", 256 | "aws-smithy-json", 257 | "aws-smithy-runtime", 258 | "aws-smithy-runtime-api", 259 | "aws-smithy-types", 260 | "aws-smithy-xml", 261 | "aws-types", 262 | "bytes", 263 | "fastrand", 264 | "hex", 265 | "hmac", 266 | "http 0.2.12", 267 | "http 1.3.1", 268 | "http-body 0.4.6", 269 | "lru", 270 | "percent-encoding", 271 | "regex-lite", 272 | "sha2", 273 | "tracing", 274 | "url", 275 | ] 276 | 277 | [[package]] 278 | name = "aws-sigv4" 279 | version = "1.3.5" 280 | source = "registry+https://github.com/rust-lang/crates.io-index" 281 | checksum = "bffc03068fbb9c8dd5ce1c6fb240678a5cffb86fb2b7b1985c999c4b83c8df68" 282 | dependencies = [ 283 | "aws-credential-types", 284 | "aws-smithy-eventstream", 285 | "aws-smithy-http", 286 | "aws-smithy-runtime-api", 287 | "aws-smithy-types", 288 | "bytes", 289 | "crypto-bigint 0.5.5", 290 | "form_urlencoded", 291 | "hex", 292 | "hmac", 293 | "http 0.2.12", 294 | "http 1.3.1", 295 | "p256", 296 | "percent-encoding", 297 | "ring", 298 | "sha2", 299 | "subtle", 300 | "time", 301 | "tracing", 302 | "zeroize", 303 | ] 304 | 305 | [[package]] 306 | name = "aws-smithy-async" 307 | version = "1.2.6" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "127fcfad33b7dfc531141fda7e1c402ac65f88aca5511a4d31e2e3d2cd01ce9c" 310 | dependencies = [ 311 | "futures-util", 312 | "pin-project-lite", 313 | "tokio", 314 | ] 315 | 316 | [[package]] 317 | name = "aws-smithy-checksums" 318 | version = "0.63.9" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "165d8583d8d906e2fb5511d29201d447cc710864f075debcdd9c31c265412806" 321 | dependencies = [ 322 | "aws-smithy-http", 323 | "aws-smithy-types", 324 | "bytes", 325 | "crc-fast", 326 | "hex", 327 | "http 0.2.12", 328 | "http-body 0.4.6", 329 | "md-5", 330 | "pin-project-lite", 331 | "sha1", 332 | "sha2", 333 | "tracing", 334 | ] 335 | 336 | [[package]] 337 | name = "aws-smithy-eventstream" 338 | version = "0.60.12" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "9656b85088f8d9dc7ad40f9a6c7228e1e8447cdf4b046c87e152e0805dea02fa" 341 | dependencies = [ 342 | "aws-smithy-types", 343 | "bytes", 344 | "crc32fast", 345 | ] 346 | 347 | [[package]] 348 | name = "aws-smithy-http" 349 | version = "0.62.4" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "3feafd437c763db26aa04e0cc7591185d0961e64c61885bece0fb9d50ceac671" 352 | dependencies = [ 353 | "aws-smithy-eventstream", 354 | "aws-smithy-runtime-api", 355 | "aws-smithy-types", 356 | "bytes", 357 | "bytes-utils", 358 | "futures-core", 359 | "http 0.2.12", 360 | "http 1.3.1", 361 | "http-body 0.4.6", 362 | "percent-encoding", 363 | "pin-project-lite", 364 | "pin-utils", 365 | "tracing", 366 | ] 367 | 368 | [[package]] 369 | name = "aws-smithy-http-client" 370 | version = "1.1.3" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "1053b5e587e6fa40ce5a79ea27957b04ba660baa02b28b7436f64850152234f1" 373 | dependencies = [ 374 | "aws-smithy-async", 375 | "aws-smithy-runtime-api", 376 | "aws-smithy-types", 377 | "h2 0.3.27", 378 | "h2 0.4.12", 379 | "http 0.2.12", 380 | "http 1.3.1", 381 | "http-body 0.4.6", 382 | "hyper 0.14.32", 383 | "hyper 1.7.0", 384 | "hyper-rustls 0.24.2", 385 | "hyper-rustls 0.27.7", 386 | "hyper-util", 387 | "pin-project-lite", 388 | "rustls 0.21.12", 389 | "rustls 0.23.32", 390 | "rustls-native-certs 0.8.1", 391 | "rustls-pki-types", 392 | "tokio", 393 | "tokio-rustls 0.26.4", 394 | "tower", 395 | "tracing", 396 | ] 397 | 398 | [[package]] 399 | name = "aws-smithy-json" 400 | version = "0.61.6" 401 | source = "registry+https://github.com/rust-lang/crates.io-index" 402 | checksum = "cff418fc8ec5cadf8173b10125f05c2e7e1d46771406187b2c878557d4503390" 403 | dependencies = [ 404 | "aws-smithy-types", 405 | ] 406 | 407 | [[package]] 408 | name = "aws-smithy-observability" 409 | version = "0.1.4" 410 | source = "registry+https://github.com/rust-lang/crates.io-index" 411 | checksum = "2d1881b1ea6d313f9890710d65c158bdab6fb08c91ea825f74c1c8c357baf4cc" 412 | dependencies = [ 413 | "aws-smithy-runtime-api", 414 | ] 415 | 416 | [[package]] 417 | name = "aws-smithy-runtime" 418 | version = "1.9.3" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "40ab99739082da5347660c556689256438defae3bcefd66c52b095905730e404" 421 | dependencies = [ 422 | "aws-smithy-async", 423 | "aws-smithy-http", 424 | "aws-smithy-http-client", 425 | "aws-smithy-observability", 426 | "aws-smithy-runtime-api", 427 | "aws-smithy-types", 428 | "bytes", 429 | "fastrand", 430 | "http 0.2.12", 431 | "http 1.3.1", 432 | "http-body 0.4.6", 433 | "http-body 1.0.1", 434 | "pin-project-lite", 435 | "pin-utils", 436 | "tokio", 437 | "tracing", 438 | ] 439 | 440 | [[package]] 441 | name = "aws-smithy-runtime-api" 442 | version = "1.9.1" 443 | source = "registry+https://github.com/rust-lang/crates.io-index" 444 | checksum = "3683c5b152d2ad753607179ed71988e8cfd52964443b4f74fd8e552d0bbfeb46" 445 | dependencies = [ 446 | "aws-smithy-async", 447 | "aws-smithy-types", 448 | "bytes", 449 | "http 0.2.12", 450 | "http 1.3.1", 451 | "pin-project-lite", 452 | "tokio", 453 | "tracing", 454 | "zeroize", 455 | ] 456 | 457 | [[package]] 458 | name = "aws-smithy-types" 459 | version = "1.3.3" 460 | source = "registry+https://github.com/rust-lang/crates.io-index" 461 | checksum = "9f5b3a7486f6690ba25952cabf1e7d75e34d69eaff5081904a47bc79074d6457" 462 | dependencies = [ 463 | "base64-simd", 464 | "bytes", 465 | "bytes-utils", 466 | "futures-core", 467 | "http 0.2.12", 468 | "http 1.3.1", 469 | "http-body 0.4.6", 470 | "http-body 1.0.1", 471 | "http-body-util", 472 | "itoa", 473 | "num-integer", 474 | "pin-project-lite", 475 | "pin-utils", 476 | "ryu", 477 | "serde", 478 | "time", 479 | "tokio", 480 | "tokio-util", 481 | ] 482 | 483 | [[package]] 484 | name = "aws-smithy-xml" 485 | version = "0.60.11" 486 | source = "registry+https://github.com/rust-lang/crates.io-index" 487 | checksum = "e9c34127e8c624bc2999f3b657e749c1393bedc9cd97b92a804db8ced4d2e163" 488 | dependencies = [ 489 | "xmlparser", 490 | ] 491 | 492 | [[package]] 493 | name = "aws-types" 494 | version = "1.3.9" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "e2fd329bf0e901ff3f60425691410c69094dc2a1f34b331f37bfc4e9ac1565a1" 497 | dependencies = [ 498 | "aws-credential-types", 499 | "aws-smithy-async", 500 | "aws-smithy-runtime-api", 501 | "aws-smithy-types", 502 | "rustc_version", 503 | "tracing", 504 | ] 505 | 506 | [[package]] 507 | name = "axum" 508 | version = "0.8.6" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "8a18ed336352031311f4e0b4dd2ff392d4fbb370777c9d18d7fc9d7359f73871" 511 | dependencies = [ 512 | "axum-core", 513 | "bytes", 514 | "futures-util", 515 | "http 1.3.1", 516 | "http-body 1.0.1", 517 | "http-body-util", 518 | "itoa", 519 | "matchit", 520 | "memchr", 521 | "mime", 522 | "percent-encoding", 523 | "pin-project-lite", 524 | "serde_core", 525 | "sync_wrapper", 526 | "tower", 527 | "tower-layer", 528 | "tower-service", 529 | ] 530 | 531 | [[package]] 532 | name = "axum-core" 533 | version = "0.5.5" 534 | source = "registry+https://github.com/rust-lang/crates.io-index" 535 | checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" 536 | dependencies = [ 537 | "bytes", 538 | "futures-core", 539 | "http 1.3.1", 540 | "http-body 1.0.1", 541 | "http-body-util", 542 | "mime", 543 | "pin-project-lite", 544 | "sync_wrapper", 545 | "tower-layer", 546 | "tower-service", 547 | ] 548 | 549 | [[package]] 550 | name = "backtrace" 551 | version = "0.3.76" 552 | source = "registry+https://github.com/rust-lang/crates.io-index" 553 | checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" 554 | dependencies = [ 555 | "addr2line", 556 | "cfg-if", 557 | "libc", 558 | "miniz_oxide", 559 | "object", 560 | "rustc-demangle", 561 | "windows-link 0.2.1", 562 | ] 563 | 564 | [[package]] 565 | name = "base16ct" 566 | version = "0.1.1" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" 569 | 570 | [[package]] 571 | name = "base64" 572 | version = "0.21.7" 573 | source = "registry+https://github.com/rust-lang/crates.io-index" 574 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 575 | 576 | [[package]] 577 | name = "base64" 578 | version = "0.22.1" 579 | source = "registry+https://github.com/rust-lang/crates.io-index" 580 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 581 | 582 | [[package]] 583 | name = "base64-simd" 584 | version = "0.8.0" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" 587 | dependencies = [ 588 | "outref", 589 | "vsimd", 590 | ] 591 | 592 | [[package]] 593 | name = "base64ct" 594 | version = "1.8.0" 595 | source = "registry+https://github.com/rust-lang/crates.io-index" 596 | checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" 597 | 598 | [[package]] 599 | name = "bindgen" 600 | version = "0.72.1" 601 | source = "registry+https://github.com/rust-lang/crates.io-index" 602 | checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" 603 | dependencies = [ 604 | "bitflags", 605 | "cexpr", 606 | "clang-sys", 607 | "itertools 0.13.0", 608 | "log", 609 | "prettyplease", 610 | "proc-macro2", 611 | "quote", 612 | "regex", 613 | "rustc-hash", 614 | "shlex", 615 | "syn", 616 | ] 617 | 618 | [[package]] 619 | name = "bitflags" 620 | version = "2.9.4" 621 | source = "registry+https://github.com/rust-lang/crates.io-index" 622 | checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" 623 | dependencies = [ 624 | "serde", 625 | ] 626 | 627 | [[package]] 628 | name = "block-buffer" 629 | version = "0.10.4" 630 | source = "registry+https://github.com/rust-lang/crates.io-index" 631 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 632 | dependencies = [ 633 | "generic-array", 634 | ] 635 | 636 | [[package]] 637 | name = "block-padding" 638 | version = "0.3.3" 639 | source = "registry+https://github.com/rust-lang/crates.io-index" 640 | checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" 641 | dependencies = [ 642 | "generic-array", 643 | ] 644 | 645 | [[package]] 646 | name = "bumpalo" 647 | version = "3.19.0" 648 | source = "registry+https://github.com/rust-lang/crates.io-index" 649 | checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" 650 | 651 | [[package]] 652 | name = "bytecount" 653 | version = "0.6.9" 654 | source = "registry+https://github.com/rust-lang/crates.io-index" 655 | checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" 656 | 657 | [[package]] 658 | name = "byteorder" 659 | version = "1.5.0" 660 | source = "registry+https://github.com/rust-lang/crates.io-index" 661 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 662 | 663 | [[package]] 664 | name = "bytes" 665 | version = "1.10.1" 666 | source = "registry+https://github.com/rust-lang/crates.io-index" 667 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 668 | 669 | [[package]] 670 | name = "bytes-utils" 671 | version = "0.1.4" 672 | source = "registry+https://github.com/rust-lang/crates.io-index" 673 | checksum = "7dafe3a8757b027e2be6e4e5601ed563c55989fcf1546e933c66c8eb3a058d35" 674 | dependencies = [ 675 | "bytes", 676 | "either", 677 | ] 678 | 679 | [[package]] 680 | name = "cbc" 681 | version = "0.1.2" 682 | source = "registry+https://github.com/rust-lang/crates.io-index" 683 | checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" 684 | dependencies = [ 685 | "cipher", 686 | ] 687 | 688 | [[package]] 689 | name = "cc" 690 | version = "1.2.40" 691 | source = "registry+https://github.com/rust-lang/crates.io-index" 692 | checksum = "e1d05d92f4b1fd76aad469d46cdd858ca761576082cd37df81416691e50199fb" 693 | dependencies = [ 694 | "find-msvc-tools", 695 | "jobserver", 696 | "libc", 697 | "shlex", 698 | ] 699 | 700 | [[package]] 701 | name = "cexpr" 702 | version = "0.6.0" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" 705 | dependencies = [ 706 | "nom 7.1.3", 707 | ] 708 | 709 | [[package]] 710 | name = "cfg-if" 711 | version = "1.0.3" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" 714 | 715 | [[package]] 716 | name = "chrono" 717 | version = "0.4.42" 718 | source = "registry+https://github.com/rust-lang/crates.io-index" 719 | checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" 720 | dependencies = [ 721 | "iana-time-zone", 722 | "num-traits", 723 | "serde", 724 | "windows-link 0.2.1", 725 | ] 726 | 727 | [[package]] 728 | name = "chunked_transfer" 729 | version = "1.5.0" 730 | source = "registry+https://github.com/rust-lang/crates.io-index" 731 | checksum = "6e4de3bc4ea267985becf712dc6d9eed8b04c953b3fcfb339ebc87acd9804901" 732 | 733 | [[package]] 734 | name = "cipher" 735 | version = "0.4.4" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" 738 | dependencies = [ 739 | "crypto-common", 740 | "inout", 741 | ] 742 | 743 | [[package]] 744 | name = "clang-sys" 745 | version = "1.8.1" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" 748 | dependencies = [ 749 | "glob", 750 | "libc", 751 | "libloading", 752 | ] 753 | 754 | [[package]] 755 | name = "cmake" 756 | version = "0.1.54" 757 | source = "registry+https://github.com/rust-lang/crates.io-index" 758 | checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" 759 | dependencies = [ 760 | "cc", 761 | ] 762 | 763 | [[package]] 764 | name = "colorchoice" 765 | version = "1.0.4" 766 | source = "registry+https://github.com/rust-lang/crates.io-index" 767 | checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" 768 | 769 | [[package]] 770 | name = "config" 771 | version = "0.15.18" 772 | source = "registry+https://github.com/rust-lang/crates.io-index" 773 | checksum = "180e549344080374f9b32ed41bf3b6b57885ff6a289367b3dbc10eea8acc1918" 774 | dependencies = [ 775 | "async-trait", 776 | "convert_case 0.6.0", 777 | "json5", 778 | "pathdiff", 779 | "ron", 780 | "rust-ini", 781 | "serde-untagged", 782 | "serde_core", 783 | "serde_json", 784 | "toml", 785 | "winnow", 786 | "yaml-rust2", 787 | ] 788 | 789 | [[package]] 790 | name = "const-oid" 791 | version = "0.9.6" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" 794 | 795 | [[package]] 796 | name = "const-random" 797 | version = "0.1.18" 798 | source = "registry+https://github.com/rust-lang/crates.io-index" 799 | checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" 800 | dependencies = [ 801 | "const-random-macro", 802 | ] 803 | 804 | [[package]] 805 | name = "const-random-macro" 806 | version = "0.1.16" 807 | source = "registry+https://github.com/rust-lang/crates.io-index" 808 | checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" 809 | dependencies = [ 810 | "getrandom 0.2.16", 811 | "once_cell", 812 | "tiny-keccak", 813 | ] 814 | 815 | [[package]] 816 | name = "convert_case" 817 | version = "0.4.0" 818 | source = "registry+https://github.com/rust-lang/crates.io-index" 819 | checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" 820 | 821 | [[package]] 822 | name = "convert_case" 823 | version = "0.6.0" 824 | source = "registry+https://github.com/rust-lang/crates.io-index" 825 | checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" 826 | dependencies = [ 827 | "unicode-segmentation", 828 | ] 829 | 830 | [[package]] 831 | name = "core-foundation" 832 | version = "0.9.4" 833 | source = "registry+https://github.com/rust-lang/crates.io-index" 834 | checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 835 | dependencies = [ 836 | "core-foundation-sys", 837 | "libc", 838 | ] 839 | 840 | [[package]] 841 | name = "core-foundation" 842 | version = "0.10.1" 843 | source = "registry+https://github.com/rust-lang/crates.io-index" 844 | checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" 845 | dependencies = [ 846 | "core-foundation-sys", 847 | "libc", 848 | ] 849 | 850 | [[package]] 851 | name = "core-foundation-sys" 852 | version = "0.8.7" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 855 | 856 | [[package]] 857 | name = "cpufeatures" 858 | version = "0.2.17" 859 | source = "registry+https://github.com/rust-lang/crates.io-index" 860 | checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" 861 | dependencies = [ 862 | "libc", 863 | ] 864 | 865 | [[package]] 866 | name = "crc" 867 | version = "3.3.0" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "9710d3b3739c2e349eb44fe848ad0b7c8cb1e42bd87ee49371df2f7acaf3e675" 870 | dependencies = [ 871 | "crc-catalog", 872 | ] 873 | 874 | [[package]] 875 | name = "crc-catalog" 876 | version = "2.4.0" 877 | source = "registry+https://github.com/rust-lang/crates.io-index" 878 | checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" 879 | 880 | [[package]] 881 | name = "crc-fast" 882 | version = "1.3.0" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "6bf62af4cc77d8fe1c22dde4e721d87f2f54056139d8c412e1366b740305f56f" 885 | dependencies = [ 886 | "crc", 887 | "digest", 888 | "libc", 889 | "rand", 890 | "regex", 891 | ] 892 | 893 | [[package]] 894 | name = "crc32fast" 895 | version = "1.5.0" 896 | source = "registry+https://github.com/rust-lang/crates.io-index" 897 | checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" 898 | dependencies = [ 899 | "cfg-if", 900 | ] 901 | 902 | [[package]] 903 | name = "crossbeam-deque" 904 | version = "0.8.6" 905 | source = "registry+https://github.com/rust-lang/crates.io-index" 906 | checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" 907 | dependencies = [ 908 | "crossbeam-epoch", 909 | "crossbeam-utils", 910 | ] 911 | 912 | [[package]] 913 | name = "crossbeam-epoch" 914 | version = "0.9.18" 915 | source = "registry+https://github.com/rust-lang/crates.io-index" 916 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 917 | dependencies = [ 918 | "crossbeam-utils", 919 | ] 920 | 921 | [[package]] 922 | name = "crossbeam-utils" 923 | version = "0.8.21" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 926 | 927 | [[package]] 928 | name = "crunchy" 929 | version = "0.2.4" 930 | source = "registry+https://github.com/rust-lang/crates.io-index" 931 | checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" 932 | 933 | [[package]] 934 | name = "crypto-bigint" 935 | version = "0.4.9" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" 938 | dependencies = [ 939 | "generic-array", 940 | "rand_core 0.6.4", 941 | "subtle", 942 | "zeroize", 943 | ] 944 | 945 | [[package]] 946 | name = "crypto-bigint" 947 | version = "0.5.5" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" 950 | dependencies = [ 951 | "rand_core 0.6.4", 952 | "subtle", 953 | ] 954 | 955 | [[package]] 956 | name = "crypto-common" 957 | version = "0.1.6" 958 | source = "registry+https://github.com/rust-lang/crates.io-index" 959 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 960 | dependencies = [ 961 | "generic-array", 962 | "typenum", 963 | ] 964 | 965 | [[package]] 966 | name = "darling" 967 | version = "0.20.11" 968 | source = "registry+https://github.com/rust-lang/crates.io-index" 969 | checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 970 | dependencies = [ 971 | "darling_core", 972 | "darling_macro", 973 | ] 974 | 975 | [[package]] 976 | name = "darling_core" 977 | version = "0.20.11" 978 | source = "registry+https://github.com/rust-lang/crates.io-index" 979 | checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 980 | dependencies = [ 981 | "fnv", 982 | "ident_case", 983 | "proc-macro2", 984 | "quote", 985 | "strsim", 986 | "syn", 987 | ] 988 | 989 | [[package]] 990 | name = "darling_macro" 991 | version = "0.20.11" 992 | source = "registry+https://github.com/rust-lang/crates.io-index" 993 | checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 994 | dependencies = [ 995 | "darling_core", 996 | "quote", 997 | "syn", 998 | ] 999 | 1000 | [[package]] 1001 | name = "data-encoding" 1002 | version = "2.9.0" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" 1005 | 1006 | [[package]] 1007 | name = "der" 1008 | version = "0.6.1" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" 1011 | dependencies = [ 1012 | "const-oid", 1013 | "zeroize", 1014 | ] 1015 | 1016 | [[package]] 1017 | name = "deranged" 1018 | version = "0.5.4" 1019 | source = "registry+https://github.com/rust-lang/crates.io-index" 1020 | checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" 1021 | dependencies = [ 1022 | "powerfmt", 1023 | ] 1024 | 1025 | [[package]] 1026 | name = "derive_builder" 1027 | version = "0.20.2" 1028 | source = "registry+https://github.com/rust-lang/crates.io-index" 1029 | checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" 1030 | dependencies = [ 1031 | "derive_builder_macro", 1032 | ] 1033 | 1034 | [[package]] 1035 | name = "derive_builder_core" 1036 | version = "0.20.2" 1037 | source = "registry+https://github.com/rust-lang/crates.io-index" 1038 | checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" 1039 | dependencies = [ 1040 | "darling", 1041 | "proc-macro2", 1042 | "quote", 1043 | "syn", 1044 | ] 1045 | 1046 | [[package]] 1047 | name = "derive_builder_macro" 1048 | version = "0.20.2" 1049 | source = "registry+https://github.com/rust-lang/crates.io-index" 1050 | checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" 1051 | dependencies = [ 1052 | "derive_builder_core", 1053 | "syn", 1054 | ] 1055 | 1056 | [[package]] 1057 | name = "digest" 1058 | version = "0.10.7" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 1061 | dependencies = [ 1062 | "block-buffer", 1063 | "crypto-common", 1064 | "subtle", 1065 | ] 1066 | 1067 | [[package]] 1068 | name = "displaydoc" 1069 | version = "0.2.5" 1070 | source = "registry+https://github.com/rust-lang/crates.io-index" 1071 | checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 1072 | dependencies = [ 1073 | "proc-macro2", 1074 | "quote", 1075 | "syn", 1076 | ] 1077 | 1078 | [[package]] 1079 | name = "dlv-list" 1080 | version = "0.5.2" 1081 | source = "registry+https://github.com/rust-lang/crates.io-index" 1082 | checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" 1083 | dependencies = [ 1084 | "const-random", 1085 | ] 1086 | 1087 | [[package]] 1088 | name = "dunce" 1089 | version = "1.0.5" 1090 | source = "registry+https://github.com/rust-lang/crates.io-index" 1091 | checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" 1092 | 1093 | [[package]] 1094 | name = "ecb" 1095 | version = "0.1.2" 1096 | source = "registry+https://github.com/rust-lang/crates.io-index" 1097 | checksum = "1a8bfa975b1aec2145850fcaa1c6fe269a16578c44705a532ae3edc92b8881c7" 1098 | dependencies = [ 1099 | "cipher", 1100 | ] 1101 | 1102 | [[package]] 1103 | name = "ecdsa" 1104 | version = "0.14.8" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" 1107 | dependencies = [ 1108 | "der", 1109 | "elliptic-curve", 1110 | "rfc6979", 1111 | "signature", 1112 | ] 1113 | 1114 | [[package]] 1115 | name = "either" 1116 | version = "1.15.0" 1117 | source = "registry+https://github.com/rust-lang/crates.io-index" 1118 | checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 1119 | 1120 | [[package]] 1121 | name = "elliptic-curve" 1122 | version = "0.12.3" 1123 | source = "registry+https://github.com/rust-lang/crates.io-index" 1124 | checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" 1125 | dependencies = [ 1126 | "base16ct", 1127 | "crypto-bigint 0.4.9", 1128 | "der", 1129 | "digest", 1130 | "ff", 1131 | "generic-array", 1132 | "group", 1133 | "pkcs8", 1134 | "rand_core 0.6.4", 1135 | "sec1", 1136 | "subtle", 1137 | "zeroize", 1138 | ] 1139 | 1140 | [[package]] 1141 | name = "encoding_rs" 1142 | version = "0.8.35" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 1145 | dependencies = [ 1146 | "cfg-if", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "env_filter" 1151 | version = "0.1.3" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0" 1154 | dependencies = [ 1155 | "log", 1156 | "regex", 1157 | ] 1158 | 1159 | [[package]] 1160 | name = "env_home" 1161 | version = "0.1.0" 1162 | source = "registry+https://github.com/rust-lang/crates.io-index" 1163 | checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" 1164 | 1165 | [[package]] 1166 | name = "env_logger" 1167 | version = "0.11.8" 1168 | source = "registry+https://github.com/rust-lang/crates.io-index" 1169 | checksum = "13c863f0904021b108aa8b2f55046443e6b1ebde8fd4a15c399893aae4fa069f" 1170 | dependencies = [ 1171 | "anstream", 1172 | "anstyle", 1173 | "env_filter", 1174 | "jiff", 1175 | "log", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "equivalent" 1180 | version = "1.0.2" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 1183 | 1184 | [[package]] 1185 | name = "erased-serde" 1186 | version = "0.4.8" 1187 | source = "registry+https://github.com/rust-lang/crates.io-index" 1188 | checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" 1189 | dependencies = [ 1190 | "serde", 1191 | "serde_core", 1192 | "typeid", 1193 | ] 1194 | 1195 | [[package]] 1196 | name = "errno" 1197 | version = "0.3.14" 1198 | source = "registry+https://github.com/rust-lang/crates.io-index" 1199 | checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" 1200 | dependencies = [ 1201 | "libc", 1202 | "windows-sys 0.61.2", 1203 | ] 1204 | 1205 | [[package]] 1206 | name = "fastrand" 1207 | version = "2.3.0" 1208 | source = "registry+https://github.com/rust-lang/crates.io-index" 1209 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 1210 | 1211 | [[package]] 1212 | name = "ff" 1213 | version = "0.12.1" 1214 | source = "registry+https://github.com/rust-lang/crates.io-index" 1215 | checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" 1216 | dependencies = [ 1217 | "rand_core 0.6.4", 1218 | "subtle", 1219 | ] 1220 | 1221 | [[package]] 1222 | name = "filetime" 1223 | version = "0.2.26" 1224 | source = "registry+https://github.com/rust-lang/crates.io-index" 1225 | checksum = "bc0505cd1b6fa6580283f6bdf70a73fcf4aba1184038c90902b92b3dd0df63ed" 1226 | dependencies = [ 1227 | "cfg-if", 1228 | "libc", 1229 | "libredox", 1230 | "windows-sys 0.60.2", 1231 | ] 1232 | 1233 | [[package]] 1234 | name = "find-msvc-tools" 1235 | version = "0.1.3" 1236 | source = "registry+https://github.com/rust-lang/crates.io-index" 1237 | checksum = "0399f9d26e5191ce32c498bebd31e7a3ceabc2745f0ac54af3f335126c3f24b3" 1238 | 1239 | [[package]] 1240 | name = "fixedbitset" 1241 | version = "0.5.7" 1242 | source = "registry+https://github.com/rust-lang/crates.io-index" 1243 | checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" 1244 | 1245 | [[package]] 1246 | name = "flate2" 1247 | version = "1.1.4" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" 1250 | dependencies = [ 1251 | "crc32fast", 1252 | "miniz_oxide", 1253 | ] 1254 | 1255 | [[package]] 1256 | name = "fnv" 1257 | version = "1.0.7" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 1260 | 1261 | [[package]] 1262 | name = "foldhash" 1263 | version = "0.1.5" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 1266 | 1267 | [[package]] 1268 | name = "foreign-types" 1269 | version = "0.3.2" 1270 | source = "registry+https://github.com/rust-lang/crates.io-index" 1271 | checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 1272 | dependencies = [ 1273 | "foreign-types-shared", 1274 | ] 1275 | 1276 | [[package]] 1277 | name = "foreign-types-shared" 1278 | version = "0.1.1" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 1281 | 1282 | [[package]] 1283 | name = "form_urlencoded" 1284 | version = "1.2.2" 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" 1286 | checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" 1287 | dependencies = [ 1288 | "percent-encoding", 1289 | ] 1290 | 1291 | [[package]] 1292 | name = "fs_extra" 1293 | version = "1.3.0" 1294 | source = "registry+https://github.com/rust-lang/crates.io-index" 1295 | checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" 1296 | 1297 | [[package]] 1298 | name = "futures-channel" 1299 | version = "0.3.31" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 1302 | dependencies = [ 1303 | "futures-core", 1304 | "futures-sink", 1305 | ] 1306 | 1307 | [[package]] 1308 | name = "futures-core" 1309 | version = "0.3.31" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 1312 | 1313 | [[package]] 1314 | name = "futures-io" 1315 | version = "0.3.31" 1316 | source = "registry+https://github.com/rust-lang/crates.io-index" 1317 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 1318 | 1319 | [[package]] 1320 | name = "futures-sink" 1321 | version = "0.3.31" 1322 | source = "registry+https://github.com/rust-lang/crates.io-index" 1323 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 1324 | 1325 | [[package]] 1326 | name = "futures-task" 1327 | version = "0.3.31" 1328 | source = "registry+https://github.com/rust-lang/crates.io-index" 1329 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 1330 | 1331 | [[package]] 1332 | name = "futures-util" 1333 | version = "0.3.31" 1334 | source = "registry+https://github.com/rust-lang/crates.io-index" 1335 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 1336 | dependencies = [ 1337 | "futures-core", 1338 | "futures-io", 1339 | "futures-sink", 1340 | "futures-task", 1341 | "memchr", 1342 | "pin-project-lite", 1343 | "pin-utils", 1344 | "slab", 1345 | ] 1346 | 1347 | [[package]] 1348 | name = "generic-array" 1349 | version = "0.14.7" 1350 | source = "registry+https://github.com/rust-lang/crates.io-index" 1351 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 1352 | dependencies = [ 1353 | "typenum", 1354 | "version_check", 1355 | ] 1356 | 1357 | [[package]] 1358 | name = "getrandom" 1359 | version = "0.2.16" 1360 | source = "registry+https://github.com/rust-lang/crates.io-index" 1361 | checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 1362 | dependencies = [ 1363 | "cfg-if", 1364 | "libc", 1365 | "wasi 0.11.1+wasi-snapshot-preview1", 1366 | ] 1367 | 1368 | [[package]] 1369 | name = "getrandom" 1370 | version = "0.3.3" 1371 | source = "registry+https://github.com/rust-lang/crates.io-index" 1372 | checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" 1373 | dependencies = [ 1374 | "cfg-if", 1375 | "libc", 1376 | "r-efi", 1377 | "wasi 0.14.7+wasi-0.2.4", 1378 | ] 1379 | 1380 | [[package]] 1381 | name = "gimli" 1382 | version = "0.32.3" 1383 | source = "registry+https://github.com/rust-lang/crates.io-index" 1384 | checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" 1385 | 1386 | [[package]] 1387 | name = "glob" 1388 | version = "0.3.3" 1389 | source = "registry+https://github.com/rust-lang/crates.io-index" 1390 | checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" 1391 | 1392 | [[package]] 1393 | name = "group" 1394 | version = "0.12.1" 1395 | source = "registry+https://github.com/rust-lang/crates.io-index" 1396 | checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" 1397 | dependencies = [ 1398 | "ff", 1399 | "rand_core 0.6.4", 1400 | "subtle", 1401 | ] 1402 | 1403 | [[package]] 1404 | name = "h2" 1405 | version = "0.3.27" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" 1408 | dependencies = [ 1409 | "bytes", 1410 | "fnv", 1411 | "futures-core", 1412 | "futures-sink", 1413 | "futures-util", 1414 | "http 0.2.12", 1415 | "indexmap", 1416 | "slab", 1417 | "tokio", 1418 | "tokio-util", 1419 | "tracing", 1420 | ] 1421 | 1422 | [[package]] 1423 | name = "h2" 1424 | version = "0.4.12" 1425 | source = "registry+https://github.com/rust-lang/crates.io-index" 1426 | checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" 1427 | dependencies = [ 1428 | "atomic-waker", 1429 | "bytes", 1430 | "fnv", 1431 | "futures-core", 1432 | "futures-sink", 1433 | "http 1.3.1", 1434 | "indexmap", 1435 | "slab", 1436 | "tokio", 1437 | "tokio-util", 1438 | "tracing", 1439 | ] 1440 | 1441 | [[package]] 1442 | name = "hashbrown" 1443 | version = "0.14.5" 1444 | source = "registry+https://github.com/rust-lang/crates.io-index" 1445 | checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" 1446 | 1447 | [[package]] 1448 | name = "hashbrown" 1449 | version = "0.15.5" 1450 | source = "registry+https://github.com/rust-lang/crates.io-index" 1451 | checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" 1452 | dependencies = [ 1453 | "allocator-api2", 1454 | "equivalent", 1455 | "foldhash", 1456 | ] 1457 | 1458 | [[package]] 1459 | name = "hashbrown" 1460 | version = "0.16.0" 1461 | source = "registry+https://github.com/rust-lang/crates.io-index" 1462 | checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" 1463 | 1464 | [[package]] 1465 | name = "hashlink" 1466 | version = "0.10.0" 1467 | source = "registry+https://github.com/rust-lang/crates.io-index" 1468 | checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" 1469 | dependencies = [ 1470 | "hashbrown 0.15.5", 1471 | ] 1472 | 1473 | [[package]] 1474 | name = "headless_chrome" 1475 | version = "1.0.18" 1476 | source = "registry+https://github.com/rust-lang/crates.io-index" 1477 | checksum = "f77a421a200d6314c8830919715d8452320c16e06b37686b13a9942f799dbf9b" 1478 | dependencies = [ 1479 | "anyhow", 1480 | "auto_generate_cdp", 1481 | "base64 0.22.1", 1482 | "derive_builder", 1483 | "log", 1484 | "rand", 1485 | "regex", 1486 | "serde", 1487 | "serde_json", 1488 | "tempfile", 1489 | "thiserror", 1490 | "tungstenite", 1491 | "url", 1492 | "which", 1493 | "winreg", 1494 | ] 1495 | 1496 | [[package]] 1497 | name = "heck" 1498 | version = "0.5.0" 1499 | source = "registry+https://github.com/rust-lang/crates.io-index" 1500 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 1501 | 1502 | [[package]] 1503 | name = "hex" 1504 | version = "0.4.3" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" 1507 | 1508 | [[package]] 1509 | name = "hmac" 1510 | version = "0.12.1" 1511 | source = "registry+https://github.com/rust-lang/crates.io-index" 1512 | checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" 1513 | dependencies = [ 1514 | "digest", 1515 | ] 1516 | 1517 | [[package]] 1518 | name = "http" 1519 | version = "0.2.12" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" 1522 | dependencies = [ 1523 | "bytes", 1524 | "fnv", 1525 | "itoa", 1526 | ] 1527 | 1528 | [[package]] 1529 | name = "http" 1530 | version = "1.3.1" 1531 | source = "registry+https://github.com/rust-lang/crates.io-index" 1532 | checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 1533 | dependencies = [ 1534 | "bytes", 1535 | "fnv", 1536 | "itoa", 1537 | ] 1538 | 1539 | [[package]] 1540 | name = "http-body" 1541 | version = "0.4.6" 1542 | source = "registry+https://github.com/rust-lang/crates.io-index" 1543 | checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" 1544 | dependencies = [ 1545 | "bytes", 1546 | "http 0.2.12", 1547 | "pin-project-lite", 1548 | ] 1549 | 1550 | [[package]] 1551 | name = "http-body" 1552 | version = "1.0.1" 1553 | source = "registry+https://github.com/rust-lang/crates.io-index" 1554 | checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 1555 | dependencies = [ 1556 | "bytes", 1557 | "http 1.3.1", 1558 | ] 1559 | 1560 | [[package]] 1561 | name = "http-body-util" 1562 | version = "0.1.3" 1563 | source = "registry+https://github.com/rust-lang/crates.io-index" 1564 | checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 1565 | dependencies = [ 1566 | "bytes", 1567 | "futures-core", 1568 | "http 1.3.1", 1569 | "http-body 1.0.1", 1570 | "pin-project-lite", 1571 | ] 1572 | 1573 | [[package]] 1574 | name = "httparse" 1575 | version = "1.10.1" 1576 | source = "registry+https://github.com/rust-lang/crates.io-index" 1577 | checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 1578 | 1579 | [[package]] 1580 | name = "httpdate" 1581 | version = "1.0.3" 1582 | source = "registry+https://github.com/rust-lang/crates.io-index" 1583 | checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" 1584 | 1585 | [[package]] 1586 | name = "hyper" 1587 | version = "0.14.32" 1588 | source = "registry+https://github.com/rust-lang/crates.io-index" 1589 | checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" 1590 | dependencies = [ 1591 | "bytes", 1592 | "futures-channel", 1593 | "futures-core", 1594 | "futures-util", 1595 | "h2 0.3.27", 1596 | "http 0.2.12", 1597 | "http-body 0.4.6", 1598 | "httparse", 1599 | "httpdate", 1600 | "itoa", 1601 | "pin-project-lite", 1602 | "socket2 0.5.10", 1603 | "tokio", 1604 | "tower-service", 1605 | "tracing", 1606 | "want", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "hyper" 1611 | version = "1.7.0" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" 1614 | dependencies = [ 1615 | "atomic-waker", 1616 | "bytes", 1617 | "futures-channel", 1618 | "futures-core", 1619 | "h2 0.4.12", 1620 | "http 1.3.1", 1621 | "http-body 1.0.1", 1622 | "httparse", 1623 | "httpdate", 1624 | "itoa", 1625 | "pin-project-lite", 1626 | "pin-utils", 1627 | "smallvec", 1628 | "tokio", 1629 | "want", 1630 | ] 1631 | 1632 | [[package]] 1633 | name = "hyper-rustls" 1634 | version = "0.24.2" 1635 | source = "registry+https://github.com/rust-lang/crates.io-index" 1636 | checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" 1637 | dependencies = [ 1638 | "futures-util", 1639 | "http 0.2.12", 1640 | "hyper 0.14.32", 1641 | "log", 1642 | "rustls 0.21.12", 1643 | "rustls-native-certs 0.6.3", 1644 | "tokio", 1645 | "tokio-rustls 0.24.1", 1646 | ] 1647 | 1648 | [[package]] 1649 | name = "hyper-rustls" 1650 | version = "0.27.7" 1651 | source = "registry+https://github.com/rust-lang/crates.io-index" 1652 | checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" 1653 | dependencies = [ 1654 | "http 1.3.1", 1655 | "hyper 1.7.0", 1656 | "hyper-util", 1657 | "rustls 0.23.32", 1658 | "rustls-native-certs 0.8.1", 1659 | "rustls-pki-types", 1660 | "tokio", 1661 | "tokio-rustls 0.26.4", 1662 | "tower-service", 1663 | ] 1664 | 1665 | [[package]] 1666 | name = "hyper-timeout" 1667 | version = "0.5.2" 1668 | source = "registry+https://github.com/rust-lang/crates.io-index" 1669 | checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" 1670 | dependencies = [ 1671 | "hyper 1.7.0", 1672 | "hyper-util", 1673 | "pin-project-lite", 1674 | "tokio", 1675 | "tower-service", 1676 | ] 1677 | 1678 | [[package]] 1679 | name = "hyper-tls" 1680 | version = "0.6.0" 1681 | source = "registry+https://github.com/rust-lang/crates.io-index" 1682 | checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 1683 | dependencies = [ 1684 | "bytes", 1685 | "http-body-util", 1686 | "hyper 1.7.0", 1687 | "hyper-util", 1688 | "native-tls", 1689 | "tokio", 1690 | "tokio-native-tls", 1691 | "tower-service", 1692 | ] 1693 | 1694 | [[package]] 1695 | name = "hyper-util" 1696 | version = "0.1.17" 1697 | source = "registry+https://github.com/rust-lang/crates.io-index" 1698 | checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" 1699 | dependencies = [ 1700 | "base64 0.22.1", 1701 | "bytes", 1702 | "futures-channel", 1703 | "futures-core", 1704 | "futures-util", 1705 | "http 1.3.1", 1706 | "http-body 1.0.1", 1707 | "hyper 1.7.0", 1708 | "ipnet", 1709 | "libc", 1710 | "percent-encoding", 1711 | "pin-project-lite", 1712 | "socket2 0.6.0", 1713 | "system-configuration", 1714 | "tokio", 1715 | "tower-service", 1716 | "tracing", 1717 | "windows-registry", 1718 | ] 1719 | 1720 | [[package]] 1721 | name = "iana-time-zone" 1722 | version = "0.1.64" 1723 | source = "registry+https://github.com/rust-lang/crates.io-index" 1724 | checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" 1725 | dependencies = [ 1726 | "android_system_properties", 1727 | "core-foundation-sys", 1728 | "iana-time-zone-haiku", 1729 | "js-sys", 1730 | "log", 1731 | "wasm-bindgen", 1732 | "windows-core", 1733 | ] 1734 | 1735 | [[package]] 1736 | name = "iana-time-zone-haiku" 1737 | version = "0.1.2" 1738 | source = "registry+https://github.com/rust-lang/crates.io-index" 1739 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 1740 | dependencies = [ 1741 | "cc", 1742 | ] 1743 | 1744 | [[package]] 1745 | name = "icu_collections" 1746 | version = "2.0.0" 1747 | source = "registry+https://github.com/rust-lang/crates.io-index" 1748 | checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" 1749 | dependencies = [ 1750 | "displaydoc", 1751 | "potential_utf", 1752 | "yoke", 1753 | "zerofrom", 1754 | "zerovec", 1755 | ] 1756 | 1757 | [[package]] 1758 | name = "icu_locale_core" 1759 | version = "2.0.0" 1760 | source = "registry+https://github.com/rust-lang/crates.io-index" 1761 | checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" 1762 | dependencies = [ 1763 | "displaydoc", 1764 | "litemap", 1765 | "tinystr", 1766 | "writeable", 1767 | "zerovec", 1768 | ] 1769 | 1770 | [[package]] 1771 | name = "icu_normalizer" 1772 | version = "2.0.0" 1773 | source = "registry+https://github.com/rust-lang/crates.io-index" 1774 | checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" 1775 | dependencies = [ 1776 | "displaydoc", 1777 | "icu_collections", 1778 | "icu_normalizer_data", 1779 | "icu_properties", 1780 | "icu_provider", 1781 | "smallvec", 1782 | "zerovec", 1783 | ] 1784 | 1785 | [[package]] 1786 | name = "icu_normalizer_data" 1787 | version = "2.0.0" 1788 | source = "registry+https://github.com/rust-lang/crates.io-index" 1789 | checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" 1790 | 1791 | [[package]] 1792 | name = "icu_properties" 1793 | version = "2.0.1" 1794 | source = "registry+https://github.com/rust-lang/crates.io-index" 1795 | checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" 1796 | dependencies = [ 1797 | "displaydoc", 1798 | "icu_collections", 1799 | "icu_locale_core", 1800 | "icu_properties_data", 1801 | "icu_provider", 1802 | "potential_utf", 1803 | "zerotrie", 1804 | "zerovec", 1805 | ] 1806 | 1807 | [[package]] 1808 | name = "icu_properties_data" 1809 | version = "2.0.1" 1810 | source = "registry+https://github.com/rust-lang/crates.io-index" 1811 | checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" 1812 | 1813 | [[package]] 1814 | name = "icu_provider" 1815 | version = "2.0.0" 1816 | source = "registry+https://github.com/rust-lang/crates.io-index" 1817 | checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" 1818 | dependencies = [ 1819 | "displaydoc", 1820 | "icu_locale_core", 1821 | "stable_deref_trait", 1822 | "tinystr", 1823 | "writeable", 1824 | "yoke", 1825 | "zerofrom", 1826 | "zerotrie", 1827 | "zerovec", 1828 | ] 1829 | 1830 | [[package]] 1831 | name = "ident_case" 1832 | version = "1.0.1" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 1835 | 1836 | [[package]] 1837 | name = "idna" 1838 | version = "1.1.0" 1839 | source = "registry+https://github.com/rust-lang/crates.io-index" 1840 | checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" 1841 | dependencies = [ 1842 | "idna_adapter", 1843 | "smallvec", 1844 | "utf8_iter", 1845 | ] 1846 | 1847 | [[package]] 1848 | name = "idna_adapter" 1849 | version = "1.2.1" 1850 | source = "registry+https://github.com/rust-lang/crates.io-index" 1851 | checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" 1852 | dependencies = [ 1853 | "icu_normalizer", 1854 | "icu_properties", 1855 | ] 1856 | 1857 | [[package]] 1858 | name = "indexmap" 1859 | version = "2.11.4" 1860 | source = "registry+https://github.com/rust-lang/crates.io-index" 1861 | checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" 1862 | dependencies = [ 1863 | "equivalent", 1864 | "hashbrown 0.16.0", 1865 | ] 1866 | 1867 | [[package]] 1868 | name = "inout" 1869 | version = "0.1.4" 1870 | source = "registry+https://github.com/rust-lang/crates.io-index" 1871 | checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" 1872 | dependencies = [ 1873 | "block-padding", 1874 | "generic-array", 1875 | ] 1876 | 1877 | [[package]] 1878 | name = "inventory" 1879 | version = "0.3.21" 1880 | source = "registry+https://github.com/rust-lang/crates.io-index" 1881 | checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" 1882 | dependencies = [ 1883 | "rustversion", 1884 | ] 1885 | 1886 | [[package]] 1887 | name = "io-uring" 1888 | version = "0.7.10" 1889 | source = "registry+https://github.com/rust-lang/crates.io-index" 1890 | checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" 1891 | dependencies = [ 1892 | "bitflags", 1893 | "cfg-if", 1894 | "libc", 1895 | ] 1896 | 1897 | [[package]] 1898 | name = "ipnet" 1899 | version = "2.11.0" 1900 | source = "registry+https://github.com/rust-lang/crates.io-index" 1901 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 1902 | 1903 | [[package]] 1904 | name = "iri-string" 1905 | version = "0.7.8" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" 1908 | dependencies = [ 1909 | "memchr", 1910 | "serde", 1911 | ] 1912 | 1913 | [[package]] 1914 | name = "is_terminal_polyfill" 1915 | version = "1.70.1" 1916 | source = "registry+https://github.com/rust-lang/crates.io-index" 1917 | checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" 1918 | 1919 | [[package]] 1920 | name = "itertools" 1921 | version = "0.13.0" 1922 | source = "registry+https://github.com/rust-lang/crates.io-index" 1923 | checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 1924 | dependencies = [ 1925 | "either", 1926 | ] 1927 | 1928 | [[package]] 1929 | name = "itertools" 1930 | version = "0.14.0" 1931 | source = "registry+https://github.com/rust-lang/crates.io-index" 1932 | checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" 1933 | dependencies = [ 1934 | "either", 1935 | ] 1936 | 1937 | [[package]] 1938 | name = "itoa" 1939 | version = "1.0.15" 1940 | source = "registry+https://github.com/rust-lang/crates.io-index" 1941 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 1942 | 1943 | [[package]] 1944 | name = "jiff" 1945 | version = "0.2.15" 1946 | source = "registry+https://github.com/rust-lang/crates.io-index" 1947 | checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49" 1948 | dependencies = [ 1949 | "jiff-static", 1950 | "jiff-tzdb-platform", 1951 | "log", 1952 | "portable-atomic", 1953 | "portable-atomic-util", 1954 | "serde", 1955 | "windows-sys 0.59.0", 1956 | ] 1957 | 1958 | [[package]] 1959 | name = "jiff-static" 1960 | version = "0.2.15" 1961 | source = "registry+https://github.com/rust-lang/crates.io-index" 1962 | checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" 1963 | dependencies = [ 1964 | "proc-macro2", 1965 | "quote", 1966 | "syn", 1967 | ] 1968 | 1969 | [[package]] 1970 | name = "jiff-tzdb" 1971 | version = "0.1.4" 1972 | source = "registry+https://github.com/rust-lang/crates.io-index" 1973 | checksum = "c1283705eb0a21404d2bfd6eef2a7593d240bc42a0bdb39db0ad6fa2ec026524" 1974 | 1975 | [[package]] 1976 | name = "jiff-tzdb-platform" 1977 | version = "0.1.3" 1978 | source = "registry+https://github.com/rust-lang/crates.io-index" 1979 | checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" 1980 | dependencies = [ 1981 | "jiff-tzdb", 1982 | ] 1983 | 1984 | [[package]] 1985 | name = "jobserver" 1986 | version = "0.1.34" 1987 | source = "registry+https://github.com/rust-lang/crates.io-index" 1988 | checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" 1989 | dependencies = [ 1990 | "getrandom 0.3.3", 1991 | "libc", 1992 | ] 1993 | 1994 | [[package]] 1995 | name = "js-sys" 1996 | version = "0.3.81" 1997 | source = "registry+https://github.com/rust-lang/crates.io-index" 1998 | checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" 1999 | dependencies = [ 2000 | "once_cell", 2001 | "wasm-bindgen", 2002 | ] 2003 | 2004 | [[package]] 2005 | name = "json5" 2006 | version = "0.4.1" 2007 | source = "registry+https://github.com/rust-lang/crates.io-index" 2008 | checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" 2009 | dependencies = [ 2010 | "pest", 2011 | "pest_derive", 2012 | "serde", 2013 | ] 2014 | 2015 | [[package]] 2016 | name = "libc" 2017 | version = "0.2.176" 2018 | source = "registry+https://github.com/rust-lang/crates.io-index" 2019 | checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" 2020 | 2021 | [[package]] 2022 | name = "libloading" 2023 | version = "0.8.8" 2024 | source = "registry+https://github.com/rust-lang/crates.io-index" 2025 | checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" 2026 | dependencies = [ 2027 | "cfg-if", 2028 | "windows-targets 0.53.5", 2029 | ] 2030 | 2031 | [[package]] 2032 | name = "libredox" 2033 | version = "0.1.10" 2034 | source = "registry+https://github.com/rust-lang/crates.io-index" 2035 | checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" 2036 | dependencies = [ 2037 | "bitflags", 2038 | "libc", 2039 | "redox_syscall", 2040 | ] 2041 | 2042 | [[package]] 2043 | name = "linux-raw-sys" 2044 | version = "0.11.0" 2045 | source = "registry+https://github.com/rust-lang/crates.io-index" 2046 | checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" 2047 | 2048 | [[package]] 2049 | name = "litemap" 2050 | version = "0.8.0" 2051 | source = "registry+https://github.com/rust-lang/crates.io-index" 2052 | checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" 2053 | 2054 | [[package]] 2055 | name = "lock_api" 2056 | version = "0.4.14" 2057 | source = "registry+https://github.com/rust-lang/crates.io-index" 2058 | checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" 2059 | dependencies = [ 2060 | "scopeguard", 2061 | ] 2062 | 2063 | [[package]] 2064 | name = "log" 2065 | version = "0.4.28" 2066 | source = "registry+https://github.com/rust-lang/crates.io-index" 2067 | checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" 2068 | 2069 | [[package]] 2070 | name = "lopdf" 2071 | version = "0.38.0" 2072 | source = "registry+https://github.com/rust-lang/crates.io-index" 2073 | checksum = "c7184fdea2bc3cd272a1acec4030c321a8f9875e877b3f92a53f2f6033fdc289" 2074 | dependencies = [ 2075 | "aes", 2076 | "bitflags", 2077 | "cbc", 2078 | "chrono", 2079 | "ecb", 2080 | "encoding_rs", 2081 | "flate2", 2082 | "getrandom 0.3.3", 2083 | "indexmap", 2084 | "itoa", 2085 | "jiff", 2086 | "log", 2087 | "md-5", 2088 | "nom 8.0.0", 2089 | "nom_locate", 2090 | "rand", 2091 | "rangemap", 2092 | "rayon", 2093 | "sha2", 2094 | "stringprep", 2095 | "thiserror", 2096 | "time", 2097 | "ttf-parser", 2098 | "weezl", 2099 | ] 2100 | 2101 | [[package]] 2102 | name = "lru" 2103 | version = "0.12.5" 2104 | source = "registry+https://github.com/rust-lang/crates.io-index" 2105 | checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 2106 | dependencies = [ 2107 | "hashbrown 0.15.5", 2108 | ] 2109 | 2110 | [[package]] 2111 | name = "matchit" 2112 | version = "0.8.4" 2113 | source = "registry+https://github.com/rust-lang/crates.io-index" 2114 | checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" 2115 | 2116 | [[package]] 2117 | name = "md-5" 2118 | version = "0.10.6" 2119 | source = "registry+https://github.com/rust-lang/crates.io-index" 2120 | checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" 2121 | dependencies = [ 2122 | "cfg-if", 2123 | "digest", 2124 | ] 2125 | 2126 | [[package]] 2127 | name = "memchr" 2128 | version = "2.7.6" 2129 | source = "registry+https://github.com/rust-lang/crates.io-index" 2130 | checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" 2131 | 2132 | [[package]] 2133 | name = "mime" 2134 | version = "0.3.17" 2135 | source = "registry+https://github.com/rust-lang/crates.io-index" 2136 | checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 2137 | 2138 | [[package]] 2139 | name = "minimal-lexical" 2140 | version = "0.2.1" 2141 | source = "registry+https://github.com/rust-lang/crates.io-index" 2142 | checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" 2143 | 2144 | [[package]] 2145 | name = "miniz_oxide" 2146 | version = "0.8.9" 2147 | source = "registry+https://github.com/rust-lang/crates.io-index" 2148 | checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" 2149 | dependencies = [ 2150 | "adler2", 2151 | "simd-adler32", 2152 | ] 2153 | 2154 | [[package]] 2155 | name = "mio" 2156 | version = "1.0.4" 2157 | source = "registry+https://github.com/rust-lang/crates.io-index" 2158 | checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" 2159 | dependencies = [ 2160 | "libc", 2161 | "wasi 0.11.1+wasi-snapshot-preview1", 2162 | "windows-sys 0.59.0", 2163 | ] 2164 | 2165 | [[package]] 2166 | name = "multimap" 2167 | version = "0.10.1" 2168 | source = "registry+https://github.com/rust-lang/crates.io-index" 2169 | checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" 2170 | 2171 | [[package]] 2172 | name = "native-tls" 2173 | version = "0.2.14" 2174 | source = "registry+https://github.com/rust-lang/crates.io-index" 2175 | checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 2176 | dependencies = [ 2177 | "libc", 2178 | "log", 2179 | "openssl", 2180 | "openssl-probe", 2181 | "openssl-sys", 2182 | "schannel", 2183 | "security-framework 2.11.1", 2184 | "security-framework-sys", 2185 | "tempfile", 2186 | ] 2187 | 2188 | [[package]] 2189 | name = "nom" 2190 | version = "7.1.3" 2191 | source = "registry+https://github.com/rust-lang/crates.io-index" 2192 | checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" 2193 | dependencies = [ 2194 | "memchr", 2195 | "minimal-lexical", 2196 | ] 2197 | 2198 | [[package]] 2199 | name = "nom" 2200 | version = "8.0.0" 2201 | source = "registry+https://github.com/rust-lang/crates.io-index" 2202 | checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" 2203 | dependencies = [ 2204 | "memchr", 2205 | ] 2206 | 2207 | [[package]] 2208 | name = "nom_locate" 2209 | version = "5.0.0" 2210 | source = "registry+https://github.com/rust-lang/crates.io-index" 2211 | checksum = "0b577e2d69827c4740cba2b52efaad1c4cc7c73042860b199710b3575c68438d" 2212 | dependencies = [ 2213 | "bytecount", 2214 | "memchr", 2215 | "nom 8.0.0", 2216 | ] 2217 | 2218 | [[package]] 2219 | name = "num-conv" 2220 | version = "0.1.0" 2221 | source = "registry+https://github.com/rust-lang/crates.io-index" 2222 | checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" 2223 | 2224 | [[package]] 2225 | name = "num-integer" 2226 | version = "0.1.46" 2227 | source = "registry+https://github.com/rust-lang/crates.io-index" 2228 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 2229 | dependencies = [ 2230 | "num-traits", 2231 | ] 2232 | 2233 | [[package]] 2234 | name = "num-traits" 2235 | version = "0.2.19" 2236 | source = "registry+https://github.com/rust-lang/crates.io-index" 2237 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 2238 | dependencies = [ 2239 | "autocfg", 2240 | ] 2241 | 2242 | [[package]] 2243 | name = "object" 2244 | version = "0.37.3" 2245 | source = "registry+https://github.com/rust-lang/crates.io-index" 2246 | checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" 2247 | dependencies = [ 2248 | "memchr", 2249 | ] 2250 | 2251 | [[package]] 2252 | name = "once_cell" 2253 | version = "1.21.3" 2254 | source = "registry+https://github.com/rust-lang/crates.io-index" 2255 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 2256 | 2257 | [[package]] 2258 | name = "once_cell_polyfill" 2259 | version = "1.70.1" 2260 | source = "registry+https://github.com/rust-lang/crates.io-index" 2261 | checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" 2262 | 2263 | [[package]] 2264 | name = "openssl" 2265 | version = "0.10.73" 2266 | source = "registry+https://github.com/rust-lang/crates.io-index" 2267 | checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" 2268 | dependencies = [ 2269 | "bitflags", 2270 | "cfg-if", 2271 | "foreign-types", 2272 | "libc", 2273 | "once_cell", 2274 | "openssl-macros", 2275 | "openssl-sys", 2276 | ] 2277 | 2278 | [[package]] 2279 | name = "openssl-macros" 2280 | version = "0.1.1" 2281 | source = "registry+https://github.com/rust-lang/crates.io-index" 2282 | checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 2283 | dependencies = [ 2284 | "proc-macro2", 2285 | "quote", 2286 | "syn", 2287 | ] 2288 | 2289 | [[package]] 2290 | name = "openssl-probe" 2291 | version = "0.1.6" 2292 | source = "registry+https://github.com/rust-lang/crates.io-index" 2293 | checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 2294 | 2295 | [[package]] 2296 | name = "openssl-sys" 2297 | version = "0.9.109" 2298 | source = "registry+https://github.com/rust-lang/crates.io-index" 2299 | checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" 2300 | dependencies = [ 2301 | "cc", 2302 | "libc", 2303 | "pkg-config", 2304 | "vcpkg", 2305 | ] 2306 | 2307 | [[package]] 2308 | name = "ordered-multimap" 2309 | version = "0.7.3" 2310 | source = "registry+https://github.com/rust-lang/crates.io-index" 2311 | checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" 2312 | dependencies = [ 2313 | "dlv-list", 2314 | "hashbrown 0.14.5", 2315 | ] 2316 | 2317 | [[package]] 2318 | name = "outref" 2319 | version = "0.5.2" 2320 | source = "registry+https://github.com/rust-lang/crates.io-index" 2321 | checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" 2322 | 2323 | [[package]] 2324 | name = "p256" 2325 | version = "0.11.1" 2326 | source = "registry+https://github.com/rust-lang/crates.io-index" 2327 | checksum = "51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594" 2328 | dependencies = [ 2329 | "ecdsa", 2330 | "elliptic-curve", 2331 | "sha2", 2332 | ] 2333 | 2334 | [[package]] 2335 | name = "parking_lot" 2336 | version = "0.12.5" 2337 | source = "registry+https://github.com/rust-lang/crates.io-index" 2338 | checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" 2339 | dependencies = [ 2340 | "lock_api", 2341 | "parking_lot_core", 2342 | ] 2343 | 2344 | [[package]] 2345 | name = "parking_lot_core" 2346 | version = "0.9.12" 2347 | source = "registry+https://github.com/rust-lang/crates.io-index" 2348 | checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" 2349 | dependencies = [ 2350 | "cfg-if", 2351 | "libc", 2352 | "redox_syscall", 2353 | "smallvec", 2354 | "windows-link 0.2.1", 2355 | ] 2356 | 2357 | [[package]] 2358 | name = "pathdiff" 2359 | version = "0.2.3" 2360 | source = "registry+https://github.com/rust-lang/crates.io-index" 2361 | checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" 2362 | 2363 | [[package]] 2364 | name = "pdf-rendering-srv" 2365 | version = "0.1.5" 2366 | dependencies = [ 2367 | "anyhow", 2368 | "aws-sdk-config", 2369 | "aws-sdk-s3", 2370 | "aws-smithy-runtime-api", 2371 | "config", 2372 | "env_logger", 2373 | "flate2", 2374 | "headless_chrome", 2375 | "log", 2376 | "lopdf", 2377 | "prost", 2378 | "prost-types", 2379 | "prost-wkt-types", 2380 | "reqwest", 2381 | "serde", 2382 | "serde_json", 2383 | "tar", 2384 | "tiny_http", 2385 | "tokio", 2386 | "tokio-stream", 2387 | "tonic", 2388 | "tonic-build", 2389 | "tonic-health", 2390 | "tonic-prost", 2391 | "tonic-prost-build", 2392 | "tonic-reflection", 2393 | "ulid", 2394 | ] 2395 | 2396 | [[package]] 2397 | name = "percent-encoding" 2398 | version = "2.3.2" 2399 | source = "registry+https://github.com/rust-lang/crates.io-index" 2400 | checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" 2401 | 2402 | [[package]] 2403 | name = "pest" 2404 | version = "2.8.3" 2405 | source = "registry+https://github.com/rust-lang/crates.io-index" 2406 | checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" 2407 | dependencies = [ 2408 | "memchr", 2409 | "ucd-trie", 2410 | ] 2411 | 2412 | [[package]] 2413 | name = "pest_derive" 2414 | version = "2.8.3" 2415 | source = "registry+https://github.com/rust-lang/crates.io-index" 2416 | checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" 2417 | dependencies = [ 2418 | "pest", 2419 | "pest_generator", 2420 | ] 2421 | 2422 | [[package]] 2423 | name = "pest_generator" 2424 | version = "2.8.3" 2425 | source = "registry+https://github.com/rust-lang/crates.io-index" 2426 | checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" 2427 | dependencies = [ 2428 | "pest", 2429 | "pest_meta", 2430 | "proc-macro2", 2431 | "quote", 2432 | "syn", 2433 | ] 2434 | 2435 | [[package]] 2436 | name = "pest_meta" 2437 | version = "2.8.3" 2438 | source = "registry+https://github.com/rust-lang/crates.io-index" 2439 | checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" 2440 | dependencies = [ 2441 | "pest", 2442 | "sha2", 2443 | ] 2444 | 2445 | [[package]] 2446 | name = "petgraph" 2447 | version = "0.7.1" 2448 | source = "registry+https://github.com/rust-lang/crates.io-index" 2449 | checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" 2450 | dependencies = [ 2451 | "fixedbitset", 2452 | "indexmap", 2453 | ] 2454 | 2455 | [[package]] 2456 | name = "pin-project" 2457 | version = "1.1.10" 2458 | source = "registry+https://github.com/rust-lang/crates.io-index" 2459 | checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" 2460 | dependencies = [ 2461 | "pin-project-internal", 2462 | ] 2463 | 2464 | [[package]] 2465 | name = "pin-project-internal" 2466 | version = "1.1.10" 2467 | source = "registry+https://github.com/rust-lang/crates.io-index" 2468 | checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" 2469 | dependencies = [ 2470 | "proc-macro2", 2471 | "quote", 2472 | "syn", 2473 | ] 2474 | 2475 | [[package]] 2476 | name = "pin-project-lite" 2477 | version = "0.2.16" 2478 | source = "registry+https://github.com/rust-lang/crates.io-index" 2479 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 2480 | 2481 | [[package]] 2482 | name = "pin-utils" 2483 | version = "0.1.0" 2484 | source = "registry+https://github.com/rust-lang/crates.io-index" 2485 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 2486 | 2487 | [[package]] 2488 | name = "pkcs8" 2489 | version = "0.9.0" 2490 | source = "registry+https://github.com/rust-lang/crates.io-index" 2491 | checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" 2492 | dependencies = [ 2493 | "der", 2494 | "spki", 2495 | ] 2496 | 2497 | [[package]] 2498 | name = "pkg-config" 2499 | version = "0.3.32" 2500 | source = "registry+https://github.com/rust-lang/crates.io-index" 2501 | checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 2502 | 2503 | [[package]] 2504 | name = "portable-atomic" 2505 | version = "1.11.1" 2506 | source = "registry+https://github.com/rust-lang/crates.io-index" 2507 | checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" 2508 | 2509 | [[package]] 2510 | name = "portable-atomic-util" 2511 | version = "0.2.4" 2512 | source = "registry+https://github.com/rust-lang/crates.io-index" 2513 | checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" 2514 | dependencies = [ 2515 | "portable-atomic", 2516 | ] 2517 | 2518 | [[package]] 2519 | name = "potential_utf" 2520 | version = "0.1.3" 2521 | source = "registry+https://github.com/rust-lang/crates.io-index" 2522 | checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" 2523 | dependencies = [ 2524 | "zerovec", 2525 | ] 2526 | 2527 | [[package]] 2528 | name = "powerfmt" 2529 | version = "0.2.0" 2530 | source = "registry+https://github.com/rust-lang/crates.io-index" 2531 | checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" 2532 | 2533 | [[package]] 2534 | name = "ppv-lite86" 2535 | version = "0.2.21" 2536 | source = "registry+https://github.com/rust-lang/crates.io-index" 2537 | checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" 2538 | dependencies = [ 2539 | "zerocopy", 2540 | ] 2541 | 2542 | [[package]] 2543 | name = "prettyplease" 2544 | version = "0.2.37" 2545 | source = "registry+https://github.com/rust-lang/crates.io-index" 2546 | checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" 2547 | dependencies = [ 2548 | "proc-macro2", 2549 | "syn", 2550 | ] 2551 | 2552 | [[package]] 2553 | name = "proc-macro2" 2554 | version = "1.0.101" 2555 | source = "registry+https://github.com/rust-lang/crates.io-index" 2556 | checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" 2557 | dependencies = [ 2558 | "unicode-ident", 2559 | ] 2560 | 2561 | [[package]] 2562 | name = "prost" 2563 | version = "0.14.1" 2564 | source = "registry+https://github.com/rust-lang/crates.io-index" 2565 | checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" 2566 | dependencies = [ 2567 | "bytes", 2568 | "prost-derive", 2569 | ] 2570 | 2571 | [[package]] 2572 | name = "prost-build" 2573 | version = "0.14.1" 2574 | source = "registry+https://github.com/rust-lang/crates.io-index" 2575 | checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" 2576 | dependencies = [ 2577 | "heck", 2578 | "itertools 0.14.0", 2579 | "log", 2580 | "multimap", 2581 | "once_cell", 2582 | "petgraph", 2583 | "prettyplease", 2584 | "prost", 2585 | "prost-types", 2586 | "pulldown-cmark", 2587 | "pulldown-cmark-to-cmark", 2588 | "regex", 2589 | "syn", 2590 | "tempfile", 2591 | ] 2592 | 2593 | [[package]] 2594 | name = "prost-derive" 2595 | version = "0.14.1" 2596 | source = "registry+https://github.com/rust-lang/crates.io-index" 2597 | checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" 2598 | dependencies = [ 2599 | "anyhow", 2600 | "itertools 0.14.0", 2601 | "proc-macro2", 2602 | "quote", 2603 | "syn", 2604 | ] 2605 | 2606 | [[package]] 2607 | name = "prost-types" 2608 | version = "0.14.1" 2609 | source = "registry+https://github.com/rust-lang/crates.io-index" 2610 | checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" 2611 | dependencies = [ 2612 | "prost", 2613 | ] 2614 | 2615 | [[package]] 2616 | name = "prost-wkt" 2617 | version = "0.7.0" 2618 | source = "registry+https://github.com/rust-lang/crates.io-index" 2619 | checksum = "655944d0ce015e71b3ec21279437e6a09e58433e50c7b0677901f3d5235e74f5" 2620 | dependencies = [ 2621 | "chrono", 2622 | "inventory", 2623 | "prost", 2624 | "serde", 2625 | "serde_derive", 2626 | "serde_json", 2627 | "typetag", 2628 | ] 2629 | 2630 | [[package]] 2631 | name = "prost-wkt-build" 2632 | version = "0.7.0" 2633 | source = "registry+https://github.com/rust-lang/crates.io-index" 2634 | checksum = "f869f1443fee474b785e935d92e1007f57443e485f51668ed41943fc01a321a2" 2635 | dependencies = [ 2636 | "heck", 2637 | "prost", 2638 | "prost-build", 2639 | "prost-types", 2640 | "quote", 2641 | ] 2642 | 2643 | [[package]] 2644 | name = "prost-wkt-types" 2645 | version = "0.7.0" 2646 | source = "registry+https://github.com/rust-lang/crates.io-index" 2647 | checksum = "eeeffd6b9becd4600dd461399f3f71aeda2ff0848802a9ed526cf12e8f42902a" 2648 | dependencies = [ 2649 | "chrono", 2650 | "prost", 2651 | "prost-build", 2652 | "prost-types", 2653 | "prost-wkt", 2654 | "prost-wkt-build", 2655 | "regex", 2656 | "serde", 2657 | "serde_derive", 2658 | "serde_json", 2659 | ] 2660 | 2661 | [[package]] 2662 | name = "pulldown-cmark" 2663 | version = "0.13.0" 2664 | source = "registry+https://github.com/rust-lang/crates.io-index" 2665 | checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" 2666 | dependencies = [ 2667 | "bitflags", 2668 | "memchr", 2669 | "unicase", 2670 | ] 2671 | 2672 | [[package]] 2673 | name = "pulldown-cmark-to-cmark" 2674 | version = "21.0.0" 2675 | source = "registry+https://github.com/rust-lang/crates.io-index" 2676 | checksum = "e5b6a0769a491a08b31ea5c62494a8f144ee0987d86d670a8af4df1e1b7cde75" 2677 | dependencies = [ 2678 | "pulldown-cmark", 2679 | ] 2680 | 2681 | [[package]] 2682 | name = "quote" 2683 | version = "1.0.41" 2684 | source = "registry+https://github.com/rust-lang/crates.io-index" 2685 | checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" 2686 | dependencies = [ 2687 | "proc-macro2", 2688 | ] 2689 | 2690 | [[package]] 2691 | name = "r-efi" 2692 | version = "5.3.0" 2693 | source = "registry+https://github.com/rust-lang/crates.io-index" 2694 | checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" 2695 | 2696 | [[package]] 2697 | name = "rand" 2698 | version = "0.9.2" 2699 | source = "registry+https://github.com/rust-lang/crates.io-index" 2700 | checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" 2701 | dependencies = [ 2702 | "rand_chacha", 2703 | "rand_core 0.9.3", 2704 | ] 2705 | 2706 | [[package]] 2707 | name = "rand_chacha" 2708 | version = "0.9.0" 2709 | source = "registry+https://github.com/rust-lang/crates.io-index" 2710 | checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" 2711 | dependencies = [ 2712 | "ppv-lite86", 2713 | "rand_core 0.9.3", 2714 | ] 2715 | 2716 | [[package]] 2717 | name = "rand_core" 2718 | version = "0.6.4" 2719 | source = "registry+https://github.com/rust-lang/crates.io-index" 2720 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 2721 | dependencies = [ 2722 | "getrandom 0.2.16", 2723 | ] 2724 | 2725 | [[package]] 2726 | name = "rand_core" 2727 | version = "0.9.3" 2728 | source = "registry+https://github.com/rust-lang/crates.io-index" 2729 | checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" 2730 | dependencies = [ 2731 | "getrandom 0.3.3", 2732 | ] 2733 | 2734 | [[package]] 2735 | name = "rangemap" 2736 | version = "1.6.0" 2737 | source = "registry+https://github.com/rust-lang/crates.io-index" 2738 | checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" 2739 | 2740 | [[package]] 2741 | name = "rayon" 2742 | version = "1.11.0" 2743 | source = "registry+https://github.com/rust-lang/crates.io-index" 2744 | checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" 2745 | dependencies = [ 2746 | "either", 2747 | "rayon-core", 2748 | ] 2749 | 2750 | [[package]] 2751 | name = "rayon-core" 2752 | version = "1.13.0" 2753 | source = "registry+https://github.com/rust-lang/crates.io-index" 2754 | checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" 2755 | dependencies = [ 2756 | "crossbeam-deque", 2757 | "crossbeam-utils", 2758 | ] 2759 | 2760 | [[package]] 2761 | name = "redox_syscall" 2762 | version = "0.5.18" 2763 | source = "registry+https://github.com/rust-lang/crates.io-index" 2764 | checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" 2765 | dependencies = [ 2766 | "bitflags", 2767 | ] 2768 | 2769 | [[package]] 2770 | name = "regex" 2771 | version = "1.11.3" 2772 | source = "registry+https://github.com/rust-lang/crates.io-index" 2773 | checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" 2774 | dependencies = [ 2775 | "aho-corasick", 2776 | "memchr", 2777 | "regex-automata", 2778 | "regex-syntax", 2779 | ] 2780 | 2781 | [[package]] 2782 | name = "regex-automata" 2783 | version = "0.4.11" 2784 | source = "registry+https://github.com/rust-lang/crates.io-index" 2785 | checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" 2786 | dependencies = [ 2787 | "aho-corasick", 2788 | "memchr", 2789 | "regex-syntax", 2790 | ] 2791 | 2792 | [[package]] 2793 | name = "regex-lite" 2794 | version = "0.1.7" 2795 | source = "registry+https://github.com/rust-lang/crates.io-index" 2796 | checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" 2797 | 2798 | [[package]] 2799 | name = "regex-syntax" 2800 | version = "0.8.6" 2801 | source = "registry+https://github.com/rust-lang/crates.io-index" 2802 | checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" 2803 | 2804 | [[package]] 2805 | name = "reqwest" 2806 | version = "0.12.23" 2807 | source = "registry+https://github.com/rust-lang/crates.io-index" 2808 | checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" 2809 | dependencies = [ 2810 | "base64 0.22.1", 2811 | "bytes", 2812 | "encoding_rs", 2813 | "futures-channel", 2814 | "futures-core", 2815 | "futures-util", 2816 | "h2 0.4.12", 2817 | "http 1.3.1", 2818 | "http-body 1.0.1", 2819 | "http-body-util", 2820 | "hyper 1.7.0", 2821 | "hyper-rustls 0.27.7", 2822 | "hyper-tls", 2823 | "hyper-util", 2824 | "js-sys", 2825 | "log", 2826 | "mime", 2827 | "native-tls", 2828 | "percent-encoding", 2829 | "pin-project-lite", 2830 | "rustls-pki-types", 2831 | "serde", 2832 | "serde_json", 2833 | "serde_urlencoded", 2834 | "sync_wrapper", 2835 | "tokio", 2836 | "tokio-native-tls", 2837 | "tower", 2838 | "tower-http", 2839 | "tower-service", 2840 | "url", 2841 | "wasm-bindgen", 2842 | "wasm-bindgen-futures", 2843 | "web-sys", 2844 | ] 2845 | 2846 | [[package]] 2847 | name = "rfc6979" 2848 | version = "0.3.1" 2849 | source = "registry+https://github.com/rust-lang/crates.io-index" 2850 | checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" 2851 | dependencies = [ 2852 | "crypto-bigint 0.4.9", 2853 | "hmac", 2854 | "zeroize", 2855 | ] 2856 | 2857 | [[package]] 2858 | name = "ring" 2859 | version = "0.17.14" 2860 | source = "registry+https://github.com/rust-lang/crates.io-index" 2861 | checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 2862 | dependencies = [ 2863 | "cc", 2864 | "cfg-if", 2865 | "getrandom 0.2.16", 2866 | "libc", 2867 | "untrusted", 2868 | "windows-sys 0.52.0", 2869 | ] 2870 | 2871 | [[package]] 2872 | name = "ron" 2873 | version = "0.8.1" 2874 | source = "registry+https://github.com/rust-lang/crates.io-index" 2875 | checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" 2876 | dependencies = [ 2877 | "base64 0.21.7", 2878 | "bitflags", 2879 | "serde", 2880 | "serde_derive", 2881 | ] 2882 | 2883 | [[package]] 2884 | name = "rust-ini" 2885 | version = "0.21.3" 2886 | source = "registry+https://github.com/rust-lang/crates.io-index" 2887 | checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7" 2888 | dependencies = [ 2889 | "cfg-if", 2890 | "ordered-multimap", 2891 | ] 2892 | 2893 | [[package]] 2894 | name = "rustc-demangle" 2895 | version = "0.1.26" 2896 | source = "registry+https://github.com/rust-lang/crates.io-index" 2897 | checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" 2898 | 2899 | [[package]] 2900 | name = "rustc-hash" 2901 | version = "2.1.1" 2902 | source = "registry+https://github.com/rust-lang/crates.io-index" 2903 | checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" 2904 | 2905 | [[package]] 2906 | name = "rustc_version" 2907 | version = "0.4.1" 2908 | source = "registry+https://github.com/rust-lang/crates.io-index" 2909 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 2910 | dependencies = [ 2911 | "semver", 2912 | ] 2913 | 2914 | [[package]] 2915 | name = "rustix" 2916 | version = "1.1.2" 2917 | source = "registry+https://github.com/rust-lang/crates.io-index" 2918 | checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" 2919 | dependencies = [ 2920 | "bitflags", 2921 | "errno", 2922 | "libc", 2923 | "linux-raw-sys", 2924 | "windows-sys 0.61.2", 2925 | ] 2926 | 2927 | [[package]] 2928 | name = "rustls" 2929 | version = "0.21.12" 2930 | source = "registry+https://github.com/rust-lang/crates.io-index" 2931 | checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" 2932 | dependencies = [ 2933 | "log", 2934 | "ring", 2935 | "rustls-webpki 0.101.7", 2936 | "sct", 2937 | ] 2938 | 2939 | [[package]] 2940 | name = "rustls" 2941 | version = "0.23.32" 2942 | source = "registry+https://github.com/rust-lang/crates.io-index" 2943 | checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" 2944 | dependencies = [ 2945 | "aws-lc-rs", 2946 | "log", 2947 | "once_cell", 2948 | "ring", 2949 | "rustls-pki-types", 2950 | "rustls-webpki 0.103.7", 2951 | "subtle", 2952 | "zeroize", 2953 | ] 2954 | 2955 | [[package]] 2956 | name = "rustls-native-certs" 2957 | version = "0.6.3" 2958 | source = "registry+https://github.com/rust-lang/crates.io-index" 2959 | checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" 2960 | dependencies = [ 2961 | "openssl-probe", 2962 | "rustls-pemfile", 2963 | "schannel", 2964 | "security-framework 2.11.1", 2965 | ] 2966 | 2967 | [[package]] 2968 | name = "rustls-native-certs" 2969 | version = "0.8.1" 2970 | source = "registry+https://github.com/rust-lang/crates.io-index" 2971 | checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" 2972 | dependencies = [ 2973 | "openssl-probe", 2974 | "rustls-pki-types", 2975 | "schannel", 2976 | "security-framework 3.5.1", 2977 | ] 2978 | 2979 | [[package]] 2980 | name = "rustls-pemfile" 2981 | version = "1.0.4" 2982 | source = "registry+https://github.com/rust-lang/crates.io-index" 2983 | checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" 2984 | dependencies = [ 2985 | "base64 0.21.7", 2986 | ] 2987 | 2988 | [[package]] 2989 | name = "rustls-pki-types" 2990 | version = "1.12.0" 2991 | source = "registry+https://github.com/rust-lang/crates.io-index" 2992 | checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" 2993 | dependencies = [ 2994 | "zeroize", 2995 | ] 2996 | 2997 | [[package]] 2998 | name = "rustls-webpki" 2999 | version = "0.101.7" 3000 | source = "registry+https://github.com/rust-lang/crates.io-index" 3001 | checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" 3002 | dependencies = [ 3003 | "ring", 3004 | "untrusted", 3005 | ] 3006 | 3007 | [[package]] 3008 | name = "rustls-webpki" 3009 | version = "0.103.7" 3010 | source = "registry+https://github.com/rust-lang/crates.io-index" 3011 | checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" 3012 | dependencies = [ 3013 | "aws-lc-rs", 3014 | "ring", 3015 | "rustls-pki-types", 3016 | "untrusted", 3017 | ] 3018 | 3019 | [[package]] 3020 | name = "rustversion" 3021 | version = "1.0.22" 3022 | source = "registry+https://github.com/rust-lang/crates.io-index" 3023 | checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" 3024 | 3025 | [[package]] 3026 | name = "ryu" 3027 | version = "1.0.20" 3028 | source = "registry+https://github.com/rust-lang/crates.io-index" 3029 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 3030 | 3031 | [[package]] 3032 | name = "schannel" 3033 | version = "0.1.28" 3034 | source = "registry+https://github.com/rust-lang/crates.io-index" 3035 | checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" 3036 | dependencies = [ 3037 | "windows-sys 0.61.2", 3038 | ] 3039 | 3040 | [[package]] 3041 | name = "scopeguard" 3042 | version = "1.2.0" 3043 | source = "registry+https://github.com/rust-lang/crates.io-index" 3044 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 3045 | 3046 | [[package]] 3047 | name = "sct" 3048 | version = "0.7.1" 3049 | source = "registry+https://github.com/rust-lang/crates.io-index" 3050 | checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" 3051 | dependencies = [ 3052 | "ring", 3053 | "untrusted", 3054 | ] 3055 | 3056 | [[package]] 3057 | name = "sec1" 3058 | version = "0.3.0" 3059 | source = "registry+https://github.com/rust-lang/crates.io-index" 3060 | checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" 3061 | dependencies = [ 3062 | "base16ct", 3063 | "der", 3064 | "generic-array", 3065 | "pkcs8", 3066 | "subtle", 3067 | "zeroize", 3068 | ] 3069 | 3070 | [[package]] 3071 | name = "security-framework" 3072 | version = "2.11.1" 3073 | source = "registry+https://github.com/rust-lang/crates.io-index" 3074 | checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 3075 | dependencies = [ 3076 | "bitflags", 3077 | "core-foundation 0.9.4", 3078 | "core-foundation-sys", 3079 | "libc", 3080 | "security-framework-sys", 3081 | ] 3082 | 3083 | [[package]] 3084 | name = "security-framework" 3085 | version = "3.5.1" 3086 | source = "registry+https://github.com/rust-lang/crates.io-index" 3087 | checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" 3088 | dependencies = [ 3089 | "bitflags", 3090 | "core-foundation 0.10.1", 3091 | "core-foundation-sys", 3092 | "libc", 3093 | "security-framework-sys", 3094 | ] 3095 | 3096 | [[package]] 3097 | name = "security-framework-sys" 3098 | version = "2.15.0" 3099 | source = "registry+https://github.com/rust-lang/crates.io-index" 3100 | checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" 3101 | dependencies = [ 3102 | "core-foundation-sys", 3103 | "libc", 3104 | ] 3105 | 3106 | [[package]] 3107 | name = "semver" 3108 | version = "1.0.27" 3109 | source = "registry+https://github.com/rust-lang/crates.io-index" 3110 | checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" 3111 | 3112 | [[package]] 3113 | name = "serde" 3114 | version = "1.0.228" 3115 | source = "registry+https://github.com/rust-lang/crates.io-index" 3116 | checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" 3117 | dependencies = [ 3118 | "serde_core", 3119 | "serde_derive", 3120 | ] 3121 | 3122 | [[package]] 3123 | name = "serde-untagged" 3124 | version = "0.1.9" 3125 | source = "registry+https://github.com/rust-lang/crates.io-index" 3126 | checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" 3127 | dependencies = [ 3128 | "erased-serde", 3129 | "serde", 3130 | "serde_core", 3131 | "typeid", 3132 | ] 3133 | 3134 | [[package]] 3135 | name = "serde_core" 3136 | version = "1.0.228" 3137 | source = "registry+https://github.com/rust-lang/crates.io-index" 3138 | checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" 3139 | dependencies = [ 3140 | "serde_derive", 3141 | ] 3142 | 3143 | [[package]] 3144 | name = "serde_derive" 3145 | version = "1.0.228" 3146 | source = "registry+https://github.com/rust-lang/crates.io-index" 3147 | checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" 3148 | dependencies = [ 3149 | "proc-macro2", 3150 | "quote", 3151 | "syn", 3152 | ] 3153 | 3154 | [[package]] 3155 | name = "serde_json" 3156 | version = "1.0.145" 3157 | source = "registry+https://github.com/rust-lang/crates.io-index" 3158 | checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" 3159 | dependencies = [ 3160 | "itoa", 3161 | "memchr", 3162 | "ryu", 3163 | "serde", 3164 | "serde_core", 3165 | ] 3166 | 3167 | [[package]] 3168 | name = "serde_spanned" 3169 | version = "1.0.2" 3170 | source = "registry+https://github.com/rust-lang/crates.io-index" 3171 | checksum = "5417783452c2be558477e104686f7de5dae53dba813c28435e0e70f82d9b04ee" 3172 | dependencies = [ 3173 | "serde_core", 3174 | ] 3175 | 3176 | [[package]] 3177 | name = "serde_urlencoded" 3178 | version = "0.7.1" 3179 | source = "registry+https://github.com/rust-lang/crates.io-index" 3180 | checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 3181 | dependencies = [ 3182 | "form_urlencoded", 3183 | "itoa", 3184 | "ryu", 3185 | "serde", 3186 | ] 3187 | 3188 | [[package]] 3189 | name = "sha1" 3190 | version = "0.10.6" 3191 | source = "registry+https://github.com/rust-lang/crates.io-index" 3192 | checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" 3193 | dependencies = [ 3194 | "cfg-if", 3195 | "cpufeatures", 3196 | "digest", 3197 | ] 3198 | 3199 | [[package]] 3200 | name = "sha2" 3201 | version = "0.10.9" 3202 | source = "registry+https://github.com/rust-lang/crates.io-index" 3203 | checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" 3204 | dependencies = [ 3205 | "cfg-if", 3206 | "cpufeatures", 3207 | "digest", 3208 | ] 3209 | 3210 | [[package]] 3211 | name = "shlex" 3212 | version = "1.3.0" 3213 | source = "registry+https://github.com/rust-lang/crates.io-index" 3214 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 3215 | 3216 | [[package]] 3217 | name = "signal-hook-registry" 3218 | version = "1.4.6" 3219 | source = "registry+https://github.com/rust-lang/crates.io-index" 3220 | checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" 3221 | dependencies = [ 3222 | "libc", 3223 | ] 3224 | 3225 | [[package]] 3226 | name = "signature" 3227 | version = "1.6.4" 3228 | source = "registry+https://github.com/rust-lang/crates.io-index" 3229 | checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" 3230 | dependencies = [ 3231 | "digest", 3232 | "rand_core 0.6.4", 3233 | ] 3234 | 3235 | [[package]] 3236 | name = "simd-adler32" 3237 | version = "0.3.7" 3238 | source = "registry+https://github.com/rust-lang/crates.io-index" 3239 | checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" 3240 | 3241 | [[package]] 3242 | name = "slab" 3243 | version = "0.4.11" 3244 | source = "registry+https://github.com/rust-lang/crates.io-index" 3245 | checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" 3246 | 3247 | [[package]] 3248 | name = "smallvec" 3249 | version = "1.15.1" 3250 | source = "registry+https://github.com/rust-lang/crates.io-index" 3251 | checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" 3252 | 3253 | [[package]] 3254 | name = "socket2" 3255 | version = "0.5.10" 3256 | source = "registry+https://github.com/rust-lang/crates.io-index" 3257 | checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" 3258 | dependencies = [ 3259 | "libc", 3260 | "windows-sys 0.52.0", 3261 | ] 3262 | 3263 | [[package]] 3264 | name = "socket2" 3265 | version = "0.6.0" 3266 | source = "registry+https://github.com/rust-lang/crates.io-index" 3267 | checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" 3268 | dependencies = [ 3269 | "libc", 3270 | "windows-sys 0.59.0", 3271 | ] 3272 | 3273 | [[package]] 3274 | name = "socks" 3275 | version = "0.3.4" 3276 | source = "registry+https://github.com/rust-lang/crates.io-index" 3277 | checksum = "f0c3dbbd9ae980613c6dd8e28a9407b50509d3803b57624d5dfe8315218cd58b" 3278 | dependencies = [ 3279 | "byteorder", 3280 | "libc", 3281 | "winapi", 3282 | ] 3283 | 3284 | [[package]] 3285 | name = "spki" 3286 | version = "0.6.0" 3287 | source = "registry+https://github.com/rust-lang/crates.io-index" 3288 | checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" 3289 | dependencies = [ 3290 | "base64ct", 3291 | "der", 3292 | ] 3293 | 3294 | [[package]] 3295 | name = "stable_deref_trait" 3296 | version = "1.2.0" 3297 | source = "registry+https://github.com/rust-lang/crates.io-index" 3298 | checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 3299 | 3300 | [[package]] 3301 | name = "stringprep" 3302 | version = "0.1.5" 3303 | source = "registry+https://github.com/rust-lang/crates.io-index" 3304 | checksum = "7b4df3d392d81bd458a8a621b8bffbd2302a12ffe288a9d931670948749463b1" 3305 | dependencies = [ 3306 | "unicode-bidi", 3307 | "unicode-normalization", 3308 | "unicode-properties", 3309 | ] 3310 | 3311 | [[package]] 3312 | name = "strsim" 3313 | version = "0.11.1" 3314 | source = "registry+https://github.com/rust-lang/crates.io-index" 3315 | checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 3316 | 3317 | [[package]] 3318 | name = "subtle" 3319 | version = "2.6.1" 3320 | source = "registry+https://github.com/rust-lang/crates.io-index" 3321 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 3322 | 3323 | [[package]] 3324 | name = "syn" 3325 | version = "2.0.106" 3326 | source = "registry+https://github.com/rust-lang/crates.io-index" 3327 | checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" 3328 | dependencies = [ 3329 | "proc-macro2", 3330 | "quote", 3331 | "unicode-ident", 3332 | ] 3333 | 3334 | [[package]] 3335 | name = "sync_wrapper" 3336 | version = "1.0.2" 3337 | source = "registry+https://github.com/rust-lang/crates.io-index" 3338 | checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 3339 | dependencies = [ 3340 | "futures-core", 3341 | ] 3342 | 3343 | [[package]] 3344 | name = "synstructure" 3345 | version = "0.13.2" 3346 | source = "registry+https://github.com/rust-lang/crates.io-index" 3347 | checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" 3348 | dependencies = [ 3349 | "proc-macro2", 3350 | "quote", 3351 | "syn", 3352 | ] 3353 | 3354 | [[package]] 3355 | name = "system-configuration" 3356 | version = "0.6.1" 3357 | source = "registry+https://github.com/rust-lang/crates.io-index" 3358 | checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 3359 | dependencies = [ 3360 | "bitflags", 3361 | "core-foundation 0.9.4", 3362 | "system-configuration-sys", 3363 | ] 3364 | 3365 | [[package]] 3366 | name = "system-configuration-sys" 3367 | version = "0.6.0" 3368 | source = "registry+https://github.com/rust-lang/crates.io-index" 3369 | checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 3370 | dependencies = [ 3371 | "core-foundation-sys", 3372 | "libc", 3373 | ] 3374 | 3375 | [[package]] 3376 | name = "tar" 3377 | version = "0.4.44" 3378 | source = "registry+https://github.com/rust-lang/crates.io-index" 3379 | checksum = "1d863878d212c87a19c1a610eb53bb01fe12951c0501cf5a0d65f724914a667a" 3380 | dependencies = [ 3381 | "filetime", 3382 | "libc", 3383 | "xattr", 3384 | ] 3385 | 3386 | [[package]] 3387 | name = "tempfile" 3388 | version = "3.23.0" 3389 | source = "registry+https://github.com/rust-lang/crates.io-index" 3390 | checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" 3391 | dependencies = [ 3392 | "fastrand", 3393 | "getrandom 0.3.3", 3394 | "once_cell", 3395 | "rustix", 3396 | "windows-sys 0.61.2", 3397 | ] 3398 | 3399 | [[package]] 3400 | name = "thiserror" 3401 | version = "2.0.17" 3402 | source = "registry+https://github.com/rust-lang/crates.io-index" 3403 | checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" 3404 | dependencies = [ 3405 | "thiserror-impl", 3406 | ] 3407 | 3408 | [[package]] 3409 | name = "thiserror-impl" 3410 | version = "2.0.17" 3411 | source = "registry+https://github.com/rust-lang/crates.io-index" 3412 | checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" 3413 | dependencies = [ 3414 | "proc-macro2", 3415 | "quote", 3416 | "syn", 3417 | ] 3418 | 3419 | [[package]] 3420 | name = "time" 3421 | version = "0.3.44" 3422 | source = "registry+https://github.com/rust-lang/crates.io-index" 3423 | checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" 3424 | dependencies = [ 3425 | "deranged", 3426 | "itoa", 3427 | "num-conv", 3428 | "powerfmt", 3429 | "serde", 3430 | "time-core", 3431 | "time-macros", 3432 | ] 3433 | 3434 | [[package]] 3435 | name = "time-core" 3436 | version = "0.1.6" 3437 | source = "registry+https://github.com/rust-lang/crates.io-index" 3438 | checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" 3439 | 3440 | [[package]] 3441 | name = "time-macros" 3442 | version = "0.2.24" 3443 | source = "registry+https://github.com/rust-lang/crates.io-index" 3444 | checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" 3445 | dependencies = [ 3446 | "num-conv", 3447 | "time-core", 3448 | ] 3449 | 3450 | [[package]] 3451 | name = "tiny-keccak" 3452 | version = "2.0.2" 3453 | source = "registry+https://github.com/rust-lang/crates.io-index" 3454 | checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" 3455 | dependencies = [ 3456 | "crunchy", 3457 | ] 3458 | 3459 | [[package]] 3460 | name = "tiny_http" 3461 | version = "0.12.0" 3462 | source = "registry+https://github.com/rust-lang/crates.io-index" 3463 | checksum = "389915df6413a2e74fb181895f933386023c71110878cd0825588928e64cdc82" 3464 | dependencies = [ 3465 | "ascii", 3466 | "chunked_transfer", 3467 | "httpdate", 3468 | "log", 3469 | ] 3470 | 3471 | [[package]] 3472 | name = "tinystr" 3473 | version = "0.8.1" 3474 | source = "registry+https://github.com/rust-lang/crates.io-index" 3475 | checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" 3476 | dependencies = [ 3477 | "displaydoc", 3478 | "zerovec", 3479 | ] 3480 | 3481 | [[package]] 3482 | name = "tinyvec" 3483 | version = "1.10.0" 3484 | source = "registry+https://github.com/rust-lang/crates.io-index" 3485 | checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" 3486 | dependencies = [ 3487 | "tinyvec_macros", 3488 | ] 3489 | 3490 | [[package]] 3491 | name = "tinyvec_macros" 3492 | version = "0.1.1" 3493 | source = "registry+https://github.com/rust-lang/crates.io-index" 3494 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 3495 | 3496 | [[package]] 3497 | name = "tokio" 3498 | version = "1.47.1" 3499 | source = "registry+https://github.com/rust-lang/crates.io-index" 3500 | checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" 3501 | dependencies = [ 3502 | "backtrace", 3503 | "bytes", 3504 | "io-uring", 3505 | "libc", 3506 | "mio", 3507 | "parking_lot", 3508 | "pin-project-lite", 3509 | "signal-hook-registry", 3510 | "slab", 3511 | "socket2 0.6.0", 3512 | "tokio-macros", 3513 | "windows-sys 0.59.0", 3514 | ] 3515 | 3516 | [[package]] 3517 | name = "tokio-macros" 3518 | version = "2.5.0" 3519 | source = "registry+https://github.com/rust-lang/crates.io-index" 3520 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 3521 | dependencies = [ 3522 | "proc-macro2", 3523 | "quote", 3524 | "syn", 3525 | ] 3526 | 3527 | [[package]] 3528 | name = "tokio-native-tls" 3529 | version = "0.3.1" 3530 | source = "registry+https://github.com/rust-lang/crates.io-index" 3531 | checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 3532 | dependencies = [ 3533 | "native-tls", 3534 | "tokio", 3535 | ] 3536 | 3537 | [[package]] 3538 | name = "tokio-rustls" 3539 | version = "0.24.1" 3540 | source = "registry+https://github.com/rust-lang/crates.io-index" 3541 | checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" 3542 | dependencies = [ 3543 | "rustls 0.21.12", 3544 | "tokio", 3545 | ] 3546 | 3547 | [[package]] 3548 | name = "tokio-rustls" 3549 | version = "0.26.4" 3550 | source = "registry+https://github.com/rust-lang/crates.io-index" 3551 | checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" 3552 | dependencies = [ 3553 | "rustls 0.23.32", 3554 | "tokio", 3555 | ] 3556 | 3557 | [[package]] 3558 | name = "tokio-stream" 3559 | version = "0.1.17" 3560 | source = "registry+https://github.com/rust-lang/crates.io-index" 3561 | checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" 3562 | dependencies = [ 3563 | "futures-core", 3564 | "pin-project-lite", 3565 | "tokio", 3566 | "tokio-util", 3567 | ] 3568 | 3569 | [[package]] 3570 | name = "tokio-util" 3571 | version = "0.7.16" 3572 | source = "registry+https://github.com/rust-lang/crates.io-index" 3573 | checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" 3574 | dependencies = [ 3575 | "bytes", 3576 | "futures-core", 3577 | "futures-sink", 3578 | "pin-project-lite", 3579 | "tokio", 3580 | ] 3581 | 3582 | [[package]] 3583 | name = "toml" 3584 | version = "0.9.7" 3585 | source = "registry+https://github.com/rust-lang/crates.io-index" 3586 | checksum = "00e5e5d9bf2475ac9d4f0d9edab68cc573dc2fd644b0dba36b0c30a92dd9eaa0" 3587 | dependencies = [ 3588 | "serde_core", 3589 | "serde_spanned", 3590 | "toml_datetime", 3591 | "toml_parser", 3592 | "winnow", 3593 | ] 3594 | 3595 | [[package]] 3596 | name = "toml_datetime" 3597 | version = "0.7.2" 3598 | source = "registry+https://github.com/rust-lang/crates.io-index" 3599 | checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" 3600 | dependencies = [ 3601 | "serde_core", 3602 | ] 3603 | 3604 | [[package]] 3605 | name = "toml_parser" 3606 | version = "1.0.3" 3607 | source = "registry+https://github.com/rust-lang/crates.io-index" 3608 | checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" 3609 | dependencies = [ 3610 | "winnow", 3611 | ] 3612 | 3613 | [[package]] 3614 | name = "tonic" 3615 | version = "0.14.2" 3616 | source = "registry+https://github.com/rust-lang/crates.io-index" 3617 | checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" 3618 | dependencies = [ 3619 | "async-trait", 3620 | "axum", 3621 | "base64 0.22.1", 3622 | "bytes", 3623 | "h2 0.4.12", 3624 | "http 1.3.1", 3625 | "http-body 1.0.1", 3626 | "http-body-util", 3627 | "hyper 1.7.0", 3628 | "hyper-timeout", 3629 | "hyper-util", 3630 | "percent-encoding", 3631 | "pin-project", 3632 | "socket2 0.6.0", 3633 | "sync_wrapper", 3634 | "tokio", 3635 | "tokio-stream", 3636 | "tower", 3637 | "tower-layer", 3638 | "tower-service", 3639 | "tracing", 3640 | ] 3641 | 3642 | [[package]] 3643 | name = "tonic-build" 3644 | version = "0.14.2" 3645 | source = "registry+https://github.com/rust-lang/crates.io-index" 3646 | checksum = "4c40aaccc9f9eccf2cd82ebc111adc13030d23e887244bc9cfa5d1d636049de3" 3647 | dependencies = [ 3648 | "prettyplease", 3649 | "proc-macro2", 3650 | "quote", 3651 | "syn", 3652 | ] 3653 | 3654 | [[package]] 3655 | name = "tonic-health" 3656 | version = "0.14.2" 3657 | source = "registry+https://github.com/rust-lang/crates.io-index" 3658 | checksum = "2a82868bf299e0a1d2e8dce0dc33a46c02d6f045b2c1f1d6cc8dc3d0bf1812ef" 3659 | dependencies = [ 3660 | "prost", 3661 | "tokio", 3662 | "tokio-stream", 3663 | "tonic", 3664 | "tonic-prost", 3665 | ] 3666 | 3667 | [[package]] 3668 | name = "tonic-prost" 3669 | version = "0.14.2" 3670 | source = "registry+https://github.com/rust-lang/crates.io-index" 3671 | checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" 3672 | dependencies = [ 3673 | "bytes", 3674 | "prost", 3675 | "tonic", 3676 | ] 3677 | 3678 | [[package]] 3679 | name = "tonic-prost-build" 3680 | version = "0.14.2" 3681 | source = "registry+https://github.com/rust-lang/crates.io-index" 3682 | checksum = "b4a16cba4043dc3ff43fcb3f96b4c5c154c64cbd18ca8dce2ab2c6a451d058a2" 3683 | dependencies = [ 3684 | "prettyplease", 3685 | "proc-macro2", 3686 | "prost-build", 3687 | "prost-types", 3688 | "quote", 3689 | "syn", 3690 | "tempfile", 3691 | "tonic-build", 3692 | ] 3693 | 3694 | [[package]] 3695 | name = "tonic-reflection" 3696 | version = "0.14.2" 3697 | source = "registry+https://github.com/rust-lang/crates.io-index" 3698 | checksum = "34da53e8387581d66db16ff01f98a70b426b091fdf76856e289d5c1bd386ed7b" 3699 | dependencies = [ 3700 | "prost", 3701 | "prost-types", 3702 | "tokio", 3703 | "tokio-stream", 3704 | "tonic", 3705 | "tonic-prost", 3706 | ] 3707 | 3708 | [[package]] 3709 | name = "tower" 3710 | version = "0.5.2" 3711 | source = "registry+https://github.com/rust-lang/crates.io-index" 3712 | checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 3713 | dependencies = [ 3714 | "futures-core", 3715 | "futures-util", 3716 | "indexmap", 3717 | "pin-project-lite", 3718 | "slab", 3719 | "sync_wrapper", 3720 | "tokio", 3721 | "tokio-util", 3722 | "tower-layer", 3723 | "tower-service", 3724 | "tracing", 3725 | ] 3726 | 3727 | [[package]] 3728 | name = "tower-http" 3729 | version = "0.6.6" 3730 | source = "registry+https://github.com/rust-lang/crates.io-index" 3731 | checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" 3732 | dependencies = [ 3733 | "bitflags", 3734 | "bytes", 3735 | "futures-util", 3736 | "http 1.3.1", 3737 | "http-body 1.0.1", 3738 | "iri-string", 3739 | "pin-project-lite", 3740 | "tower", 3741 | "tower-layer", 3742 | "tower-service", 3743 | ] 3744 | 3745 | [[package]] 3746 | name = "tower-layer" 3747 | version = "0.3.3" 3748 | source = "registry+https://github.com/rust-lang/crates.io-index" 3749 | checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 3750 | 3751 | [[package]] 3752 | name = "tower-service" 3753 | version = "0.3.3" 3754 | source = "registry+https://github.com/rust-lang/crates.io-index" 3755 | checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 3756 | 3757 | [[package]] 3758 | name = "tracing" 3759 | version = "0.1.41" 3760 | source = "registry+https://github.com/rust-lang/crates.io-index" 3761 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 3762 | dependencies = [ 3763 | "pin-project-lite", 3764 | "tracing-attributes", 3765 | "tracing-core", 3766 | ] 3767 | 3768 | [[package]] 3769 | name = "tracing-attributes" 3770 | version = "0.1.30" 3771 | source = "registry+https://github.com/rust-lang/crates.io-index" 3772 | checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" 3773 | dependencies = [ 3774 | "proc-macro2", 3775 | "quote", 3776 | "syn", 3777 | ] 3778 | 3779 | [[package]] 3780 | name = "tracing-core" 3781 | version = "0.1.34" 3782 | source = "registry+https://github.com/rust-lang/crates.io-index" 3783 | checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" 3784 | dependencies = [ 3785 | "once_cell", 3786 | ] 3787 | 3788 | [[package]] 3789 | name = "try-lock" 3790 | version = "0.2.5" 3791 | source = "registry+https://github.com/rust-lang/crates.io-index" 3792 | checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 3793 | 3794 | [[package]] 3795 | name = "ttf-parser" 3796 | version = "0.25.1" 3797 | source = "registry+https://github.com/rust-lang/crates.io-index" 3798 | checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" 3799 | 3800 | [[package]] 3801 | name = "tungstenite" 3802 | version = "0.27.0" 3803 | source = "registry+https://github.com/rust-lang/crates.io-index" 3804 | checksum = "eadc29d668c91fcc564941132e17b28a7ceb2f3ebf0b9dae3e03fd7a6748eb0d" 3805 | dependencies = [ 3806 | "bytes", 3807 | "data-encoding", 3808 | "http 1.3.1", 3809 | "httparse", 3810 | "log", 3811 | "rand", 3812 | "sha1", 3813 | "thiserror", 3814 | "utf-8", 3815 | ] 3816 | 3817 | [[package]] 3818 | name = "typeid" 3819 | version = "1.0.3" 3820 | source = "registry+https://github.com/rust-lang/crates.io-index" 3821 | checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" 3822 | 3823 | [[package]] 3824 | name = "typenum" 3825 | version = "1.19.0" 3826 | source = "registry+https://github.com/rust-lang/crates.io-index" 3827 | checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" 3828 | 3829 | [[package]] 3830 | name = "typetag" 3831 | version = "0.2.21" 3832 | source = "registry+https://github.com/rust-lang/crates.io-index" 3833 | checksum = "be2212c8a9b9bcfca32024de14998494cf9a5dfa59ea1b829de98bac374b86bf" 3834 | dependencies = [ 3835 | "erased-serde", 3836 | "inventory", 3837 | "once_cell", 3838 | "serde", 3839 | "typetag-impl", 3840 | ] 3841 | 3842 | [[package]] 3843 | name = "typetag-impl" 3844 | version = "0.2.21" 3845 | source = "registry+https://github.com/rust-lang/crates.io-index" 3846 | checksum = "27a7a9b72ba121f6f1f6c3632b85604cac41aedb5ddc70accbebb6cac83de846" 3847 | dependencies = [ 3848 | "proc-macro2", 3849 | "quote", 3850 | "syn", 3851 | ] 3852 | 3853 | [[package]] 3854 | name = "ucd-trie" 3855 | version = "0.1.7" 3856 | source = "registry+https://github.com/rust-lang/crates.io-index" 3857 | checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" 3858 | 3859 | [[package]] 3860 | name = "ulid" 3861 | version = "1.2.1" 3862 | source = "registry+https://github.com/rust-lang/crates.io-index" 3863 | checksum = "470dbf6591da1b39d43c14523b2b469c86879a53e8b758c8e090a470fe7b1fbe" 3864 | dependencies = [ 3865 | "rand", 3866 | "web-time", 3867 | ] 3868 | 3869 | [[package]] 3870 | name = "unicase" 3871 | version = "2.8.1" 3872 | source = "registry+https://github.com/rust-lang/crates.io-index" 3873 | checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" 3874 | 3875 | [[package]] 3876 | name = "unicode-bidi" 3877 | version = "0.3.18" 3878 | source = "registry+https://github.com/rust-lang/crates.io-index" 3879 | checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" 3880 | 3881 | [[package]] 3882 | name = "unicode-ident" 3883 | version = "1.0.19" 3884 | source = "registry+https://github.com/rust-lang/crates.io-index" 3885 | checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" 3886 | 3887 | [[package]] 3888 | name = "unicode-normalization" 3889 | version = "0.1.24" 3890 | source = "registry+https://github.com/rust-lang/crates.io-index" 3891 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 3892 | dependencies = [ 3893 | "tinyvec", 3894 | ] 3895 | 3896 | [[package]] 3897 | name = "unicode-properties" 3898 | version = "0.1.3" 3899 | source = "registry+https://github.com/rust-lang/crates.io-index" 3900 | checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" 3901 | 3902 | [[package]] 3903 | name = "unicode-segmentation" 3904 | version = "1.12.0" 3905 | source = "registry+https://github.com/rust-lang/crates.io-index" 3906 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 3907 | 3908 | [[package]] 3909 | name = "untrusted" 3910 | version = "0.9.0" 3911 | source = "registry+https://github.com/rust-lang/crates.io-index" 3912 | checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 3913 | 3914 | [[package]] 3915 | name = "ureq" 3916 | version = "2.12.1" 3917 | source = "registry+https://github.com/rust-lang/crates.io-index" 3918 | checksum = "02d1a66277ed75f640d608235660df48c8e3c19f3b4edb6a263315626cc3c01d" 3919 | dependencies = [ 3920 | "base64 0.22.1", 3921 | "flate2", 3922 | "log", 3923 | "once_cell", 3924 | "rustls 0.23.32", 3925 | "rustls-pki-types", 3926 | "socks", 3927 | "url", 3928 | "webpki-roots 0.26.11", 3929 | ] 3930 | 3931 | [[package]] 3932 | name = "url" 3933 | version = "2.5.7" 3934 | source = "registry+https://github.com/rust-lang/crates.io-index" 3935 | checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" 3936 | dependencies = [ 3937 | "form_urlencoded", 3938 | "idna", 3939 | "percent-encoding", 3940 | "serde", 3941 | ] 3942 | 3943 | [[package]] 3944 | name = "utf-8" 3945 | version = "0.7.6" 3946 | source = "registry+https://github.com/rust-lang/crates.io-index" 3947 | checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" 3948 | 3949 | [[package]] 3950 | name = "utf8_iter" 3951 | version = "1.0.4" 3952 | source = "registry+https://github.com/rust-lang/crates.io-index" 3953 | checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 3954 | 3955 | [[package]] 3956 | name = "utf8parse" 3957 | version = "0.2.2" 3958 | source = "registry+https://github.com/rust-lang/crates.io-index" 3959 | checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" 3960 | 3961 | [[package]] 3962 | name = "uuid" 3963 | version = "1.18.1" 3964 | source = "registry+https://github.com/rust-lang/crates.io-index" 3965 | checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" 3966 | dependencies = [ 3967 | "js-sys", 3968 | "wasm-bindgen", 3969 | ] 3970 | 3971 | [[package]] 3972 | name = "vcpkg" 3973 | version = "0.2.15" 3974 | source = "registry+https://github.com/rust-lang/crates.io-index" 3975 | checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 3976 | 3977 | [[package]] 3978 | name = "version_check" 3979 | version = "0.9.5" 3980 | source = "registry+https://github.com/rust-lang/crates.io-index" 3981 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 3982 | 3983 | [[package]] 3984 | name = "vsimd" 3985 | version = "0.8.0" 3986 | source = "registry+https://github.com/rust-lang/crates.io-index" 3987 | checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" 3988 | 3989 | [[package]] 3990 | name = "want" 3991 | version = "0.3.1" 3992 | source = "registry+https://github.com/rust-lang/crates.io-index" 3993 | checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 3994 | dependencies = [ 3995 | "try-lock", 3996 | ] 3997 | 3998 | [[package]] 3999 | name = "wasi" 4000 | version = "0.11.1+wasi-snapshot-preview1" 4001 | source = "registry+https://github.com/rust-lang/crates.io-index" 4002 | checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" 4003 | 4004 | [[package]] 4005 | name = "wasi" 4006 | version = "0.14.7+wasi-0.2.4" 4007 | source = "registry+https://github.com/rust-lang/crates.io-index" 4008 | checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" 4009 | dependencies = [ 4010 | "wasip2", 4011 | ] 4012 | 4013 | [[package]] 4014 | name = "wasip2" 4015 | version = "1.0.1+wasi-0.2.4" 4016 | source = "registry+https://github.com/rust-lang/crates.io-index" 4017 | checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" 4018 | dependencies = [ 4019 | "wit-bindgen", 4020 | ] 4021 | 4022 | [[package]] 4023 | name = "wasm-bindgen" 4024 | version = "0.2.104" 4025 | source = "registry+https://github.com/rust-lang/crates.io-index" 4026 | checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" 4027 | dependencies = [ 4028 | "cfg-if", 4029 | "once_cell", 4030 | "rustversion", 4031 | "wasm-bindgen-macro", 4032 | "wasm-bindgen-shared", 4033 | ] 4034 | 4035 | [[package]] 4036 | name = "wasm-bindgen-backend" 4037 | version = "0.2.104" 4038 | source = "registry+https://github.com/rust-lang/crates.io-index" 4039 | checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" 4040 | dependencies = [ 4041 | "bumpalo", 4042 | "log", 4043 | "proc-macro2", 4044 | "quote", 4045 | "syn", 4046 | "wasm-bindgen-shared", 4047 | ] 4048 | 4049 | [[package]] 4050 | name = "wasm-bindgen-futures" 4051 | version = "0.4.54" 4052 | source = "registry+https://github.com/rust-lang/crates.io-index" 4053 | checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" 4054 | dependencies = [ 4055 | "cfg-if", 4056 | "js-sys", 4057 | "once_cell", 4058 | "wasm-bindgen", 4059 | "web-sys", 4060 | ] 4061 | 4062 | [[package]] 4063 | name = "wasm-bindgen-macro" 4064 | version = "0.2.104" 4065 | source = "registry+https://github.com/rust-lang/crates.io-index" 4066 | checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" 4067 | dependencies = [ 4068 | "quote", 4069 | "wasm-bindgen-macro-support", 4070 | ] 4071 | 4072 | [[package]] 4073 | name = "wasm-bindgen-macro-support" 4074 | version = "0.2.104" 4075 | source = "registry+https://github.com/rust-lang/crates.io-index" 4076 | checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" 4077 | dependencies = [ 4078 | "proc-macro2", 4079 | "quote", 4080 | "syn", 4081 | "wasm-bindgen-backend", 4082 | "wasm-bindgen-shared", 4083 | ] 4084 | 4085 | [[package]] 4086 | name = "wasm-bindgen-shared" 4087 | version = "0.2.104" 4088 | source = "registry+https://github.com/rust-lang/crates.io-index" 4089 | checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" 4090 | dependencies = [ 4091 | "unicode-ident", 4092 | ] 4093 | 4094 | [[package]] 4095 | name = "web-sys" 4096 | version = "0.3.81" 4097 | source = "registry+https://github.com/rust-lang/crates.io-index" 4098 | checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" 4099 | dependencies = [ 4100 | "js-sys", 4101 | "wasm-bindgen", 4102 | ] 4103 | 4104 | [[package]] 4105 | name = "web-time" 4106 | version = "1.1.0" 4107 | source = "registry+https://github.com/rust-lang/crates.io-index" 4108 | checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" 4109 | dependencies = [ 4110 | "js-sys", 4111 | "wasm-bindgen", 4112 | ] 4113 | 4114 | [[package]] 4115 | name = "webpki-roots" 4116 | version = "0.26.11" 4117 | source = "registry+https://github.com/rust-lang/crates.io-index" 4118 | checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" 4119 | dependencies = [ 4120 | "webpki-roots 1.0.3", 4121 | ] 4122 | 4123 | [[package]] 4124 | name = "webpki-roots" 4125 | version = "1.0.3" 4126 | source = "registry+https://github.com/rust-lang/crates.io-index" 4127 | checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" 4128 | dependencies = [ 4129 | "rustls-pki-types", 4130 | ] 4131 | 4132 | [[package]] 4133 | name = "weezl" 4134 | version = "0.1.10" 4135 | source = "registry+https://github.com/rust-lang/crates.io-index" 4136 | checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" 4137 | 4138 | [[package]] 4139 | name = "which" 4140 | version = "8.0.0" 4141 | source = "registry+https://github.com/rust-lang/crates.io-index" 4142 | checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" 4143 | dependencies = [ 4144 | "env_home", 4145 | "rustix", 4146 | "winsafe", 4147 | ] 4148 | 4149 | [[package]] 4150 | name = "winapi" 4151 | version = "0.3.9" 4152 | source = "registry+https://github.com/rust-lang/crates.io-index" 4153 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 4154 | dependencies = [ 4155 | "winapi-i686-pc-windows-gnu", 4156 | "winapi-x86_64-pc-windows-gnu", 4157 | ] 4158 | 4159 | [[package]] 4160 | name = "winapi-i686-pc-windows-gnu" 4161 | version = "0.4.0" 4162 | source = "registry+https://github.com/rust-lang/crates.io-index" 4163 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 4164 | 4165 | [[package]] 4166 | name = "winapi-x86_64-pc-windows-gnu" 4167 | version = "0.4.0" 4168 | source = "registry+https://github.com/rust-lang/crates.io-index" 4169 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 4170 | 4171 | [[package]] 4172 | name = "windows-core" 4173 | version = "0.62.2" 4174 | source = "registry+https://github.com/rust-lang/crates.io-index" 4175 | checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" 4176 | dependencies = [ 4177 | "windows-implement", 4178 | "windows-interface", 4179 | "windows-link 0.2.1", 4180 | "windows-result 0.4.1", 4181 | "windows-strings 0.5.1", 4182 | ] 4183 | 4184 | [[package]] 4185 | name = "windows-implement" 4186 | version = "0.60.2" 4187 | source = "registry+https://github.com/rust-lang/crates.io-index" 4188 | checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" 4189 | dependencies = [ 4190 | "proc-macro2", 4191 | "quote", 4192 | "syn", 4193 | ] 4194 | 4195 | [[package]] 4196 | name = "windows-interface" 4197 | version = "0.59.3" 4198 | source = "registry+https://github.com/rust-lang/crates.io-index" 4199 | checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" 4200 | dependencies = [ 4201 | "proc-macro2", 4202 | "quote", 4203 | "syn", 4204 | ] 4205 | 4206 | [[package]] 4207 | name = "windows-link" 4208 | version = "0.1.3" 4209 | source = "registry+https://github.com/rust-lang/crates.io-index" 4210 | checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" 4211 | 4212 | [[package]] 4213 | name = "windows-link" 4214 | version = "0.2.1" 4215 | source = "registry+https://github.com/rust-lang/crates.io-index" 4216 | checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" 4217 | 4218 | [[package]] 4219 | name = "windows-registry" 4220 | version = "0.5.3" 4221 | source = "registry+https://github.com/rust-lang/crates.io-index" 4222 | checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" 4223 | dependencies = [ 4224 | "windows-link 0.1.3", 4225 | "windows-result 0.3.4", 4226 | "windows-strings 0.4.2", 4227 | ] 4228 | 4229 | [[package]] 4230 | name = "windows-result" 4231 | version = "0.3.4" 4232 | source = "registry+https://github.com/rust-lang/crates.io-index" 4233 | checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" 4234 | dependencies = [ 4235 | "windows-link 0.1.3", 4236 | ] 4237 | 4238 | [[package]] 4239 | name = "windows-result" 4240 | version = "0.4.1" 4241 | source = "registry+https://github.com/rust-lang/crates.io-index" 4242 | checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" 4243 | dependencies = [ 4244 | "windows-link 0.2.1", 4245 | ] 4246 | 4247 | [[package]] 4248 | name = "windows-strings" 4249 | version = "0.4.2" 4250 | source = "registry+https://github.com/rust-lang/crates.io-index" 4251 | checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" 4252 | dependencies = [ 4253 | "windows-link 0.1.3", 4254 | ] 4255 | 4256 | [[package]] 4257 | name = "windows-strings" 4258 | version = "0.5.1" 4259 | source = "registry+https://github.com/rust-lang/crates.io-index" 4260 | checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" 4261 | dependencies = [ 4262 | "windows-link 0.2.1", 4263 | ] 4264 | 4265 | [[package]] 4266 | name = "windows-sys" 4267 | version = "0.52.0" 4268 | source = "registry+https://github.com/rust-lang/crates.io-index" 4269 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 4270 | dependencies = [ 4271 | "windows-targets 0.52.6", 4272 | ] 4273 | 4274 | [[package]] 4275 | name = "windows-sys" 4276 | version = "0.59.0" 4277 | source = "registry+https://github.com/rust-lang/crates.io-index" 4278 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 4279 | dependencies = [ 4280 | "windows-targets 0.52.6", 4281 | ] 4282 | 4283 | [[package]] 4284 | name = "windows-sys" 4285 | version = "0.60.2" 4286 | source = "registry+https://github.com/rust-lang/crates.io-index" 4287 | checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" 4288 | dependencies = [ 4289 | "windows-targets 0.53.5", 4290 | ] 4291 | 4292 | [[package]] 4293 | name = "windows-sys" 4294 | version = "0.61.2" 4295 | source = "registry+https://github.com/rust-lang/crates.io-index" 4296 | checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" 4297 | dependencies = [ 4298 | "windows-link 0.2.1", 4299 | ] 4300 | 4301 | [[package]] 4302 | name = "windows-targets" 4303 | version = "0.52.6" 4304 | source = "registry+https://github.com/rust-lang/crates.io-index" 4305 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 4306 | dependencies = [ 4307 | "windows_aarch64_gnullvm 0.52.6", 4308 | "windows_aarch64_msvc 0.52.6", 4309 | "windows_i686_gnu 0.52.6", 4310 | "windows_i686_gnullvm 0.52.6", 4311 | "windows_i686_msvc 0.52.6", 4312 | "windows_x86_64_gnu 0.52.6", 4313 | "windows_x86_64_gnullvm 0.52.6", 4314 | "windows_x86_64_msvc 0.52.6", 4315 | ] 4316 | 4317 | [[package]] 4318 | name = "windows-targets" 4319 | version = "0.53.5" 4320 | source = "registry+https://github.com/rust-lang/crates.io-index" 4321 | checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" 4322 | dependencies = [ 4323 | "windows-link 0.2.1", 4324 | "windows_aarch64_gnullvm 0.53.1", 4325 | "windows_aarch64_msvc 0.53.1", 4326 | "windows_i686_gnu 0.53.1", 4327 | "windows_i686_gnullvm 0.53.1", 4328 | "windows_i686_msvc 0.53.1", 4329 | "windows_x86_64_gnu 0.53.1", 4330 | "windows_x86_64_gnullvm 0.53.1", 4331 | "windows_x86_64_msvc 0.53.1", 4332 | ] 4333 | 4334 | [[package]] 4335 | name = "windows_aarch64_gnullvm" 4336 | version = "0.52.6" 4337 | source = "registry+https://github.com/rust-lang/crates.io-index" 4338 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 4339 | 4340 | [[package]] 4341 | name = "windows_aarch64_gnullvm" 4342 | version = "0.53.1" 4343 | source = "registry+https://github.com/rust-lang/crates.io-index" 4344 | checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" 4345 | 4346 | [[package]] 4347 | name = "windows_aarch64_msvc" 4348 | version = "0.52.6" 4349 | source = "registry+https://github.com/rust-lang/crates.io-index" 4350 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 4351 | 4352 | [[package]] 4353 | name = "windows_aarch64_msvc" 4354 | version = "0.53.1" 4355 | source = "registry+https://github.com/rust-lang/crates.io-index" 4356 | checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" 4357 | 4358 | [[package]] 4359 | name = "windows_i686_gnu" 4360 | version = "0.52.6" 4361 | source = "registry+https://github.com/rust-lang/crates.io-index" 4362 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 4363 | 4364 | [[package]] 4365 | name = "windows_i686_gnu" 4366 | version = "0.53.1" 4367 | source = "registry+https://github.com/rust-lang/crates.io-index" 4368 | checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" 4369 | 4370 | [[package]] 4371 | name = "windows_i686_gnullvm" 4372 | version = "0.52.6" 4373 | source = "registry+https://github.com/rust-lang/crates.io-index" 4374 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 4375 | 4376 | [[package]] 4377 | name = "windows_i686_gnullvm" 4378 | version = "0.53.1" 4379 | source = "registry+https://github.com/rust-lang/crates.io-index" 4380 | checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" 4381 | 4382 | [[package]] 4383 | name = "windows_i686_msvc" 4384 | version = "0.52.6" 4385 | source = "registry+https://github.com/rust-lang/crates.io-index" 4386 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 4387 | 4388 | [[package]] 4389 | name = "windows_i686_msvc" 4390 | version = "0.53.1" 4391 | source = "registry+https://github.com/rust-lang/crates.io-index" 4392 | checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" 4393 | 4394 | [[package]] 4395 | name = "windows_x86_64_gnu" 4396 | version = "0.52.6" 4397 | source = "registry+https://github.com/rust-lang/crates.io-index" 4398 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 4399 | 4400 | [[package]] 4401 | name = "windows_x86_64_gnu" 4402 | version = "0.53.1" 4403 | source = "registry+https://github.com/rust-lang/crates.io-index" 4404 | checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" 4405 | 4406 | [[package]] 4407 | name = "windows_x86_64_gnullvm" 4408 | version = "0.52.6" 4409 | source = "registry+https://github.com/rust-lang/crates.io-index" 4410 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 4411 | 4412 | [[package]] 4413 | name = "windows_x86_64_gnullvm" 4414 | version = "0.53.1" 4415 | source = "registry+https://github.com/rust-lang/crates.io-index" 4416 | checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" 4417 | 4418 | [[package]] 4419 | name = "windows_x86_64_msvc" 4420 | version = "0.52.6" 4421 | source = "registry+https://github.com/rust-lang/crates.io-index" 4422 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 4423 | 4424 | [[package]] 4425 | name = "windows_x86_64_msvc" 4426 | version = "0.53.1" 4427 | source = "registry+https://github.com/rust-lang/crates.io-index" 4428 | checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" 4429 | 4430 | [[package]] 4431 | name = "winnow" 4432 | version = "0.7.13" 4433 | source = "registry+https://github.com/rust-lang/crates.io-index" 4434 | checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" 4435 | dependencies = [ 4436 | "memchr", 4437 | ] 4438 | 4439 | [[package]] 4440 | name = "winreg" 4441 | version = "0.55.0" 4442 | source = "registry+https://github.com/rust-lang/crates.io-index" 4443 | checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" 4444 | dependencies = [ 4445 | "cfg-if", 4446 | "windows-sys 0.59.0", 4447 | ] 4448 | 4449 | [[package]] 4450 | name = "winsafe" 4451 | version = "0.0.19" 4452 | source = "registry+https://github.com/rust-lang/crates.io-index" 4453 | checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" 4454 | 4455 | [[package]] 4456 | name = "wit-bindgen" 4457 | version = "0.46.0" 4458 | source = "registry+https://github.com/rust-lang/crates.io-index" 4459 | checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" 4460 | 4461 | [[package]] 4462 | name = "writeable" 4463 | version = "0.6.1" 4464 | source = "registry+https://github.com/rust-lang/crates.io-index" 4465 | checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" 4466 | 4467 | [[package]] 4468 | name = "xattr" 4469 | version = "1.6.1" 4470 | source = "registry+https://github.com/rust-lang/crates.io-index" 4471 | checksum = "32e45ad4206f6d2479085147f02bc2ef834ac85886624a23575ae137c8aa8156" 4472 | dependencies = [ 4473 | "libc", 4474 | "rustix", 4475 | ] 4476 | 4477 | [[package]] 4478 | name = "xmlparser" 4479 | version = "0.13.6" 4480 | source = "registry+https://github.com/rust-lang/crates.io-index" 4481 | checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" 4482 | 4483 | [[package]] 4484 | name = "yaml-rust2" 4485 | version = "0.10.4" 4486 | source = "registry+https://github.com/rust-lang/crates.io-index" 4487 | checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9" 4488 | dependencies = [ 4489 | "arraydeque", 4490 | "encoding_rs", 4491 | "hashlink", 4492 | ] 4493 | 4494 | [[package]] 4495 | name = "yoke" 4496 | version = "0.8.0" 4497 | source = "registry+https://github.com/rust-lang/crates.io-index" 4498 | checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" 4499 | dependencies = [ 4500 | "serde", 4501 | "stable_deref_trait", 4502 | "yoke-derive", 4503 | "zerofrom", 4504 | ] 4505 | 4506 | [[package]] 4507 | name = "yoke-derive" 4508 | version = "0.8.0" 4509 | source = "registry+https://github.com/rust-lang/crates.io-index" 4510 | checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" 4511 | dependencies = [ 4512 | "proc-macro2", 4513 | "quote", 4514 | "syn", 4515 | "synstructure", 4516 | ] 4517 | 4518 | [[package]] 4519 | name = "zerocopy" 4520 | version = "0.8.27" 4521 | source = "registry+https://github.com/rust-lang/crates.io-index" 4522 | checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" 4523 | dependencies = [ 4524 | "zerocopy-derive", 4525 | ] 4526 | 4527 | [[package]] 4528 | name = "zerocopy-derive" 4529 | version = "0.8.27" 4530 | source = "registry+https://github.com/rust-lang/crates.io-index" 4531 | checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" 4532 | dependencies = [ 4533 | "proc-macro2", 4534 | "quote", 4535 | "syn", 4536 | ] 4537 | 4538 | [[package]] 4539 | name = "zerofrom" 4540 | version = "0.1.6" 4541 | source = "registry+https://github.com/rust-lang/crates.io-index" 4542 | checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 4543 | dependencies = [ 4544 | "zerofrom-derive", 4545 | ] 4546 | 4547 | [[package]] 4548 | name = "zerofrom-derive" 4549 | version = "0.1.6" 4550 | source = "registry+https://github.com/rust-lang/crates.io-index" 4551 | checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 4552 | dependencies = [ 4553 | "proc-macro2", 4554 | "quote", 4555 | "syn", 4556 | "synstructure", 4557 | ] 4558 | 4559 | [[package]] 4560 | name = "zeroize" 4561 | version = "1.8.2" 4562 | source = "registry+https://github.com/rust-lang/crates.io-index" 4563 | checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" 4564 | 4565 | [[package]] 4566 | name = "zerotrie" 4567 | version = "0.2.2" 4568 | source = "registry+https://github.com/rust-lang/crates.io-index" 4569 | checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" 4570 | dependencies = [ 4571 | "displaydoc", 4572 | "yoke", 4573 | "zerofrom", 4574 | ] 4575 | 4576 | [[package]] 4577 | name = "zerovec" 4578 | version = "0.11.4" 4579 | source = "registry+https://github.com/rust-lang/crates.io-index" 4580 | checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" 4581 | dependencies = [ 4582 | "yoke", 4583 | "zerofrom", 4584 | "zerovec-derive", 4585 | ] 4586 | 4587 | [[package]] 4588 | name = "zerovec-derive" 4589 | version = "0.11.1" 4590 | source = "registry+https://github.com/rust-lang/crates.io-index" 4591 | checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" 4592 | dependencies = [ 4593 | "proc-macro2", 4594 | "quote", 4595 | "syn", 4596 | ] 4597 | --------------------------------------------------------------------------------