diff --git a/skills/cuopt-numerical-optimization-api-c/BENCHMARK.md b/skills/cuopt-numerical-optimization-api-c/BENCHMARK.md new file mode 100644 index 0000000000..3282d70d64 --- /dev/null +++ b/skills/cuopt-numerical-optimization-api-c/BENCHMARK.md @@ -0,0 +1,87 @@ +# Evaluation Report + +Evaluation of the `cuopt-numerical-optimization-api-c` skill before publication through NVSkills-Eval. + +This benchmark summarizes 3-Tier Evaluation from NVSkills-Eval results for the skill. The goal is to document whether the skill is safe, discoverable, effective, and useful for agents before it is published for broader workflow use. + +## Evaluation Summary + +- Skill: `cuopt-numerical-optimization-api-c` +- Evaluation date: 2026-05-28 +- NVSkills-Eval profile: `external` +- Environment: `local` +- Dataset: 1 evaluation tasks +- Attempts per task: 2 +- Pass threshold: 50% +- Overall verdict: PASS + +## Agents Used + +- `claude-code` +- `codex` + +## Metrics Used + +Reported benchmark dimensions: + +- Security: checks whether skill-assisted execution avoids unsafe behavior such as secret leakage, destructive commands, or unauthorized access. +- Correctness: checks whether the agent follows the expected workflow and produces the correct final output. +- Discoverability: checks whether the agent loads the skill when relevant and avoids using it when irrelevant. +- Effectiveness: checks whether the agent performs measurably better with the skill than without it. +- Efficiency: checks whether the agent uses fewer tokens and avoids redundant work. + +Underlying evaluation signals used in this run: + +- `skill_execution` (Skill Execution): verifies that the agent loaded the expected skill and workflow. +- `skill_efficiency` (Efficiency): checks routing quality, decoy avoidance, and redundant tool usage. +- `accuracy` (Accuracy): grades final-answer correctness against the reference answer. +- `goal_accuracy` (Goal Accuracy): checks whether the overall user task completed successfully. +- `behavior_check` (Behavior Check): verifies expected behavior steps, including safety expectations. +- `token_efficiency` (Token Efficiency): compares token usage with and without the skill. + +## Test Tasks + +The benchmark dataset contained 1 evaluation tasks: + +- Positive tasks: 1 tasks where the skill was expected to activate. +- Negative tasks: 0 tasks where no skill was expected. +- Unlabeled tasks: 0 tasks where positive/negative intent could not be inferred. + +Task composition is derived from the evaluation dataset when possible. Entries with `expected_skill` set are treated as positive skill-activation cases, while entries with `expected_skill: null` are treated as negative activation cases. + +## Results + +| Dimension | Num | `claude-code` | `codex` | +|---|---:|---:|---:| +| Security | 2 | 100% (+0%) | 100% (+25%) | +| Correctness | 2 | 100% (+0%) | 92% (-5%) | +| Discoverability | 2 | 100% (+5%) | 80% (+8%) | +| Effectiveness | 2 | 95% (-1%) | 92% (+9%) | +| Efficiency | 2 | 93% (+13%) | 73% (+17%) | + +Score values show skill-assisted performance. Values in parentheses show uplift versus the no-skill baseline when baseline data is available. + +## Tier 1: Static Validation Summary + +Tier 1 validation passed with observations. NVSkills-Eval ran 9 checks and found 9 total findings. + +Top findings: + +- MEDIUM QUALITY/quality_efficiency: Deeply nested references in examples.md (`skills/cuopt-numerical-optimization-api-c/SKILL.md`) +- MEDIUM SCHEMA/body_recommended_section: Missing recommended section: '## Instructions' (`skills/cuopt-numerical-optimization-api-c/SKILL.md`) +- LOW QUALITY/quality_discoverability: No '## Purpose' section (`skills/cuopt-numerical-optimization-api-c/SKILL.md`) +- LOW QUALITY/quality_reliability: No prerequisites/requirements documented (`skills/cuopt-numerical-optimization-api-c/SKILL.md`) +- LOW QUALITY/quality_reliability: No limitations documented (`skills/cuopt-numerical-optimization-api-c/SKILL.md`) + +## Tier 2: Deduplication Summary + +Tier 2 validation passed. NVSkills-Eval ran 2 checks and found 0 total findings. + +Notable observations: + +- Context Deduplication: Collected 9 file(s) +- Inter-Skill Deduplication: Parsed skill 'cuopt-numerical-optimization-api-c': 105 char description + +## Publication Recommendation + +The skill is suitable to proceed toward NVSkills-Eval publication based on this benchmark. Skill owners should keep this file with the skill and refresh it when the evaluation dataset, skill behavior, or target agents materially change. diff --git a/skills/cuopt-numerical-optimization-api-c/SKILL.md b/skills/cuopt-numerical-optimization-api-c/SKILL.md index 8df93f8307..b25acc14ba 100644 --- a/skills/cuopt-numerical-optimization-api-c/SKILL.md +++ b/skills/cuopt-numerical-optimization-api-c/SKILL.md @@ -22,28 +22,9 @@ Confirm problem type and formulation (variables, objective, constraints, variabl This skill is **C only**. -## Quick Reference: C API - -```c -#include - -// CSR format for constraints -cuopt_int_t row_offsets[] = {0, 2, 4}; -cuopt_int_t col_indices[] = {0, 1, 0, 1}; -cuopt_float_t values[] = {2.0, 3.0, 4.0, 2.0}; -char var_types[] = {CUOPT_CONTINUOUS, CUOPT_INTEGER}; - -cuOptCreateRangedProblem( - num_constraints, num_variables, CUOPT_MINIMIZE, - 0.0, objective_coefficients, - row_offsets, col_indices, values, - constraint_lower, constraint_upper, - var_lower, var_upper, var_types, - &problem -); -cuOptSolve(problem, settings, &solution); -cuOptGetObjectiveValue(solution, &obj_value); -``` +## API Call Sequence + +For LP/MILP, the ordered C entry points are: `cuOptCreateRangedProblem` (sense `CUOPT_MINIMIZE` / `CUOPT_MAXIMIZE`, CSR constraint matrix as `row_offsets` / `col_indices` / `values`, `var_types` char array using `CUOPT_CONTINUOUS` / `CUOPT_INTEGER` macros) → `cuOptSolve(problem, settings, &solution)` → `cuOptGetObjectiveValue(solution, &obj_value)` → matching `cuOptDestroy*` calls. Include ``. Full ordered code with build instructions in [references/examples.md](references/examples.md). ## QP via C API (beta) diff --git a/skills/cuopt-numerical-optimization-api-c/evals/evals.json b/skills/cuopt-numerical-optimization-api-c/evals/evals.json new file mode 100644 index 0000000000..9f9cecf974 --- /dev/null +++ b/skills/cuopt-numerical-optimization-api-c/evals/evals.json @@ -0,0 +1,13 @@ +[ + { + "id": "numopt-c-eval-001-milp-api-call-sequence", + "question": "I want to solve a small MILP (some integer variables, linear objective, linear constraints) with the cuOpt C API. List the C functions and structs I need in order — names only, one line each, no full source.", + "expected_skill": "cuopt-numerical-optimization-api-c", + "expected_script": null, + "ground_truth": "The agent produces an ordered list of C API entry points without writing a full source file: include cuopt/linear_programming/cuopt_c.h, then call cuOptCreateRangedProblem with sense CUOPT_MINIMIZE or CUOPT_MAXIMIZE, then cuOptSolve(problem, settings, &solution), then cuOptGetObjectiveValue.", + "expected_behavior": [ + "Lists C API call sequence without writing a complete source file", + "Names cuOptCreateRangedProblem, cuOptSolve, cuOptGetObjectiveValue in order" + ] + } +] diff --git a/skills/cuopt-numerical-optimization-api-c/references/examples.md b/skills/cuopt-numerical-optimization-api-c/references/examples.md index 529e67df90..8e8e7cd4e6 100644 --- a/skills/cuopt-numerical-optimization-api-c/references/examples.md +++ b/skills/cuopt-numerical-optimization-api-c/references/examples.md @@ -46,17 +46,31 @@ int main() { // Constraint matrix in CSR format cuopt_int_t row_offsets[] = {0, 2, 4}; cuopt_int_t column_indices[] = {0, 1, 0, 1}; - cuopt_float_t values[] = {3.0, 4.0, 2.7, 10.1}; + cuopt_float_t values[] = { + 3.0, + 4.0, + 2.7, + 10.1 + }; // Objective coefficients - cuopt_float_t objective_coefficients[] = {-0.2, 0.1}; + cuopt_float_t objective_coefficients[] = { + -0.2, + 0.1 + }; // Constraint bounds (lower <= Ax <= upper) - cuopt_float_t constraint_upper_bounds[] = {5.4, 4.9}; + cuopt_float_t constraint_upper_bounds[] = { + 5.4, + 4.9 + }; cuopt_float_t constraint_lower_bounds[] = {-CUOPT_INFINITY, -CUOPT_INFINITY}; // Variable bounds - cuopt_float_t var_lower_bounds[] = {0.0, 0.0}; + cuopt_float_t var_lower_bounds[] = { + 0.0, + 0.0 + }; cuopt_float_t var_upper_bounds[] = {CUOPT_INFINITY, CUOPT_INFINITY}; // Variable types @@ -140,12 +154,26 @@ int main() { cuopt_int_t row_offsets[] = {0, 2, 4}; cuopt_int_t column_indices[] = {0, 1, 0, 1}; - cuopt_float_t values[] = {3.0, 4.0, 2.7, 10.1}; - - cuopt_float_t objective_coefficients[] = {-0.2, 0.1}; - cuopt_float_t constraint_upper[] = {5.4, 4.9}; + cuopt_float_t values[] = { + 3.0, + 4.0, + 2.7, + 10.1 + }; + + cuopt_float_t objective_coefficients[] = { + -0.2, + 0.1 + }; + cuopt_float_t constraint_upper[] = { + 5.4, + 4.9 + }; cuopt_float_t constraint_lower[] = {-CUOPT_INFINITY, -CUOPT_INFINITY}; - cuopt_float_t var_lower[] = {0.0, 0.0}; + cuopt_float_t var_lower[] = { + 0.0, + 0.0 + }; cuopt_float_t var_upper[] = {CUOPT_INFINITY, CUOPT_INFINITY}; // x1 = INTEGER, x2 = CONTINUOUS @@ -202,17 +230,9 @@ cleanup: ## Build & Run -```bash -# Set paths (conda example) -export INCLUDE_PATH="${CONDA_PREFIX}/include" -export LIB_PATH="${CONDA_PREFIX}/lib" - -# Compile -gcc -I${INCLUDE_PATH} -L${LIB_PATH} -o lp_example lp_example.c -lcuopt - -# Run -LD_LIBRARY_PATH=${LIB_PATH}:$LD_LIBRARY_PATH ./lp_example -``` +See [`assets/README.md`](../assets/README.md) for the canonical conda-env +include/library/`LD_LIBRARY_PATH` setup, plus a `gcc` build command. The +same recipe applies here — substitute `lp_example.c` for the file name. ## Constants Reference diff --git a/skills/cuopt-numerical-optimization-api-c/skill-card.md b/skills/cuopt-numerical-optimization-api-c/skill-card.md index 7d8d5915c9..a1230145ae 100644 --- a/skills/cuopt-numerical-optimization-api-c/skill-card.md +++ b/skills/cuopt-numerical-optimization-api-c/skill-card.md @@ -3,12 +3,13 @@ LP, MILP, and QP (beta) with cuOpt — C API only. Use when the user is embeddin This skill is ready for commercial/non-commercial use.
-## Owner: NVIDIA
+## Owner +NVIDIA
### License/Terms of Use:
Apache 2.0
## Use Case:
-Developers and engineers embedding linear programming (LP), mixed-integer linear programming (MILP), or quadratic programming (QP) solvers into C/C++ applications using the NVIDIA cuOpt C API.
+Developers and engineers embedding linear programming, mixed-integer linear programming, or quadratic programming solvers in C/C++ applications using the NVIDIA cuOpt GPU-accelerated optimization library.
### Deployment Geography for Use:
Global
@@ -18,8 +19,9 @@ Risk: Review before execution as proposals could introduce incorrect or misleadi Mitigation: Review and scan skill before deployment.
## Reference(s):
-- [C API Examples (LP/MILP)](references/examples.md)
+- [examples.md](references/examples.md)
- [cuOpt User Guide](https://docs.nvidia.com/cuopt/user-guide/latest/introduction.html)
+- [cuopt-examples](https://github.com/NVIDIA/cuopt-examples)
## Skill Output:
@@ -28,6 +30,42 @@ Mitigation: Review and scan skill before deployment.
**Output Parameters:** [1D]
**Other Properties Related to Output:** [None]
+## Evaluation Agents Used:
+- claude-code
+- codex
+ + + +## Evaluation Tasks:
+Evaluated against 1 evaluation task (positive skill-activation case) with 2 attempts per task via NVSkills-Eval 3-Tier Evaluation.
+ +## Evaluation Metrics Used:
+Reported benchmark dimensions:
+- Security: Checks whether skill-assisted execution avoids unsafe behavior such as secret leakage, destructive commands, or unauthorized access.
+- Correctness: Checks whether the agent follows the expected workflow and produces the correct final output.
+- Discoverability: Checks whether the agent loads the skill when relevant and avoids using it when irrelevant.
+- Effectiveness: Checks whether the agent performs measurably better with the skill than without it.
+- Efficiency: Checks whether the agent uses fewer tokens and avoids redundant work.
+ +Underlying evaluation signals used in this run:
+- `skill_execution`: Verifies that the agent loaded the expected skill and workflow.
+- `skill_efficiency`: Checks routing quality, decoy avoidance, and redundant tool usage.
+- `accuracy`: Grades final-answer correctness against the reference answer.
+- `goal_accuracy`: Checks whether the overall user task completed successfully.
+- `behavior_check`: Verifies expected behavior steps, including safety expectations.
+- `token_efficiency`: Compares token usage with and without the skill.
+ + + +## Evaluation Results:
+| Dimension | Num | `claude-code` | `codex` | +|---|---:|---:|---:| +| Security | 2 | 100% (+0%) | 100% (+25%) | +| Correctness | 2 | 100% (+0%) | 92% (-5%) | +| Discoverability | 2 | 100% (+5%) | 80% (+8%) | +| Effectiveness | 2 | 95% (-1%) | 92% (+9%) | +| Efficiency | 2 | 93% (+13%) | 73% (+17%) | + ## Skill Version(s):
26.08.00 (source: frontmatter)
diff --git a/skills/cuopt-numerical-optimization-api-c/skill.oms.sig b/skills/cuopt-numerical-optimization-api-c/skill.oms.sig index 6af77bd987..fd8f469446 100644 --- a/skills/cuopt-numerical-optimization-api-c/skill.oms.sig +++ b/skills/cuopt-numerical-optimization-api-c/skill.oms.sig @@ -1 +1 @@ -{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiY3VvcHQtbnVtZXJpY2FsLW9wdGltaXphdGlvbi1hcGktYyIsCiAgICAgICJkaWdlc3QiOiB7CiAgICAgICAgInNoYTI1NiI6ICJhYmMwNmQ3YzZlMDA0ODQ0ZTg1MTFlNjVkMzdhMjg1YTg4NzdmM2FkNWE3ZmJjNzQ1N2ZkZWE4NWM3NmNjMDJhIgogICAgICB9CiAgICB9CiAgXSwKICAicHJlZGljYXRlVHlwZSI6ICJodHRwczovL21vZGVsX3NpZ25pbmcvc2lnbmF0dXJlL3YxLjAiLAogICJwcmVkaWNhdGUiOiB7CiAgICAic2VyaWFsaXphdGlvbiI6IHsKICAgICAgImlnbm9yZV9wYXRocyI6IFsKICAgICAgICAiLmdpdGh1YiIsCiAgICAgICAgIi5naXRhdHRyaWJ1dGVzIiwKICAgICAgICAiLmdpdGlnbm9yZSIsCiAgICAgICAgIi5naXQiCiAgICAgIF0sCiAgICAgICJoYXNoX3R5cGUiOiAic2hhMjU2IiwKICAgICAgIm1ldGhvZCI6ICJmaWxlcyIsCiAgICAgICJhbGxvd19zeW1saW5rcyI6IGZhbHNlCiAgICB9LAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogIjI3MDYwNTM1NzNkMWI1NjhhZTFhODA4NGQwYjI5MTMxYWQ3ZWFhOTYwNjYwZGVjNzk0ODNmZDNmZmU1ZjE0NGUiLAogICAgICAgICJuYW1lIjogIlNLSUxMLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiODAwODA2NTNmNmI0ZjkwZjRhNDRmMTJmNjcwNWM3YjkzM2U2YmY1NTg2ZDcyMWQ1MzZhNDE3ZWEzMDk5Yjk5ZCIsCiAgICAgICAgIm5hbWUiOiAiYXNzZXRzL1JFQURNRS5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogImJhNGJjMzUwMjRjYjJlMmZlYTU3OTIyNGMyMWY3YjU2MTRiOWYxZTBlNDVlZjQxMGZkZmQ2YjJlYTk3MjRjMzYiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9scF9iYXNpYy9SRUFETUUubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI2OGY0NTE4MzRjYTA5N2JmNDQyY2JjNTY3N2I0MzUxYWQ3NjU2MzU1NTBjN2FiOWZiNDhlNzM3OTRiZjkxYjg5IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbHBfYmFzaWMvbHBfc2ltcGxlLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICJiOWQzMGMwZjVmZDA5MDcxOWI2NzJkODlmM2YzNmI3YTRkZDAwY2UxZTA2YWY2NWRhMDdlOWE3ZmM3YjQ1MTc3IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbHBfZHVhbHMvUkVBRE1FLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiMGU5MDAyZWExOGZkNTQ5ZDM4NmMxMmQyYTBiMDE0YTBlZDA4ZTU0ZjE1NzU4OGI4ODkyMzNmMmIxNWVkNzIyZSIsCiAgICAgICAgIm5hbWUiOiAiYXNzZXRzL2xwX2R1YWxzL2xwX2R1YWxzLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI4ZWIxOTM4MGI0OWM0MTAzNmJmMGUyZWQ0ZGMyYTkxYTllZjNiYzY5OWMwMDM2MmI4YjdlYTk4M2Q5YWNhZDQzIiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbHBfd2FybXN0YXJ0L1JFQURNRS5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogImM4ZjlmMzBkNmJmNTk5NTVmZTIxMzM0OWU1M2M2YmE5YWM1NWZlNmUzOTg4YWYzZGE1ZjM0Y2NjZWFkYzMyYjUiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9taWxwX2Jhc2ljL1JFQURNRS5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogIjQ2ZTBmNzRlOWU1ODIxNTgxYTU0OTExZGFmYzY1M2U3ZWExMzQ0MGM5ZDdiOWY2MmRjMmRkMDI2NDU3NzZhZTEiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9taWxwX2Jhc2ljL21pbHBfc2ltcGxlLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI0NmRkOWIzM2U4NmE4MTU2YjIyZjhjNjQ5NDRhYWMwODkxYWUxNjZkNGQ4M2Y2YTNmNjU0YTNlYzYxZmMxMDdjIiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbWlscF9wcm9kdWN0aW9uX3BsYW5uaW5nL1JFQURNRS5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogImY3MWRhODBlMDBiNDliYmFiZjYyZjcyN2ExZDlkNDhlZmIyZTE4NDIxZTgzM2YzYjZjNTMzYzViMmI4NmQzNjQiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9taWxwX3Byb2R1Y3Rpb25fcGxhbm5pbmcvbWlscF9wcm9kdWN0aW9uLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI3NmQ2NTA2MzE5NjRjZjhiMmFkMzc5YTBjMjVhNjE3MzlkNWRjYjBkMjc0NjI3NmFiZGM2ODA1ZDc2ZWVlNGRjIiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbXBzX3NvbHZlci9SRUFETUUubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICIzMGIzZjg3MTkxODE2MGU5YzFjNWU3NjBlMzllOWU1YTk3M2U1MWFhYWQwOTc5ODc2NWM4Y2E3NDE2NDFiYjA0IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbXBzX3NvbHZlci9kYXRhL3NhbXBsZS5tcHMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI4MTc1ODdmMzBlNWE3MTNhMzI2NTEzZmIyNTAwYzA1YjkwMjU4MTQ3Y2YxNmMxOTQ0OTc0NDBiMDAyYmQxYTU4IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbXBzX3NvbHZlci9tcHNfc29sdmVyLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI5Mjg2ZWNiYTg2N2U4NGEwZmZhY2FiY2QxMjYyOTdlZDIwZGE3MDdlOWRkODZlYWNhMzYzNjY4NTA3YzQzYzRlIiwKICAgICAgICAibmFtZSI6ICJyZWZlcmVuY2VzL2V4YW1wbGVzLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiNGMzMDU1OWI1OTI2ZDVhMDNhYmY4OTkxMjIzZWQ0NjAxNTM2Mzg2M2RjOGZjNDQ5MjdjMmUwY2MzZWJiYmE0YyIsCiAgICAgICAgIm5hbWUiOiAic2tpbGwtY2FyZC5tZCIKICAgICAgfQogICAgXQogIH0KfQ==","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGUCMBwfLNMEpXSJ4rw5KCv3t5mxSLrdf8kD9KyB3EnG6M5e6PutGBCR0psNNGGHlK8zCwIxAIn0p4MnMSi5ObJGHN6s/jAaY2CDAnXEgMHmx6REVEvbPrPjCKSdu87TdyrCqt0ZWA==","keyid":""}]}} \ No newline at end of file +{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiY3VvcHQtbnVtZXJpY2FsLW9wdGltaXphdGlvbi1hcGktYyIsCiAgICAgICJkaWdlc3QiOiB7CiAgICAgICAgInNoYTI1NiI6ICIyMDkwYzU2ZWJlMTJiOWY4MWQyYWVjZTZhYzNiZTk2ODRiOTQ1YzVjNjVkMDJkN2Q4OGIzZTM4OTU0NjI2MjczIgogICAgICB9CiAgICB9CiAgXSwKICAicHJlZGljYXRlVHlwZSI6ICJodHRwczovL21vZGVsX3NpZ25pbmcvc2lnbmF0dXJlL3YxLjAiLAogICJwcmVkaWNhdGUiOiB7CiAgICAic2VyaWFsaXphdGlvbiI6IHsKICAgICAgImlnbm9yZV9wYXRocyI6IFsKICAgICAgICAiLmdpdCIsCiAgICAgICAgIi5naXRodWIiLAogICAgICAgICIuZ2l0YXR0cmlidXRlcyIsCiAgICAgICAgIi5naXRpZ25vcmUiCiAgICAgIF0sCiAgICAgICJtZXRob2QiOiAiZmlsZXMiLAogICAgICAiaGFzaF90eXBlIjogInNoYTI1NiIsCiAgICAgICJhbGxvd19zeW1saW5rcyI6IGZhbHNlCiAgICB9LAogICAgInJlc291cmNlcyI6IFsKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogIjA1ZjlmNTBhZDY0YTNjNDk1YzIwZTAyNTY2Nzk2ZDA0M2YyZGFiYzU2MWUxMTg0ZmMwM2E5OTg1NjBmZmRjNGIiLAogICAgICAgICJuYW1lIjogIkJFTkNITUFSSy5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogIjljYjgwZWE4MGIwNWE0NTQ4YWMxNWE5MThhMTNiNzYyMmZiZmQ1YTI0N2QyMTRiZGMyMzVkMzg3MDM3YjRkNGMiLAogICAgICAgICJuYW1lIjogIlNLSUxMLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiODAwODA2NTNmNmI0ZjkwZjRhNDRmMTJmNjcwNWM3YjkzM2U2YmY1NTg2ZDcyMWQ1MzZhNDE3ZWEzMDk5Yjk5ZCIsCiAgICAgICAgIm5hbWUiOiAiYXNzZXRzL1JFQURNRS5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogImJhNGJjMzUwMjRjYjJlMmZlYTU3OTIyNGMyMWY3YjU2MTRiOWYxZTBlNDVlZjQxMGZkZmQ2YjJlYTk3MjRjMzYiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9scF9iYXNpYy9SRUFETUUubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI2OGY0NTE4MzRjYTA5N2JmNDQyY2JjNTY3N2I0MzUxYWQ3NjU2MzU1NTBjN2FiOWZiNDhlNzM3OTRiZjkxYjg5IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbHBfYmFzaWMvbHBfc2ltcGxlLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICJiOWQzMGMwZjVmZDA5MDcxOWI2NzJkODlmM2YzNmI3YTRkZDAwY2UxZTA2YWY2NWRhMDdlOWE3ZmM3YjQ1MTc3IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbHBfZHVhbHMvUkVBRE1FLm1kIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiMGU5MDAyZWExOGZkNTQ5ZDM4NmMxMmQyYTBiMDE0YTBlZDA4ZTU0ZjE1NzU4OGI4ODkyMzNmMmIxNWVkNzIyZSIsCiAgICAgICAgIm5hbWUiOiAiYXNzZXRzL2xwX2R1YWxzL2xwX2R1YWxzLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI4ZWIxOTM4MGI0OWM0MTAzNmJmMGUyZWQ0ZGMyYTkxYTllZjNiYzY5OWMwMDM2MmI4YjdlYTk4M2Q5YWNhZDQzIiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbHBfd2FybXN0YXJ0L1JFQURNRS5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogImM4ZjlmMzBkNmJmNTk5NTVmZTIxMzM0OWU1M2M2YmE5YWM1NWZlNmUzOTg4YWYzZGE1ZjM0Y2NjZWFkYzMyYjUiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9taWxwX2Jhc2ljL1JFQURNRS5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogIjQ2ZTBmNzRlOWU1ODIxNTgxYTU0OTExZGFmYzY1M2U3ZWExMzQ0MGM5ZDdiOWY2MmRjMmRkMDI2NDU3NzZhZTEiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9taWxwX2Jhc2ljL21pbHBfc2ltcGxlLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI0NmRkOWIzM2U4NmE4MTU2YjIyZjhjNjQ5NDRhYWMwODkxYWUxNjZkNGQ4M2Y2YTNmNjU0YTNlYzYxZmMxMDdjIiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbWlscF9wcm9kdWN0aW9uX3BsYW5uaW5nL1JFQURNRS5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogImY3MWRhODBlMDBiNDliYmFiZjYyZjcyN2ExZDlkNDhlZmIyZTE4NDIxZTgzM2YzYjZjNTMzYzViMmI4NmQzNjQiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9taWxwX3Byb2R1Y3Rpb25fcGxhbm5pbmcvbWlscF9wcm9kdWN0aW9uLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI3NmQ2NTA2MzE5NjRjZjhiMmFkMzc5YTBjMjVhNjE3MzlkNWRjYjBkMjc0NjI3NmFiZGM2ODA1ZDc2ZWVlNGRjIiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbXBzX3NvbHZlci9SRUFETUUubWQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICIzMGIzZjg3MTkxODE2MGU5YzFjNWU3NjBlMzllOWU1YTk3M2U1MWFhYWQwOTc5ODc2NWM4Y2E3NDE2NDFiYjA0IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbXBzX3NvbHZlci9kYXRhL3NhbXBsZS5tcHMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI4MTc1ODdmMzBlNWE3MTNhMzI2NTEzZmIyNTAwYzA1YjkwMjU4MTQ3Y2YxNmMxOTQ0OTc0NDBiMDAyYmQxYTU4IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbXBzX3NvbHZlci9tcHNfc29sdmVyLmMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgImRpZ2VzdCI6ICI0ZWM5MTZkZWRlYjNkNjAwOTU0OTYxNDZjNTk0ZmJlNTNjNTM2YzExMDE3MWE2MzAyMjRhNjBiYTU4MDZmYTE0IiwKICAgICAgICAibmFtZSI6ICJldmFscy9ldmFscy5qc29uIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJkaWdlc3QiOiAiNDI4ZmQyOTkxOTI4NDM4ZmFiOTg2ZGRhOTc1ZDRiZGFhZTg5YTEzYTNjM2NkOWRlMjAyNTAwZTY2OGFjNGNlNCIsCiAgICAgICAgIm5hbWUiOiAicmVmZXJlbmNlcy9leGFtcGxlcy5tZCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAiZGlnZXN0IjogImE1NTVmMDE4ODllNTRmZTE3MjE1YTE0MDE1NTA3OTJiN2RhZDIxMTM2YzE5OTVlZTA5MjJiMjI1ZDYyZWNmNDMiLAogICAgICAgICJuYW1lIjogInNraWxsLWNhcmQubWQiCiAgICAgIH0KICAgIF0KICB9Cn0=","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGQCMGS4IoqPuKUdpFcY3Zf7GUNus/TMrJtzG3/dbL4jUL88fthpb1GSaGQ/JzK23f6VhgIwQDqnXP95BkcY49ICvXQSnT2rLkIKaRQcay74PZVq0OgQrXNuzYhgkkx3tAfXsfoT","keyid":""}]}} \ No newline at end of file