diff --git a/.asdf b/.asdf deleted file mode 100644 index 72b288b..0000000 --- a/.asdf +++ /dev/null @@ -1,37 +0,0 @@ -### Examples: ### -# Employ asdf for go, ruby, and python used by this project only: -# source .asdf -# Employ asdf for python used by this project only: -# source .asdf python - -# Define the URL of setup_asdf.sh -setup_asdf_url="https://raw.githubusercontent.com/l50/dotfiles/main/files/setup_asdf.sh" - -# Define the local path of setup_asdf.sh -setup_asdf_path="/tmp/setup_asdf.sh" - -# Check if setup_asdf.sh exists locally -if [[ ! -f "${setup_asdf_path}" ]]; then - # setup_asdf.sh doesn't exist locally, so download it - curl -s "${setup_asdf_url}" -o "${setup_asdf_path}" -fi - -# Source /tmp/setup_asdf.sh -# shellcheck source=/dev/null -source "${setup_asdf_path}" - -# Function to setup language -setup_language_if_requested() { - local language="$1" - - # Check if the language is requested or if no language is specified - if [[ " $* " =~ $language ]] || [[ $# -eq 0 ]]; then - # Setup the language - setup_language "$language" "local" - fi -} - -# Call setup_language_if_requested for each language -setup_language_if_requested "$@" "golang" -setup_language_if_requested "$@" "python" -setup_language_if_requested "$@" "ruby" diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index e407b18..0000000 --- a/.editorconfig +++ /dev/null @@ -1,10 +0,0 @@ -[*.sh] -# like -i=4 -indent_style = space -indent_size = 4 - -binary_next_line = true # like -bn -switch_case_indent = true # like -ci -space_redirects = true # like -sr -keep_padding = true # like -kp -function_next_line = true # like -fn diff --git a/.github/renovate-bot.json5 b/.github/renovate-bot.json5 deleted file mode 100755 index b04a7bb..0000000 --- a/.github/renovate-bot.json5 +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "username": "rosey-bot[bot]", - "gitAuthor": "rosey-bot <98030736+rosey-bot[bot]@users.noreply.github.com>", - "repositories": ["facebookincubator/ForgeArmory"] -} diff --git a/.github/renovate.json5 b/.github/renovate.json5 deleted file mode 100755 index 8a91c9e..0000000 --- a/.github/renovate.json5 +++ /dev/null @@ -1,36 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:base", - "docker:enableMajor", - ":disableRateLimiting", - ":dependencyDashboard", - ":semanticCommits", - ":enablePreCommit", - ":automergeDigest", - ":automergeBranch", - "github>facebookincubator/ForgeArmory//.github/renovate/autoMerge.json5", - "helpers:pinGitHubActionDigests" - ], - "platform": "github", - "onboarding": false, - "requireConfig": "optional", - "dependencyDashboardTitle": "Renovate Dashboard 🤖", - "suppressNotifications": ["prIgnoreNotification"], - "rebaseWhen": "conflicted", - "commitBodyTable": true, - "pre-commit": { - "enabled": true - }, - "regexManagers": [ - { - "fileMatch": [ - ".sh$" - ], - "matchStrings": [ - "go install (?[^@]+?)@(?[0-9.-a-zA-Z]+)" - ], - "datasourceTemplate": "go" - } - ] -} diff --git a/.github/renovate/autoMerge.json5 b/.github/renovate/autoMerge.json5 deleted file mode 100755 index 98aee28..0000000 --- a/.github/renovate/autoMerge.json5 +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "packageRules": [ - { - "description": "Auto merge GitHub Actions", - "matchManagers": ["github-actions"], - "matchDatasources": ["github-tags"], - "automerge": true, - "ignoreTests": false, - "automergeType": "pr", - "matchUpdateTypes": ["minor", "patch", "digest"] - } - ] -} diff --git a/.github/workflows/meta-labeler.yaml b/.github/workflows/meta-labeler.yaml old mode 100755 new mode 100644 diff --git a/.github/workflows/meta-sync-labels.yaml b/.github/workflows/meta-sync-labels.yaml old mode 100755 new mode 100644 diff --git a/.github/workflows/pre-commit.yaml b/.github/workflows/pre-commit.yaml index 618eb6e..b2c1791 100644 --- a/.github/workflows/pre-commit.yaml +++ b/.github/workflows/pre-commit.yaml @@ -5,54 +5,14 @@ on: types: - opened - synchronize - # Run once a week (see https://crontab.guru) - schedule: - - cron: "0 0 * * 0" - workflow_dispatch: jobs: pre-commit: name: Update pre-commit hooks and run pre-commit runs-on: ubuntu-latest steps: - - name: Set up git repository - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - - - name: Set up BATS - uses: mig4/setup-bats@af9a00deb21b5d795cabfeaa8d9060410377686d # v1 - with: - bats-version: 1.2.1 - - - name: Set up Python - uses: actions/setup-python@61a6322f88396a6271a6ee3565807d608ecaddd1 # v4 - with: - python-version: "3.x" - - - name: Set up Go - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4 - with: - go-version: "1.21.0" - - - name: Install go module dependencies - run: | - go install mvdan.cc/sh/v3/cmd/shfmt@latest - go install github.com/magefile/mage@latest - + - name: Checkout Git repository + uses: actions/checkout@v4 - name: Install pre-commit run: pip3 install pre-commit - - - name: Run go mod tidy - necessary to avoid errors with renovatebot PRs - run: pushd magefiles; go mod tidy; popd - - - name: Commit go.mod and go.sum changes to keep pre-commit happy - run: | - git config --global user.email "action@github.com" - git config --global user.name "GitHub Action" - git add magefiles/go.mod magefiles/go.sum - git diff --quiet && git diff --staged --quiet || \ - git commit -m "Update go.mod and go.sum" - - - name: Install pre-commit dependencies - run: mage installDeps - - name: Run pre-commit - run: mage runPreCommit + run: pre-commit run --all-files diff --git a/.github/workflows/renovate.yaml b/.github/workflows/renovate.yaml deleted file mode 100755 index e0f967d..0000000 --- a/.github/workflows/renovate.yaml +++ /dev/null @@ -1,66 +0,0 @@ ---- -name: Renovate -on: - pull_request: - branches: ["main"] - paths: - - .github/renovate-bot.json5 - - .github/renovate.json5 - - .github/renovate/**.json5 - merge_group: - push: - branches: ["main"] - paths: - - .github/renovate-bot.json5 - - .github/renovate.json5 - - .github/renovate/**.json5 - workflow_dispatch: - inputs: - dryRun: - description: "Dry-Run" - default: "false" - required: false - logLevel: - description: "Log-Level" - default: "debug" - required: false - schedule: - # Run once per week - at 00:00 on Sunday - - cron: "0 0 * * 0" - -env: - LOG_LEVEL: debug - RENOVATE_DRY_RUN: false - RENOVATE_CONFIG_FILE: .github/renovate-bot.json5 - -jobs: - renovate: - name: Renovate - runs-on: ubuntu-latest - steps: - - name: Set up git repository - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3.6.0 - with: - token: "${{ secrets.BOT_TOKEN }}" - - - name: Override default config from dispatch variables - run: | - echo "RENOVATE_DRY_RUN=${{ github.event.inputs.dryRun || env.RENOVATE_DRY_RUN }}" >> "${GITHUB_ENV}" - echo "LOG_LEVEL=${{ github.event.inputs.logLevel || env.LOG_LEVEL }}" >> "${GITHUB_ENV}" - - - name: Delete old dashboard - run: | - ISSUE_NUMBER=$(gh issue list -S 'Renovate Dashboard 🤖' --json number -q '.[0].number') - if [ "$ISSUE_NUMBER" != "null" ] && [ -n "$ISSUE_NUMBER" ]; then - gh issue close "$ISSUE_NUMBER" - else - echo "No issue found to close." - fi - env: - GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} - - - name: Renovate - uses: renovatebot/github-action@3cef36a9aba515d8726b491905b3bc766832e221 # v39.0.5 - with: - configurationFile: "${{ env.RENOVATE_CONFIG_FILE }}" - token: "${{ secrets.BOT_TOKEN }}" diff --git a/.github/workflows/semgrep.yaml b/.github/workflows/semgrep.yaml old mode 100755 new mode 100644 diff --git a/.hooks/add-authored-by.sh b/.hooks/add-authored-by.sh deleted file mode 100755 index 307655a..0000000 --- a/.hooks/add-authored-by.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -set -ex - -# Check if git is installed -if ! command -v git &> /dev/null; then - echo "Error: git is not installed." - exit 1 -fi - -COMMIT_MSG_FILE="$1" -NAME=$(git config user.name || echo "") -EMAIL=$(git config user.email || echo "") - -# Ensure that the commit message file is provided and exists -if [[ -z "$COMMIT_MSG_FILE" || ! -f "$COMMIT_MSG_FILE" ]]; then - echo "Error: Commit message file not provided or doesn't exist." - exit 1 -fi - -# Check if NAME and EMAIL are set -if [[ -z "$NAME" || -z "$EMAIL" ]]; then - echo "Error: Git user.name or user.email is not set." - echo "Please configure them with:" - echo " git config --global user.name 'Your Name'" - echo " git config --global user.email 'youremail@example.com'" - exit 1 -fi - -# Only append if the line doesn't already exist -if ! grep -q "Authored-by: $NAME <$EMAIL>" "$COMMIT_MSG_FILE"; then - printf "\nAuthored-by: %s <%s>\n" "$NAME" "$EMAIL" >> "$COMMIT_MSG_FILE" -fi diff --git a/.hooks/generate-docs.sh b/.hooks/generate-docs.sh deleted file mode 100755 index fc66575..0000000 --- a/.hooks/generate-docs.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# -# This script is a pre-commit hook that checks if the mage command is -# installed and if not, prompts the user to install it. If mage is -# installed, the script changes to the repository root and runs the -# `mage generatepackagedocs` command. This command generates documentation -# for all Go packages in the current directory and its subdirectories by -# traversing the file tree and creating a new README.md file in each -# directory containing a Go package. If the command fails, the commit -# is stopped and an error message is shown. -set -ex - -# Change to the repository root -cd "$(git rev-parse --show-toplevel)" - -# Determine the location of the mage binary -mage_bin=$(go env GOPATH)/bin/mage - -# Check if mage is installed -if [[ -x "${mage_bin}" ]]; then - echo "mage is installed" -else - echo -e "mage is not installed\n" - echo -e "Please install mage by running the following command:\n" - echo -e "go install github.com/magefile/mage@latest\n" - exit 1 -fi - -# repo_root - -# Run the mage generatepackagedocs command -"${mage_bin}" generatepackagedocs - -# Catch the exit code of the last command -exit_status=$? - -# If the exit code is not zero (i.e., the command failed), -# then stop the commit and show an error message -if [ $exit_status -ne 0 ]; then - echo "failed to generate package docs" - exit 1 -fi diff --git a/.hooks/go-critic.sh b/.hooks/go-critic.sh deleted file mode 100755 index 7a74478..0000000 --- a/.hooks/go-critic.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -set -eu -o pipefail - -if ! command -v gocritic &> /dev/null; then - echo "gocritic not installed or available in the PATH" >&2 - echo "please check https://github.com/go-critic/go-critic" >&2 - exit 1 -fi - -subcommand=$1 -shift - -failed=false - -for file in "$@"; do - # redirect stderr so that violations and summaries are properly interleaved. - if ! gocritic "$subcommand" "$file" 2>&1; then - failed=true - fi -done - -if [[ $failed == "true" ]]; then - exit 1 -fi diff --git a/.hooks/go-no-replacement.sh b/.hooks/go-no-replacement.sh deleted file mode 100755 index 54bbe99..0000000 --- a/.hooks/go-no-replacement.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -REPO=$(grep "url" .git/config) - -if [[ "${REPO}" == *https* ]]; then - echo "${REPO}" | awk -F '://' '{print $2}' | awk -F '.git' '{print $1}' -else - echo "${REPO}" | awk -F '@' '{print $2}' | tr : / | awk -F '.git' '{print $1}' -fi - -if grep "replace ${REPO}" "$@" 2>&1; then - echo "ERROR: Don't commit a replacement in go.mod!" - exit 1 -fi diff --git a/.hooks/go-vet.sh b/.hooks/go-vet.sh deleted file mode 100755 index e2c62d0..0000000 --- a/.hooks/go-vet.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -ex - -pkgs=$(go list ./...) - -for pkg in $pkgs; do - dir="$(basename "$pkg")/" - if [[ "${dir}" != ".hooks/" ]] \ - && [[ "${dir}" != ".github/" ]] \ - && [[ "${dir}" != "bin/" ]] \ - && [[ "${dir}" != "docs/" ]] \ - && [[ "${dir}" != "logging/" ]] \ - && [[ "${dir}" != "magefiles/" ]] \ - && [[ "${dir}" != "modules/" ]] \ - && [[ "${dir}" != "resources/" ]] \ - && [[ "${dir}" != "templates/" ]]; then - go vet "${pkg}" - fi -done diff --git a/.hooks/linters/mdstyle.rb b/.hooks/linters/mdstyle.rb deleted file mode 100755 index bace04f..0000000 --- a/.hooks/linters/mdstyle.rb +++ /dev/null @@ -1,47 +0,0 @@ -################################################################################ -# Style file for markdownlint. -# -# https://github.com/markdownlint/markdownlint/blob/master/docs/configuration.md -# -# This file is referenced by the project `.mdlrc`. -################################################################################ - -#=============================================================================== -# Start with all built-in rules. -# https://github.com/markdownlint/markdownlint/blob/master/docs/RULES.md -all - -#=============================================================================== -# Override default parameters for some built-in rules. -# https://github.com/markdownlint/markdownlint/blob/master/docs/creating_styles.md#parameters - -exclude_tag :line_length -# Do not allow multiple consecutive blank lines. -rule 'MD012' - -# Allow long lines in code blocks and tables -rule 'MD013', line_length: 120, ignore_code_blocks: true, tables: false - - -#=============================================================================== -# Exclude the rules I disagree with. - -# IMHO it's easier to read lists like: -# * outmost indent -# - one indent -# - second indent -# * Another major bullet -exclude_rule 'MD004' # Unordered list style -exclude_rule 'MD005' # Unordered list indentation style - -# Ordered lists are fine. -exclude_rule 'MD029' - -# The first line doesn't always need to be a top level header. -exclude_rule 'MD041' - -# I find it necessary to use '
' to force line breaks. -exclude_rule 'MD033' # Inline HTML - -# Using bare URLs is fine. -exclude_rule 'MD034' diff --git a/.hooks/linters/yamllint.yaml b/.hooks/linters/yamllint.yaml deleted file mode 100755 index d4f5734..0000000 --- a/.hooks/linters/yamllint.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -extends: default - -rules: - line-length: - max: 500 - level: warning - truthy: false - comments: - min-spaces-from-content: 1 diff --git a/.hooks/run-bats-tests.sh b/.hooks/run-bats-tests.sh deleted file mode 100755 index 5ff4a15..0000000 --- a/.hooks/run-bats-tests.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -ex - -# Run all bats tests in the tests directory -output=$(bats ".hooks/tests/"*.bats) -exit_code=$? - -echo "${output}" -exit ${exit_code} diff --git a/.hooks/run-go-tests.sh b/.hooks/run-go-tests.sh deleted file mode 100755 index 8aae83b..0000000 --- a/.hooks/run-go-tests.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -set -e - -TESTS_TO_RUN=$1 -RETURN_CODE=0 - -if [[ -z "${TESTS_TO_RUN}" ]]; then - echo "No tests input" - echo "Example - Run all tests: bash run-go-tests.sh all" - echo "Example - Run all tests and generate coverage report: bash run-go-tests.sh coverage" - exit 1 -fi - -if [[ "${TESTS_TO_RUN}" == 'coverage' ]]; then - go test -v -race -failfast \ - -tags=integration -coverprofile=coverage-all.out ./... - RETURN_CODE=$? -elif [[ "${TESTS_TO_RUN}" == 'all' ]]; then - go test -v -race -failfast ./... - RETURN_CODE=$? -elif [[ "${TESTS_TO_RUN}" == 'short' ]] \ - && [[ "${GITHUB_ACTIONS}" != "true" ]]; then - go test -v -short -failfast -race ./... - RETURN_CODE=$? -else - if [[ "${GITHUB_ACTIONS}" != 'true' ]]; then - go test -v -race -failfast "./.../${TESTS_TO_RUN}" - RETURN_CODE=$? - fi -fi - -if [[ "${RETURN_CODE}" -ne 0 ]]; then - echo "unit tests failed" - exit 1 -fi diff --git a/.hooks/shfmt.sh b/.hooks/shfmt.sh deleted file mode 100755 index dc03b24..0000000 --- a/.hooks/shfmt.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -ex - -# Loop through all arguments -for file in "$@"; do - # Check if the file's path starts with 'templates/' - if [[ $file != templates/* ]]; then - shfmt -i 4 -bn -ci -sr -kp -fn -w "$file" - else - echo "Skipping formatting for $file" - fi -done diff --git a/.hooks/tests/add-authored-by.bats b/.hooks/tests/add-authored-by.bats deleted file mode 100755 index da18253..0000000 --- a/.hooks/tests/add-authored-by.bats +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env bats - -# Save the initial working directory -INITIAL_DIR="$(pwd)" -# Save the original path -ORIGINAL_PATH="$PATH" - -setup() { - # Create a temporary directory - TEMP_DIR=$(mktemp -d) - - # Change to the temporary directory - cd "$TEMP_DIR" || exit - - # Initialize a git repo in the temp directory - git init >/dev/null - - # Create a dummy commit message file - COMMIT_MSG_FILE="dummy_commit_msg.txt" - echo "Initial commit message" >"$COMMIT_MSG_FILE" - - # Set git user details - git config user.name "Test User" - git config user.email "test@example.com" -} - -teardown() { - # Remove the temporary directory and all of its contents - rm -rf "$TEMP_DIR" - # Return to the original directory - cd "$INITIAL_DIR" || exit -} - -@test "Check if Authored-by line is appended to commit message" { - # Run the pre-commit script using the initial directory to get the correct path - "$INITIAL_DIR"/.hooks/add-authored-by.sh "$COMMIT_MSG_FILE" - - # Check if the Authored-by line is appended - run grep "Authored-by: Test User " "$COMMIT_MSG_FILE" - [ "$status" -eq 0 ] -} - -@test "Error when git is not installed" { - # Modify PATH to mimic git not being available - export PATH="/tmp" - - run "$INITIAL_DIR"/.hooks/add-authored-by.sh "$COMMIT_MSG_FILE" - [ "$status" -ne 0 ] - [[ "$output" == *"Error: git is not installed."* ]] - - # Reset PATH - export PATH="$ORIGINAL_PATH" -} - -@test "Error when git user.name or user.email is not set" { - # Use a custom git configuration directory without any configurations set - export GIT_CONFIG_NOSYSTEM=true - HOME=$(mktemp -d) - export HOME - - # Explicitly unset user.name and user.email - git config --unset user.name - git config --unset user.email - - run git config --get user.name - - run git config --get user.email - - run "$INITIAL_DIR"/.hooks/add-authored-by.sh "$COMMIT_MSG_FILE" - [ "$status" -ne 0 ] - [[ $output == *Error:\ Git\ user\.name\ or\ user\.email\ is\ not\ set\.* ]] -} diff --git a/.hooks/tests/check-underscores-in-name.bats b/.hooks/tests/check-underscores-in-name.bats deleted file mode 100755 index 1d1c429..0000000 --- a/.hooks/tests/check-underscores-in-name.bats +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env bats - -# Save the initial working directory -INITIAL_DIR="$(pwd)" - -setup() { - # Create a temporary directory - TEMP_DIR=$(mktemp -d) - - # Change to the temporary directory - cd "$TEMP_DIR" || exit - - # Initialize a git repo in the temp directory - git init >/dev/null - - # Create test files and directory with underscores - touch test_file_with_underscore.yaml - mkdir test_directory_with_underscore - - # Stage the created files and directories - git add . - git commit -m "Initial dummy commit" - - # Modify one of the files to introduce a change - echo "dummy content" >>test_file_with_underscore.yaml - - # Stage the changes - git add test_file_with_underscore.yaml -} - -teardown() { - # Remove the temporary directory and all of its contents - rm -rf "$TEMP_DIR" - # Return to the original directory - cd "$INITIAL_DIR" || exit -} - -@test "Check if underscores in filenames are replaced with dashes" { - # Run the pre-commit script using the initial directory to get the correct path - "$INITIAL_DIR"/.hooks/check-underscores-in-name.sh - - # Debug: List all the files after running the script - ls -al - - # Check if files with dashes exist - [ -f test-file-with-underscore.yaml ] - - # Check if files with dashes are staged - run git diff --cached --name-only - [[ "$output" == *"test-file-with-underscore.yaml"* ]] -} - -@test "Check if old filenames with underscores are not staged" { - # Run the pre-commit script using the initial directory to get the correct path - "$INITIAL_DIR"/.hooks/check-underscores-in-name.sh - - # Check the status of files - run git status --porcelain - trimmed_output=$(echo "$output" | tr -d ' ') # Remove whitespaces - echo "Trimmed Git Status Output: $trimmed_output" - - # Ensure the old file is marked for deletion and the new file is added - [[ $trimmed_output =~ Dtest_file_with_underscore.yaml ]] - [[ $trimmed_output =~ Atest-file-with-underscore.yaml ]] - -} diff --git a/.hooks/validate-md.sh b/.hooks/validate-md.sh deleted file mode 100755 index 19b7c0d..0000000 --- a/.hooks/validate-md.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash - -tempfile=$(mktemp) -has_errors=false - -function validate_readme - { - file="$1" - - grep -q '^# [A-Za-z ]\+' "$file" || { - echo "Error: Missing or malformed title in $file" - echo "true" > "$tempfile" - } - grep -q '^## Arguments' "$file" || { - echo "Error: Missing Arguments section in $file" - echo "true" > "$tempfile" - } - grep -q '^## Pre-requisites' "$file" || { - echo "Error: Missing Pre-requisites section in $file" - echo "true" > "$tempfile" - } - grep -q '^## Examples' "$file" || { - echo "Error: Missing Examples section in $file" - echo "true" > "$tempfile" - } - grep -q '^## Steps' "$file" || { - echo "Error: Missing Steps section in $file" - echo "true" > "$tempfile" - } -} - -git ls-files | grep 'README.md$' | while read -r file; do - if [ "$file" != "./README.md" ] && [ "$file" != "README.md" ]; then - validate_readme "$file" - fi -done - -if [ -s "$tempfile" ]; then - has_errors=true -fi - -if [ "$has_errors" = false ]; then - echo "All TTP docs (excluding root README.md) are in the expected format." -else - echo "Validation failed for one or more TTP docs. Please review the errors above." - exit 1 -fi - -# Clean up temporary file -rm -f "$tempfile" diff --git a/.hooks/validate-yaml.sh b/.hooks/validate-yaml.sh deleted file mode 100755 index 9a73bf8..0000000 --- a/.hooks/validate-yaml.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -# This script is a pre-commit hook that checks if the mage command is -# installed and if not, prompts the user to install it. If mage is -# installed, the script changes to the repository root and runs the -# `mage validateyaml` command for each staged YAML file. This command -# validates all committed YAML files against a predefined schema. If any -# validation fails, the commit is stopped and an error message is shown. - -# Change to the repository root -cd "$(git rev-parse --show-toplevel)" || exit 1 - -# Determine the location of the mage binary -mage_bin=$(go env GOPATH)/bin/mage - -# Check if mage is installed -if [[ ! -x "${mage_bin}" ]]; then - echo -e "mage is not installed\n" - echo -e "Please install mage by running the following command:\n" - echo -e "go install github.com/magefile/mage@latest\n" - exit 1 -fi - -# Get the list of staged files under ttps directory and ending with .yaml -staged_files=$(git diff --cached --name-only --diff-filter=AM | grep '^ttps/.*\.yaml$') - -if [[ -z "$staged_files" ]]; then - echo "This commit has no TTPs that need to be validated." - exit 0 -fi - -echo "Files to validate: $staged_files" - -# Iterate over each staged file and validate it -for file in $staged_files; do - # Run the mage validateyaml command for the staged YAML file - "${mage_bin}" validateyaml docs/ttpforge-spec.yaml "$file" || { - echo "Failed validation for: $file" - exit 1 - } - - # Catch the exit code of the last command - exit_status=$? - - # If the exit code is not zero (i.e., the command failed), - # then stop the commit and show an error message - if [ $exit_status -ne 0 ]; then - echo "Failed to validate YAML file '$file' against the schema." - exit 1 - fi -done diff --git a/.mdlrc b/.mdlrc deleted file mode 100755 index 984d763..0000000 --- a/.mdlrc +++ /dev/null @@ -1 +0,0 @@ -style '.hooks/linters/mdstyle.rb' diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8948af0..6f93215 100755 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,7 +1,7 @@ --- repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 + rev: v4.5.0 hooks: - id: check-case-conflict - id: check-merge-conflict @@ -12,37 +12,8 @@ repos: - id: detect-private-key - id: check-shebang-scripts-are-executable - - repo: https://github.com/adrienverge/yamllint.git - rev: v1.32.0 - hooks: - - id: yamllint - entry: yamllint --strict -c .hooks/linters/yamllint.yaml - - - repo: https://github.com/pre-commit/mirrors-prettier - rev: v3.0.3 - hooks: - - id: prettier - files: \.(json|yaml|yml)$ - - - repo: https://github.com/koalaman/shellcheck-precommit - rev: v0.9.0 - hooks: - - id: shellcheck - - - repo: https://github.com/jumanjihouse/pre-commit-hooks - rev: 3.0.0 - hooks: - - id: script-must-have-extension - name: Ensure shell scripts end with .sh - types: [shell] - exclude: ^templates/|^.hooks/tests/ - - id: shfmt - exclude: ^templates/ - # Configuration in .mdlrc and .hooks/linters/mdstyle.rb - - id: markdownlint - - repo: https://github.com/codespell-project/codespell - rev: v2.2.5 + rev: v2.2.6 hooks: - id: codespell entry: | @@ -61,30 +32,3 @@ repos: name: Ensure all committed directories and YAML files are uniform language: script entry: .hooks/check-underscores-in-name.sh - - - id: add-authored-by - name: Append Authored-by line to commit message - language: script - entry: .hooks/add-authored-by.sh - always_run: true - pass_filenames: false - args: [".git/COMMIT_EDITMSG"] - - - id: bats-tests - name: Bats tests - description: This hook runs Bats tests on .bats files - entry: .hooks/run-bats-tests.sh - language: script - - - id: shfmt - name: Run shfmt hook on shell scripts - language: script - entry: .hooks/shfmt.sh - files: \.sh$ - - - id: validate-yaml-files - name: Validate all committed YAML files against TTPForge schema - language: script - entry: .hooks/validate-yaml.sh - files: '\.yaml$' - require_serial: true diff --git a/.tool-versions b/.tool-versions deleted file mode 100644 index 08aa62f..0000000 --- a/.tool-versions +++ /dev/null @@ -1,3 +0,0 @@ -ruby 3.2.2 -golang 1.21.1 -python 3.11.5 diff --git a/README.md b/README.md index 7412dc9..adf4494 100644 --- a/README.md +++ b/README.md @@ -3,87 +3,45 @@ [![License](https://img.shields.io/github/license/facebookincubator/ForgeArmory?label=License&style=flat&color=blue&logo=github)](https://github.com/facebookincubator/ForgeArmory/blob/main/LICENSE) [![🚨 Semgrep Analysis](https://github.com/facebookincubator/ForgeArmory/actions/workflows/semgrep.yaml/badge.svg)](https://github.com/facebookincubator/ForgeArmory/actions/workflows/semgrep.yaml) [![Pre-Commit](https://github.com/facebookincubator/ForgeArmory/actions/workflows/pre-commit.yaml/badge.svg)](https://github.com/facebookincubator/ForgeArmory/actions/workflows/pre-commit.yaml) -[![Renovate](https://github.com/facebookincubator/ForgeArmory/actions/workflows/renovate.yaml/badge.svg)](https://github.com/facebookincubator/ForgeArmory/actions/workflows/renovate.yaml) -This repo hosts the community-driven TTPs that Meta's TTPForge can consume. -Our catalog presently focuses on macOS and cloud TTPs. +ForgeArmory is a repository of attacker Tactics, Techniques, and Procedures +(TTPs) that you can download and run with Meta's +[TTPForge](https://github.com/facebookincubator/TTPForge) attack simulation +engine. Our catalog presently focuses on macOS and Cloud TTPs. ---- +## Setup -## Dependencies +To get started, +[install TTPForge](https://github.com/facebookincubator/TTPForge/blob/main/README.md#installation) +and then browse the ForgeArmory +[TTP catalog](https://github.com/facebookincubator/ForgeArmory/tree/main/ttps) +to find cyberattacks to simulate. -- [Install asdf](https://asdf-vm.com/): +## Adding New TTPs - ```bash - git clone https://github.com/asdf-vm/asdf.git ~/.asdf - ``` +You can add new TTPs to ForgeArmory by +[forking](https://docs.github.com/en/get-started/quickstart/fork-a-repo) this +repository and adding your TTP YAML files to the appropriate directories in the +[catalog](https://github.com/facebookincubator/ForgeArmory/tree/main/ttps). +Check out the +[TTPForge documentation](https://github.com/facebookincubator/TTPForge/blob/main/docs/foundations/README.md) +to learn the syntax for writing TTPs and all of TTPForge's attack simulation +features. -- Install and use asdf plugins to manage go, python, and ruby for this project: +## Submitting Pull Requests - ```bash - source .asdf - ``` +Once your TTPs are ready, feel free to send us a pull request :) - Alternatively, you can pick and choose which plugins to install: +Our automation will run various linters/checks against new pull requests. +Several of the linters in this project may be used as pre-commit hooks if +desired - you can install and setup pre-commit according to the +[official instructions](https://pre-commit.com/). - ```bash - # Employ asdf for this project's python: - source .asdf python - ``` - -- [Install pre-commit](https://pre-commit.com/): - - ```bash - python3 -m pip install --upgrade pip - python3 -m pip install pre-commit - ``` - -- [Install Mage](https://magefile.org/): - - ```bash - go install github.com/magefile/mage@latest - ``` - ---- - -## For Contributors and Developers - -1. [Fork this project](https://docs.github.com/en/get-started/quickstart/fork-a-repo) - -1. Install dependencies: - - ```bash - mage installDeps - ``` - -1. Update and run pre-commit hooks locally: - - ```bash - mage runPreCommit - ``` - ---- - -## Create New Release - -This requires the [GitHub CLI](https://github.com/cli/cli#installation) -and [gh-changelog GitHub CLI extension](https://github.com/chelnak/gh-changelog). - -Install changelog extension: - -```bash -gh extension install chelnak/gh-changelog -``` - -Generate changelog: - -```bash -NEXT_VERSION=v1.1.3 -gh changelog new --next-version "${NEXT_VERSION}" -``` - -Create release: +For quick ad hoc runs, you may wish to run pre-commit in a virtual environment: ```bash -gh release create "${NEXT_VERSION}" -F CHANGELOG.md +python3 -m venv venv +. venv/bin/activate +pip3 install pre-commit +pre-commit run --all-files ``` diff --git a/docs/ttp-dev.md b/docs/ttp-dev.md deleted file mode 100644 index 0492a46..0000000 --- a/docs/ttp-dev.md +++ /dev/null @@ -1,201 +0,0 @@ -# TTP Development - -This document introduces concepts to help developers -create their own TTPs for use in TTPForge. - -## TTP Anatomy - -ForgeArmory TTPs are designed to be consumed by [TTPForge](https://github.com/facebookincubator/TTPForge), -which provides an interface to execute TTPs across various targets and mediums. -Each ForgeArmory TTP consists of metadata and optional argument declarations. -The steps define the TTP implementation logic. - -### Metadata - -TTP metadata must include the name of the TTP and a description of that TTP's -behavior. MITRE ATT&CK IDs are optional but recommended. If the TTP cannot be -mapped to MITRE ATT&CK then the `mitre` mapping and its child mappings should be -omitted. - -An example of TTP metadata is shown below. - -```yaml ---- -name: Leverage mdfind to search for aws credentials on disk. -description: | - This TTP runs a search using mdfind to search for AKIA strings in files, - which would likely indicate that the file is an aws key. -mitre: - tactics: - - TA0006 Credential Access - techniques: - - T1552 Unsecured Credentials - subtechniques: - - "T1552.001 Unsecured Credentials: Credentials In Files" -``` - -### Arguments - -Arguments are defined after the TTP metadata. Arguments are uniquely named, -may be strongly typed, and may contain default values. Using an argument in -the TTP is done with the argument syntax, `{{ .Args.arg_name }}`. -A complete example is shown below. - -```yaml -args: - - name: a_message - - name: a_number - type: int - - name: has_a_default - default: this is the default value -steps: - - name: print_args - inline: | - set -e - - echo "hi! You passed the message: {{ .Args.a_message }}" - echo "You passed the number: {{ .Args.a_number }}" - echo "has_a_default has the value: '{{ .Args.has_a_default }}'" -``` - -### Steps - -Steps are uniquely named blocks of implementation logic which are executed in -sequence. Steps help developers organize and manage the complexity of TTPs. - -In general, steps will fall into one of the following high-level categories; - -- Assessment -- Shaping -- Execution -- Cleanup - -Additionally, TTPs may be daisy-chained enabling developers to create complex -sequences of TTPs. In doing so, each daisy-chained TTP is represented in the -parent TTP as a sub-TTP. We'll see an example of this shortly and some -recommendations on developing sub-TTPs as common building blocks. - -#### Assessment - -It is often necessary for a TTP to test execution requirements, such as whether -a necessary environment variable is set, and bail out of the TTP if it is not. -In this example, if the `AWS_DEFAULT_REGION` environment variable is not set, -the TTP returns exit code 1 and no further blocks are executed. - -```yaml -steps: - - name: ensure-aws-creds-present - inline: | - set -e - - if [[ -z "${AWS_DEFAULT_REGION}" ]]; then - echo "Error: AWS_DEFAULT_REGION must be set." - exit 1 - fi - -<- snip -> -``` - -When creating assessment type blocks, it's preferable to place each test in its -own block rather than a single block that tests all prerequisites. This approach -will make your TTPs much easier to maintain as they become more complex. - -#### Shaping - -It is often necessary for a TTP to install dependencies, stage files, or shape -the target environment prior to executing the core TTP logic. As with assessment -type blocks, when creating shaping type blocks, it's preferable to place each -action in its own block. - -```yaml -<- snip -> - - - name: setup - inline: | - set -e - - if [[ -d "{{ .Args.eiam_path }}" ]]; then - echo "Info: enumerate-iam already present on the current system" - else - git clone https://github.com/andresriancho/enumerate-iam.git {{ .Args.eiam_path }} - fi - -<- snip -> -``` - -#### Execution - -The execution blocks contain the core TTP logic. A single execution block may -be sufficient for simple TTPs such as atomics, which contain a single procedure. -For complex TTPs, the core logic should be broken up across multiple steps or -sub-TTPs. In general, if the core logic implements multiple procedures or the -procedure can be reasonably divided, refactoring into smaller steps will enhance -maintainability. - -Code likely to be reused in other TTPs should be placed in a sub-TTP and imported -where needed. It's easier to maintain building blocks than to modify the same -(reimplemented) code in multiple places. Good candidates for sub-TTPs include -assessment and shaping operations. Here, you might check for commonly used -prerequisites, install frequent tools, or tamper with security controls before -the primary execution block. - -```yaml -steps: - - name: first_sub_ttp - ttp: examples/sub-ttps/my-sub-ttps/ttp1.yaml - - name: second_sub_ttp - ttp: examples/sub-ttps/my-sub-ttps/ttp2.yaml -``` - -#### Cleanup - -In addition to the implementation logic, each TTP must contain a `cleanup` block -to revert artifacts from the preceding blocks. If no implementation blocks produce -artifacts, the `cleanup` block should just return a success log. - -Example with implementation block artifacts: Here, we revert changes made in -previous steps. - -```yaml -steps: - - name: disable-updates - inline: | - set -e - - echo -e "===> Disabling automatic installation of security updates..." - sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate.plist CriticalUpdateInstall -bool NO - echo "[+] DONE!" - - cleanup: - inline: | - set -e - - echo -e "===> Enabling automatic installation of security updates..." - sudo defaults write /Library/Preferences/com.apple.SoftwareUpdate.plist CriticalUpdateInstall -bool YES - echo "[+] DONE!" -``` - -Example without implementation block artifacts: No changes were made to the -target system. This is reported in the success log. - -```yaml -steps: - - name: clipdump_cli - inline: | - echo -e "===> Dumping clipboard to stdout..." - pbpaste - echo "[+] DONE!" - cleanup: - inline: | - echo "No cleanup needed, as this TTP simply dumped clipboard contents to stdout." -``` - -### Pre-Commit Hooks - -Every so often, we introduce pre-commit hooks to ensure that -the developer experience is easy and has a low barrier to entry. - -However, some hooks may introduce unnecessary overhead. -To address this, all new pre-commit hooks will undergo a one-month -trial period. If they hinder the developer experience during this time, -we will remove them. diff --git a/docs/ttpforge-spec.yaml b/docs/ttpforge-spec.yaml deleted file mode 100644 index 5d8d5b2..0000000 --- a/docs/ttpforge-spec.yaml +++ /dev/null @@ -1,149 +0,0 @@ ---- -definitions: - TTP: - type: object - properties: - name: - type: string - description: - type: string - mitre: - $ref: "#/definitions/Mitre" - steps: - type: array - items: - oneOf: - - $ref: "#/definitions/SubTTPStep" - - $ref: "#/definitions/BasicStep" - - $ref: "#/definitions/EditStep" - - $ref: "#/definitions/FetchURIStep" - args: - type: array - items: - $ref: "#/definitions/Spec" - required: - - name - - description - - steps - - Mitre: - type: object - properties: - tactics: - type: array - items: - type: string - techniques: - type: array - items: - type: string - subtechniques: - type: array - items: - type: string - - BasicStep: - type: object - properties: - name: - type: string - inline: - type: string - cleanup: - $ref: "#/definitions/CleanupAct" - args: - type: array - items: - type: string - required: - - name - - inline - - CleanupAct: - type: object - properties: - inline: - type: string - required: - - inline - - SubTTPStep: - type: object - properties: - name: - type: string - ttp: - type: string - args: - type: object - additionalProperties: - type: string - required: - - name - - ttp - - EditStep: - type: object - properties: - name: - type: string - edit_file: - type: string - backup_file: - type: string - edits: - type: array - items: - $ref: "#/definitions/Edit" - required: - - name - - edit_file - - backup_file - - edits - - Edit: - type: object - properties: - old: - type: string - new: - type: string - regexp: - type: boolean - required: - - old - - new - - Spec: - type: object - properties: - name: - type: string - type: - type: string - default: - type: string - description: - type: string - required: - - name - - type - - FetchURIStep: - type: object - properties: - fetch_uri: - type: string - retries: - type: string - location: - type: string - proxy: - type: string - overwrite: - type: boolean - cleanup: - $ref: "#/definitions/CleanupAct" - required: - - fetch_uri - - location diff --git a/magefiles/go.mod b/magefiles/go.mod deleted file mode 100755 index 2eabc30..0000000 --- a/magefiles/go.mod +++ /dev/null @@ -1,54 +0,0 @@ -module magefile - -go 1.21 - -toolchain go1.21.1 - -require ( - github.com/go-playground/validator/v10 v10.15.4 - github.com/l50/goutils/v2 v2.1.0 - github.com/spf13/afero v1.10.0 - github.com/xeipuuv/gojsonschema v1.2.0 - gopkg.in/yaml.v3 v3.0.1 -) - -require ( - dario.cat/mergo v1.0.0 // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 // indirect - github.com/acomagu/bufpipe v1.0.4 // indirect - github.com/bitfield/script v0.22.0 // indirect - github.com/cloudflare/circl v1.3.3 // indirect - github.com/emirpasic/gods v1.18.1 // indirect - github.com/fatih/color v1.15.0 // indirect - github.com/gabriel-vasile/mimetype v1.4.2 // indirect - github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.4.1 // indirect - github.com/go-git/go-git/v5 v5.8.1 // indirect - github.com/go-playground/locales v0.14.1 // indirect - github.com/go-playground/universal-translator v0.18.1 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/itchyny/gojq v0.12.13 // indirect - github.com/itchyny/timefmt-go v0.1.5 // indirect - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/leodido/go-urn v1.2.4 // indirect - github.com/magefile/mage v1.15.0 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/otiai10/copy v1.12.0 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/sergi/go-diff v1.3.1 // indirect - github.com/skeema/knownhosts v1.2.0 // indirect - github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect - mvdan.cc/sh/v3 v3.6.0 // indirect -) diff --git a/magefiles/go.sum b/magefiles/go.sum deleted file mode 100755 index 4391993..0000000 --- a/magefiles/go.sum +++ /dev/null @@ -1,623 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 h1:KLq8BE0KwCL+mmXnjLWEAOYO+2l2AE4YMmqG1ZpZHBs= -github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= -github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/bitfield/script v0.22.0 h1:LA7QHuEsXMPD52YLtxWrlqCCy+9FOpzNYfsRHC5Gsrc= -github.com/bitfield/script v0.22.0/go.mod h1:ms4w+9B8f2/W0mbsgWDVTtl7K94bYuZc3AunnJC4Ebs= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0= -github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= -github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo= -github.com/go-git/go-git/v5 v5.8.1 h1:Zo79E4p7TRk0xoRgMq0RShiTHGKcKI4+DI6BfJc/Q+A= -github.com/go-git/go-git/v5 v5.8.1/go.mod h1:FHFuoD6yGz5OSKEBK+aWN9Oah0q54Jxl0abmj6GnqAo= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.15.3 h1:S+sSpunYjNPDuXkWbK+x+bA7iXiW296KG4dL3X7xUZo= -github.com/go-playground/validator/v10 v10.15.3/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/go-playground/validator/v10 v10.15.4 h1:zMXza4EpOdooxPel5xDqXEdXG5r+WggpvnAKMsalBjs= -github.com/go-playground/validator/v10 v10.15.4/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/itchyny/gojq v0.12.12/go.mod h1:j+3sVkjxwd7A7Z5jrbKibgOLn0ZfLWkV+Awxr/pyzJE= -github.com/itchyny/gojq v0.12.13 h1:IxyYlHYIlspQHHTE0f3cJF0NKDMfajxViuhBLnHd/QU= -github.com/itchyny/gojq v0.12.13/go.mod h1:JzwzAqenfhrPUuwbmEz3nu3JQmFLlQTQMUcOdnu/Sf4= -github.com/itchyny/timefmt-go v0.1.5 h1:G0INE2la8S6ru/ZI5JecgyzbbJNs5lG1RcBqa7Jm6GE= -github.com/itchyny/timefmt-go v0.1.5/go.mod h1:nEP7L+2YmAbT2kZ2HfSs1d8Xtw9LY8D2stDBckWakZ8= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/l50/goutils/v2 v2.1.0 h1:o6DYjCtPevU5Uq1OjB8mtdsS00KxZHFQKVb9Hgo+KzI= -github.com/l50/goutils/v2 v2.1.0/go.mod h1:UwkfE7TaT3x9pzK7iAbiwQj+gkRVEi0GETasQqwE8uk= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= -github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg= -github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= -github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= -github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/otiai10/copy v1.12.0 h1:cLMgSQnXBs1eehF0Wy/FAGsgDTDmAqFR7rQylBb1nDY= -github.com/otiai10/copy v1.12.0/go.mod h1:rSaLseMUsZFFbsFGc7wCJnnkTAvdc5L6VWxPE4308Ww= -github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks= -github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM= -github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846 h1:Vve/L0v7CXXuxUmaMGIEK/dEeq7uiqb5qBgQrZzIE7E= -golang.org/x/tools v0.12.1-0.20230815132531-74c255bcf846/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -mvdan.cc/editorconfig v0.2.0/go.mod h1:lvnnD3BNdBYkhq+B4uBuFFKatfp02eB6HixDvEz91C0= -mvdan.cc/sh/v3 v3.6.0 h1:gtva4EXJ0dFNvl5bHjcUEvws+KRcDslT8VKheTYkbGU= -mvdan.cc/sh/v3 v3.6.0/go.mod h1:U4mhtBLZ32iWhif5/lD+ygy1zrgaQhUu+XFy7C8+TTA= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/magefiles/magefile.go b/magefiles/magefile.go deleted file mode 100755 index 1a5d883..0000000 --- a/magefiles/magefile.go +++ /dev/null @@ -1,94 +0,0 @@ -//go:build mage - -/* -Copyright © 2023-present, Meta Platforms, Inc. and affiliates -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -package main - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/l50/goutils/v2/dev/lint" - mageutils "github.com/l50/goutils/v2/dev/mage" - "github.com/l50/goutils/v2/sys" -) - -func init() { - os.Setenv("GO111MODULE", "on") -} - -// InstallDeps Installs go dependencies -func InstallDeps() error { - fmt.Println("Installing dependencies.") - - if err := lint.InstallGoPCDeps(); err != nil { - return fmt.Errorf("failed to install pre-commit dependencies: %v", err) - } - - if err := mageutils.InstallVSCodeModules(); err != nil { - return fmt.Errorf("failed to install vscode-go modules: %v", err) - } - - return nil -} - -func installCommitMsgHook() error { - // Define the path to the commit-msg hook file - gitDirPath := filepath.Join(".git", "hooks", "commit-msg") - - // Check if the hook file already exists - if _, err := os.Stat(gitDirPath); os.IsNotExist(err) { - fmt.Println("Installing commit-msg pre-commit hook.") - cmd := "pre-commit" - args := []string{"install", "--hook-type", "commit-msg"} - if _, err := sys.RunCommand(cmd, args...); err != nil { - return err - } - } else if err != nil { - return fmt.Errorf("error checking for commit-msg hook: %v", err) - } - - return nil -} - -// RunPreCommit runs all pre-commit hooks locally -func RunPreCommit() error { - if err := installCommitMsgHook(); err != nil { - return err - } - - fmt.Println("Updating pre-commit hooks.") - if err := lint.UpdatePCHooks(); err != nil { - return err - } - - fmt.Println("Clearing the pre-commit cache to ensure we have a fresh start.") - if err := lint.ClearPCCache(); err != nil { - return err - } - - fmt.Println("Running all pre-commit hooks locally.") - if err := lint.RunPCHooks(); err != nil { - return err - } - - return nil -} diff --git a/magefiles/schemaValidator.go b/magefiles/schemaValidator.go deleted file mode 100644 index bbcdcab..0000000 --- a/magefiles/schemaValidator.go +++ /dev/null @@ -1,273 +0,0 @@ -/* -Copyright © 2023-present, Meta Platforms, Inc. and affiliates -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -package main - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/go-playground/validator/v10" - "github.com/l50/goutils/v2/git" - "github.com/xeipuuv/gojsonschema" - "gopkg.in/yaml.v3" -) - -func init() { - os.Setenv("GO111MODULE", "on") -} - -const maxDepth = 10 - -func loadSchema(schemaPath string) (map[string]interface{}, error) { - schemaContent, err := os.ReadFile(schemaPath) - if err != nil { - return nil, fmt.Errorf("error reading schema file: %v", err) - } - - var schema map[string]interface{} - err = yaml.Unmarshal(schemaContent, &schema) - if err != nil { - return nil, fmt.Errorf("error unmarshalling schema: %v", err) - } - - return schema, nil -} - -// ValidateYAML checks if a YAML file is compliant with the schema. -func ValidateYAML(schemaPath, filePath string) error { - // Load the YAML schema - yamlSchema, err := loadSchema(schemaPath) - if err != nil { - return err - } - - validate := validator.New() - - if filePath == "ttps" { - err := validateAllYAML(schemaPath, yamlSchema, filePath, validate) - if err != nil { - return err - } - } else { - err := inspectAndValidate(filePath, yamlSchema, validate, 0) // Added depth as 0 for initial call - if err != nil { - return err - } - } - - return nil -} - -// validateAllYAML checks if YAML in the repo is compliant with the schema. -func validateAllYAML(schemaPath string, schema map[string]interface{}, searchDir string, validate *validator.Validate) error { - // Start directory walk to validate each YAML file - return filepath.WalkDir(searchDir, func(filePath string, d os.DirEntry, err error) error { - if err != nil { - return err - } - - // Only consider .yaml files - if strings.HasSuffix(strings.ToLower(d.Name()), ".yaml") { - fmt.Printf("Checking: %s\n", filePath) - fmt.Printf("Validating: %s against the TTPForge schema (%s)\n", filePath, schemaPath) - - return inspectAndValidate(filePath, schema, validate, 0) // Added the depth parameter here - } - - return nil - }) -} - -func inspectAndValidate(filePath string, schema map[string]interface{}, validate *validator.Validate, depth int) error { - // Check if the file exists - if _, err := os.Stat(filePath); os.IsNotExist(err) { - return fmt.Errorf("file %s does not exist", filePath) - } - - fileContent, err := os.ReadFile(filePath) - if err != nil { - return fmt.Errorf("error reading file %s: %v", filePath, err) - } - - var yamlData map[string]interface{} - err = yaml.Unmarshal(fileContent, &yamlData) - if err != nil { - return fmt.Errorf("error unmarshalling file %s: %v", filePath, err) - } - - // Validate the YAML data against the YAML schema - err = validateYAMLAgainstSchema(yamlData, schema) - if err != nil { - return err - } - - // Additional validation for edits - err = validateEdits(yamlData) - if err != nil { - return err - } - - // Additional validation for args - err = validateArgs(yamlData) - if err != nil { - return err - } - - repoRoot, err := git.RepoRoot() - if err != nil { - return fmt.Errorf("failed to get repo root: %v", err) - } - - // Check for SubTTPSteps and validate referenced files - if steps, ok := yamlData["steps"].([]interface{}); ok { - for _, step := range steps { - if stepMap, ok := step.(map[string]interface{}); ok { - if ttpPath, ok := stepMap["ttp"].(string); ok { - // This is a SubTTPStep, so validate the referenced file - absTtpPath := filepath.Join(repoRoot, "ttps", ttpPath) - - // Check if the referenced TTP file exists - if _, err := os.Stat(absTtpPath); os.IsNotExist(err) { - return fmt.Errorf("referenced TTP file %s does not exist", absTtpPath) - } - - // This is a SubTTPStep, so validate the referenced file - err = inspectAndValidate(absTtpPath, schema, validate, depth+1) - if err != nil { - return err - } - } - } - } - } - - // Only print the success message for the top-level invocation - if depth == 0 { - fmt.Println("YAML is valid according to the schema.") - } - - if depth >= maxDepth { - return fmt.Errorf("maximum recursion depth reached") - } - - return nil -} - -func validateYAMLAgainstSchema(yamlData map[string]interface{}, schema map[string]interface{}) error { - schemaStr, err := json.Marshal(schema) - if err != nil { - return fmt.Errorf("error converting schema to string: %v", err) - } - - schemaLoader := gojsonschema.NewStringLoader(string(schemaStr)) - documentLoader := gojsonschema.NewGoLoader(yamlData) - - result, err := gojsonschema.Validate(schemaLoader, documentLoader) - if err != nil { - return err - } - - if !result.Valid() { - var errors []string - for _, desc := range result.Errors() { - // Append each error to the errors slice - errors = append(errors, fmt.Sprintf("%s (field: %s)", desc.String(), desc.Field())) - } - return fmt.Errorf("this YAML does not match the schema: %s", strings.Join(errors, "; ")) - } - - // Custom validation: Check for "name" property when "ttp" is defined - if steps, ok := yamlData["steps"].([]interface{}); ok { - for _, step := range steps { - if stepMap, ok := step.(map[string]interface{}); ok { - // Check for the presence of "name" property when "ttp" is defined - if _, nameExists := stepMap["name"]; !nameExists { - return fmt.Errorf("the \"name\" property is missing when \"ttp\" is defined in a step") - } - } - } - } - - return nil -} - -func validateEdits(yamlData map[string]interface{}) error { - steps, ok := yamlData["steps"].([]interface{}) - if !ok { - return nil - } - - for _, step := range steps { - stepMap, ok := step.(map[string]interface{}) - if !ok { - continue - } - - // Check if this is an EditStep - if _, exists := stepMap["edit_file"]; exists { - edits, ok := stepMap["edits"].([]interface{}) - if !ok { - return fmt.Errorf("edits is not a valid array") - } - - for _, edit := range edits { - editMap, ok := edit.(map[string]interface{}) - if !ok { - return fmt.Errorf("an edit item is not valid") - } - - // Check if the required fields are present - if _, exists := editMap["old"]; !exists { - return fmt.Errorf("an edit item is missing the 'old' field") - } - - if _, exists := editMap["new"]; !exists { - return fmt.Errorf("an edit item is missing the 'new' field") - } - } - } - } - - return nil -} - -func validateArgs(yamlData map[string]interface{}) error { - args, ok := yamlData["args"].([]interface{}) - if !ok { - return nil - } - - for _, arg := range args { - argMap, ok := arg.(map[string]interface{}) - if !ok { - return fmt.Errorf("an argument item is not valid") - } - - // Check if the required fields are present - if _, exists := argMap["name"]; !exists { - return fmt.Errorf("an argument item is missing the 'name' field") - } - } - - return nil -} diff --git a/ttps/examples/args/README.md b/ttps/examples/args/README.md deleted file mode 100644 index 8a1135c..0000000 --- a/ttps/examples/args/README.md +++ /dev/null @@ -1,35 +0,0 @@ -# Defining Arguments for TTPs - -Delve into the process of specifying arguments for a TTP. Proper argument -definition ensures flexible and dynamic Tactics, Techniques, and Procedures. - ---- - -## Running `define-args.yaml` Demonstration - -To witness the definition and usage of arguments within a TTP, execute: - -```bash -ttpforge run forgearmory//examples/args/define-args.yaml \ - --arg a_message=foo \ - --arg a_number=1337 -``` - ---- - -## Expected Output - -```text -INFO [*] Validating Steps -INFO [+] Finished validating steps -INFO [+] Running current TTP: define_args -INFO [+] Running current step: print_args -INFO ========= Executing ========== -hi! You passed the message: foo -You passed the number: 1337 -has_a_default has the value: 'this is the default value' -INFO ========= Done ========== -INFO [+] Finished running step: print_args -INFO [*] Completed TTP -INFO [*] No Cleanup Steps Found -``` diff --git a/ttps/examples/args/define-args.yaml b/ttps/examples/args/define-args.yaml deleted file mode 100644 index cd8c3fd..0000000 --- a/ttps/examples/args/define-args.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -name: define_args -description: | - Illustrates how to define CLI arguments for TTPs -args: - - name: a_message - - name: a_number - type: int - - name: has_a_default - default: this is the default value -steps: - - name: print_args - inline: | - echo "hi! You passed the message: {{ .Args.a_message }}" - echo "You passed the number: {{ .Args.a_number }}" - echo "has_a_default has the value: '{{ .Args.has_a_default }}'" diff --git a/ttps/examples/fetchuri/README.md b/ttps/examples/fetchuri/README.md deleted file mode 100644 index dd9618c..0000000 --- a/ttps/examples/fetchuri/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Using the FetchURI Step in TTPs - -Discover how to effectively employ the `FetchURI` step in TTPs to fetch content -from a specific URI and store it in a file. - ---- - -## Running `fetchuri-example.yaml` Demonstration - -To observe the functionality of the `FetchURI` step in action, execute: - -```bash -ttpforge run forgearmory//examples/fetchuri/fetchuri.yaml -``` - ---- - -## Expected Output - -```text -INFO [*] Validating Steps -INFO [+] Finished validating steps -INFO [+] Running current TTP: fetchuri_step_example -INFO [+] Running current step: fetch-google-and-store-in-file -INFO ========= Executing ========== -INFO ========= Result ========== -INFO [+] Finished running step: fetch-google-and-store-in-file -INFO [*] Completed TTP -INFO [*] Beginning Cleanup -INFO ========= Executing ========== -INFO ========= Result ========== -INFO [*] Finished Cleanup -``` diff --git a/ttps/examples/fetchuri/fetchuri.yaml b/ttps/examples/fetchuri/fetchuri.yaml deleted file mode 100644 index 2383dcd..0000000 --- a/ttps/examples/fetchuri/fetchuri.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- -name: fetchuri_step_example -description: Illustrates how to employ the FetchURI step. - -steps: - - name: fetch-google-and-store-in-file - fetch_uri: https://google.com - location: ./google.txt - overwrite: true - cleanup: - inline: rm google.txt diff --git a/ttps/examples/mitre/README.md b/ttps/examples/mitre/README.md deleted file mode 100644 index 4a241af..0000000 --- a/ttps/examples/mitre/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# MITRE ATT&CK Mapping for TTPs - -Understand the process of mapping a TTP to the MITRE ATT&CK framework, -a globally recognized cybersecurity matrix. - ---- - -## Running `mitre.yaml` Demonstration - -To see the TTP mapping in action with the MITRE ATT&CK framework, execute: - -```bash -ttpforge run forgearmory//examples/mitre/mitre.yaml -``` - ---- - -## Expected Output - -```text -INFO [*] Validating Steps -INFO [+] Finished validating steps -INFO [+] Running current TTP: mitre-target -INFO [+] Running current step: friendly-message -INFO ========= Executing ========== -You are running a TTP that is mapped to MITRE ATT&CK -INFO ========= Done ========== -INFO [+] Finished running step: friendly-message -INFO [*] Completed TTP -INFO [*] No Cleanup Steps Found -``` diff --git a/ttps/examples/mitre/mitre.yaml b/ttps/examples/mitre/mitre.yaml deleted file mode 100644 index cfe1ec7..0000000 --- a/ttps/examples/mitre/mitre.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: mitre-target -description: | - Example to map a TTP to MITRE ATT&CK through tactics, techniques, and - subtechniques. -mitre: - tactics: - - TA0003 Persistence - techniques: - - T1547 Boot or Logon Autostart Execution - subtechniques: - - "T1547.007 Boot or Logon Autostart Execution: Re-opened Applications" - -steps: - - name: friendly-message - inline: | - set -e - - echo "You are running a TTP that is mapped to MITRE ATT&CK" diff --git a/ttps/examples/outputs/README.md b/ttps/examples/outputs/README.md deleted file mode 100644 index 57af018..0000000 --- a/ttps/examples/outputs/README.md +++ /dev/null @@ -1,47 +0,0 @@ -# Passing Outputs Between TTP Steps - -Discover the methodology to efficiently pass outputs from one TTP step -to the subsequent steps, ensuring seamless data flow within a procedure. - ---- - -## Running `outputs.yaml` Demonstration - -To observe the interplay of outputs between different TTP steps, execute: - -```bash -ttpforge run forgearmory//examples/outputs/outputs.yaml -``` - ---- - -## Expected Output - -```text -INFO [*] Validating Steps -INFO [+] Finished validating steps -INFO [+] Running current TTP: step_outputs_example -INFO [+] Running current step: raw_output -INFO ========= Executing ========== -this will be accessible in stdout -INFO ========= Result ========== -INFO [+] Finished running step: raw_output -INFO [+] Running current step: access_raw_output -INFO ========= Executing ========== -previous step output is this will be accessible in stdout - -INFO ========= Result ========== -INFO [+] Finished running step: access_raw_output -INFO [+] Running current step: with_json_output -INFO ========= Executing ========== -{"foo":"bar"} -INFO ========= Result ========== -INFO [+] Finished running step: with_json_output -INFO [+] Running current step: print_json -INFO ========= Executing ========== -bar -INFO ========= Result ========== -INFO [+] Finished running step: print_json -INFO [*] Completed TTP -INFO [*] No Cleanup Steps Found -``` diff --git a/ttps/examples/outputs/outputs.yaml b/ttps/examples/outputs/outputs.yaml deleted file mode 100644 index 2fa8c2b..0000000 --- a/ttps/examples/outputs/outputs.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -name: step_outputs_example -description: | - Illustrates how to pass outputs between steps - -steps: - - name: raw_output - inline: echo "this will be accessible in stdout" - - name: access_raw_output - inline: echo "previous step output is $forge.steps.raw_output.stdout" - - name: with_json_output - inline: echo {\"foo\":\"bar\"} - outputs: - my_value: - filters: - - json_path: foo - - name: print_json - inline: echo $forge.steps.with_json_output.outputs.my_value diff --git a/ttps/examples/steps/cleanup-step/README.md b/ttps/examples/steps/cleanup-step/README.md deleted file mode 100644 index 9a04b28..0000000 --- a/ttps/examples/steps/cleanup-step/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# File Creation and Cleanup using `test-cleanup` Step - -Discover how to create and subsequently clean up files leveraging the -`test-cleanup` step. This example showcases the capability to create a -directory and remove it in the cleanup step. - ---- - -## Running `cleanup-step.yaml` Demonstration - -Execute the following command to illustrate the functionality of -the `test-cleanup` step: - -```bash -ttpforge run forgearmory//examples/steps/cleanup-step/cleanup-step.yaml -``` - ---- - -## Expected Output - -```text -INFO [*] Validating Steps -INFO [+] Finished validating steps -INFO [+] Running current TTP: test-cleanup -INFO [+] Running current step: step_one -INFO ========= Executing ========== -# Directory "testDir" is created here -INFO ========= Done ========== -INFO [+] Finished running step: step_one -INFO [*] Completed TTP -INFO [*] Starting Cleanup -INFO ========= Executing ========== -# Directory "testDir" is removed here -INFO ========= Done ========== -INFO [*] Cleanup Complete -``` diff --git a/ttps/examples/steps/cleanup-step/cleanup-step.yaml b/ttps/examples/steps/cleanup-step/cleanup-step.yaml deleted file mode 100644 index 28907e8..0000000 --- a/ttps/examples/steps/cleanup-step/cleanup-step.yaml +++ /dev/null @@ -1,7 +0,0 @@ ---- -name: test-cleanup -steps: - - name: step_one - inline: mkdir testDir - cleanup: - inline: rm -rf testDir diff --git a/ttps/examples/steps/edit-step/README.md b/ttps/examples/steps/edit-step/README.md deleted file mode 100644 index 6735c06..0000000 --- a/ttps/examples/steps/edit-step/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# File Modification using `edit_file` Step - -Discover how to make amendments to files leveraging the `edit_file` step, -a versatile tool for editing files through string matching or regular expressions. - ---- - -## Running `edit-step.yaml` Demonstration - -Execute the following command to illustrate the power of the `edit_file` step: - -```bash -ttpforge run forgearmory//examples/steps/edit-step/edit-step.yaml -``` - ---- - -## Expected Output - -```text -INFO [*] Validating Steps -INFO [+] Finished validating steps -INFO [+] Running current TTP: edit_step_example -INFO [+] Running current step: target-file-pre-edit -INFO ========= Executing ========== -This is an example file. - -The TTP will replace the string below: - -REPLACE_ME - -It will also delete the multi-line string below and replace -it with a comment: - -result = await myclass.multi_line_function_call( - param1, - param2, -) - -Lastly, it will comment out the subsequent lines using a C-Style /* ... */ comment. - -another_multline_function_call( - param1, - param2, -) -INFO ========= Done ========== -INFO [+] Finished running step: target-file-pre-edit -INFO [+] Running current step: edit-target-file -INFO [+] Finished running step: edit-target-file -INFO [+] Running current step: target-file-post-edit -INFO ========= Executing ========== -This is an example file. - -The TTP has replaced the string below with: - -REPLACED_BY_EDIT - -The multi-line string was deleted and replaced with a comment: - -# replaced with comment - -The following lines have been commented using a C-Style /* ... */ comment: - -/*another_multline_function_call( - param1, - param2, -)*/ -INFO ========= Done ========== -INFO [+] Finished running step: target-file-post-edit -INFO [*] Completed TTP -INFO [*] Starting Cleanup -INFO ========= Executing ========== -INFO ========= Done ========== -INFO [*] Cleanup Complete -``` diff --git a/ttps/examples/steps/edit-step/edit-step.yaml b/ttps/examples/steps/edit-step/edit-step.yaml deleted file mode 100644 index 14497f5..0000000 --- a/ttps/examples/steps/edit-step/edit-step.yaml +++ /dev/null @@ -1,28 +0,0 @@ ---- -name: edit_step_example -description: edits a file in various ways -steps: - - name: target-file-pre-edit - inline: | - set -e - - echo -e "Target file pre-edit:" - cat file-to-edit.txt - - name: edit-target-file - edit_file: "file-to-edit.txt" - backup_file: "my-backup.txt" - edits: - - old: REPLACE_ME - new: REPLACED_BY_EDIT - - old: (?ms:^result = await myclass\.multi_line_function_call\(.*?\)$) - new: "# replaced with comment" - regexp: true - - old: (?P(?ms:^another_multline_function_call\(.*?\)$)) - new: "/*${fn_call}*/" - regexp: true - cleanup: - inline: mv my-backup.txt file-to-edit.txt - - name: target-file-post-edit - inline: | - echo "File contents after edit:" - cat file-to-edit.txt diff --git a/ttps/examples/steps/edit-step/file-to-edit.txt b/ttps/examples/steps/edit-step/file-to-edit.txt deleted file mode 100644 index 1fdc49e..0000000 --- a/ttps/examples/steps/edit-step/file-to-edit.txt +++ /dev/null @@ -1,21 +0,0 @@ -This is an example file. - -The TTP will replace the string below: - -REPLACE_ME - -It will also delete the multi-line string below and replace -it with a comment: - - -result = await myclass.multi_line_function_call( - param1, - param2, -) - -Finally, it will comment out the line below using a C-Style /* ... */ comment. - -another_multline_function_call( - param1, - param2, -) diff --git a/ttps/examples/sub-ttps/README.md b/ttps/examples/sub-ttps/README.md deleted file mode 100644 index 8859c60..0000000 --- a/ttps/examples/sub-ttps/README.md +++ /dev/null @@ -1,56 +0,0 @@ -# Chaining Tactics with SubTTPs - -Delve into the process of crafting a TTP with integrated SubTTPs. This technique -enables chaining multiple Tactics, Techniques, and Procedures for a streamlined -attack sequence. - ---- - -## Running `sub-ttps.yaml` Demonstration - -To visualize how SubTTPs function within a TTP, initiate the command below: - -```bash -ttpforge run forgearmory//examples/sub-ttps/sub-ttps.yaml -``` - ---- - -## Expected Output - -```text -INFO [*] Validating Steps -INFO [*] Validating Sub TTP: first_sub_ttp -INFO [*] Finished validating Sub TTP -INFO [*] Validating Sub TTP: second_sub_ttp -INFO [*] Finished validating Sub TTP -INFO [+] Finished validating steps -INFO [+] Running current TTP: sub_ttp_example -INFO [+] Running current step: first_sub_ttp -INFO [*] Executing Sub TTP: first_sub_ttp -INFO [+] Running current step: step_one -INFO ========= Executing ========== -hello -INFO ========= Done ========== -INFO [+] Finished running step: step_one -INFO Finished execution of sub ttp file -INFO [+] Finished running step: first_sub_ttp -INFO [+] Running current step: second_sub_ttp -INFO [*] Executing Sub TTP: second_sub_ttp -INFO [+] Running current step: step_one -INFO ========= Executing ========== -you said testing -INFO ========= Done ========== -INFO [+] Finished running step: step_one -INFO Finished execution of sub ttp file -INFO [+] Finished running step: second_sub_ttp -INFO [*] Completed TTP -INFO [*] Starting Cleanup -INFO ========= Executing ========== -cleanup my_sub_ttp_2 -INFO ========= Done ========== -INFO ========= Executing ========== -cleanup my_sub_ttp_1 -INFO ========= Done ========== -INFO [*] Cleanup Complete -``` diff --git a/ttps/examples/sub-ttps/my-sub-ttps/ttp1.yaml b/ttps/examples/sub-ttps/my-sub-ttps/ttp1.yaml deleted file mode 100644 index 15da551..0000000 --- a/ttps/examples/sub-ttps/my-sub-ttps/ttp1.yaml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: my_sub_ttp_1 -description: called from subttp example -steps: - - name: step_one - inline: echo hello - cleanup: - inline: echo cleanup my_sub_ttp_1 diff --git a/ttps/examples/sub-ttps/my-sub-ttps/ttp2.yaml b/ttps/examples/sub-ttps/my-sub-ttps/ttp2.yaml deleted file mode 100644 index f2495ca..0000000 --- a/ttps/examples/sub-ttps/my-sub-ttps/ttp2.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: my_sub_ttp_2 -description: called from subttp example -args: - - name: arg1 -steps: - - name: step_one - inline: echo "you said {{ .Args.arg1 }}" - cleanup: - inline: echo cleanup my_sub_ttp_2 diff --git a/ttps/examples/sub-ttps/sub-ttps.yaml b/ttps/examples/sub-ttps/sub-ttps.yaml deleted file mode 100644 index 23b9859..0000000 --- a/ttps/examples/sub-ttps/sub-ttps.yaml +++ /dev/null @@ -1,10 +0,0 @@ ---- -name: sub_ttp_example -description: run several subTTPs -steps: - - name: first_sub_ttp - ttp: examples/sub-ttps/my-sub-ttps/ttp1.yaml - - name: second_sub_ttp - ttp: examples/sub-ttps/my-sub-ttps/ttp2.yaml - args: - arg1: testing