diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..427e42e4 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,136 @@ +# Unreleased + +# v5.0 + +* [Issue #132](https://github.com/manheim/terraform-pipeline/issues/132) OpenSource this project. +* [Issue #148](https://github.com/manheim/terraform-pipeline/issues/148) Remove `env` as an argument to `Jenkinsfile.init`, it's not needed. +* [Issue #42](https://github.com/manheim/terraform-pipeline/issues/42) Enable Declarative pipelines, which in turn, enables Restart From Stage. + +# v4.3 + +* [Issue #107](https://github.com/manheim/terraform-pipeline/issues/107) WithAwsPlugin - alternative to AwssumePlugin to assume roles in different accounts +* [Issue #106](https://github.com/manheim/terraform-pipeline/issues/106) Use `withGlobalEnv` method on TerraformEnvironmentStage to add global variables to Stages +* [Issue #143](https://github.com/manheim/terraform-pipeline/issues/143) Fix defect introduced by v4.1, with change to CrqPlugin. +* [Issue #142](https://github.com/manheim/terraform-pipeline/issues/142) `withEnv` should be executed in order, along with every other plugin. This was not previously the case, so environment variables were not always visible to plugins that might need it. + +# v4.2 +* [Issue #43](https://github.com/manheim/terraform-pipeline/issues/43) AgentNodePlugin - intial support for docker containers in TerraformValidate & TerraformEnvironmentStage + +# v4.1 +* [Issue #111](https://github.com/manheim/terraform-pipeline/issues/111) Improve cross-pipeline configuration for CRQPlugin + * Allow multiple environment variables to configure CRQ_ENVIRONMENT +* [Issue #110](https://github.com/manheim/terraform-pipeline/issues/110) Improve cross-pipeline configuration for AwssumePlugin + * Allow case-insensitive `_AWS_ROLE_ARN` variables + * Allow hierarchy for `AWS_ROLE_ARN` variables + +# v4.0 +* [Issue #120](https://github.com/manheim/terraform-pipeline/issues/120) Delay when plugins are applied + * This is a change in the plugin behavior. Plugins will now affect TerraformCommands even after they've been instantiated - this was not previously the case. + * The purpose of this, is to allow other Plugins to modify Environment variables. Some TerraformCommands may be affected by the Environment variables at the time in which plugins are applied (eg: S3BackendPlugin). Make sure that all possible environment variables are available at the time in which plugins are applied to the commands. +* [Issue #115](https://github.com/manheim/terraform-pipeline/issues/115) Expand configuration for S3BackendPlugin + * Support upper or lower case environment prefixes + * Support general, or environment-specific configuration + * Standardize configuration for region, bucket, dynamodb_table + * ACTION: *Deprecated* DEFAULT_S3_BACKEND_REGION - use S3_BACKEND_REGION, env_S3_BACKEND_REGION, AWS_REGION, or AWS_DEFAULT_REGION + * ACTION: *Deprecated* env_S3_BACKEND_DYNAMO_TABLE_LOCK - use S3_BACKEND_DYNAMODB_TABLE, or env_S3_BACKEND_DYNAMODB_TABLE + +# v3.12 +* [Issue #24](https://github.com/manheim/terraform-pipeline/issues/24) ConfirmApplyPlugin - skip human confirmation + +# v3.11 +* [Issue #73](https://github.com/manheim/terraform-pipeline/issues/73) In a single-branch pipeline, allow terraform apply to happen +* Allow custom key pattern in S3BackendPlugin - https://github.com/manheim/terraform-pipeline/pull/117 +* [Issue #114](https://github.com/manheim/terraform-pipeline/issues/114) Point out DefaultEnvironmentPlugin earlier in README + +# v3.10 +* [Issue #103](https://github.com/manheim/terraform-pipeline/issues/103) Support multiple repos +* [Issue #101](https://github.com/manheim/terraform-pipeline/issues/101) Expect test suite to exist locally by default + +# v3.9 +* [Issue #99](https://github.com/manheim/terraform-pipeline/issues/99) Added RegressionStage to allow running automated tests. + +# v3.8 +* [Issue #90](https://github.com/manheim/terraform-pipeline/issues/90) Allow configuration of the directory where Terraform runs + +# v3.7 +* [Issue #67](https://github.com/manheim/terraform-pipeline/issues/67) Support injecting CredentialsPlugin credentials into the BuildStage +* [Issue #71](https://github.com/manheim/terraform-pipeline/issues/71) Update README code examples with the latest stable release. +* [Issue #80](https://github.com/manheim/terraform-pipeline/issues/80) Fix S3Backend code examples. +* [Issue #72](https://github.com/manheim/terraform-pipeline/issues/72) Improve README instructions for setting up a pipeline. + +# v3.6 +* [Issue #84](https://github.com/manheim/terraform-pipeline/issues/84) Support DynamoDb table locking in S3BackendPlugin + +# v3.5 +* [Issue #75](https://github.com/manheim/terraform-pipeline/issues/75) Be able to skip awssume if not doing a cross-account deploy. Disable by not specifying `_AWS_ROLE_ARN` variable. +* [Issue #62](https://github.com/manheim/terraform-pipeline/issues/62) Create a new FileParametersPlugin, to set environment variables through properties files. +* [Issue #76](https://github.com/manheim/terraform-pipeline/issues/76) The README shows an example of providing a local Customizations class. That doesn't actually work. Remove that from the README until we can find something that works. + +# v3.4 +* [Issue #49](https://github.com/manheim/terraform-pipeline/issues/49) Allow Consul address to be provided in ways other than hard-coding. +* [Issue #50](https://github.com/manheim/terraform-pipeline/issues/50) Allow Consul path pattern for environments to be overridden. + +# v3.3 +* [Issue #44](https://github.com/manheim/terraform-pipeline/issues/44) Create a new DefaultEnvironmentPlugin, to provide a terraform variable `environment` by default. + +# v3.2 +* [Issue #33](https://github.com/manheim/terraform-pipeline/issues/33) Add information in the README to control the node label for your pipelines. +* Update README code examples + +# v3.1 +* TerraformCommand Refactor: use explicit interfaces to customize commands, stop using Closures. +* Add a unit test suite for every plugin +* Add new S3BackendPlugin to support storing terraform state in S3 + +# v3.0 +* [Issue #35](https://github.com/manheim/terraform-pipeline/issues/35): turn hardcoded backend path for terraform init into a new ConsulBackendPlugin. BackendPath is no longer set by default. + +# v2.4 +* Bug fix: Prefer Jenkinsfile.defaultNodeName over environment variable DEFAULT_NODE_NAME when choosing the node to run jobs +* ParameterStoreBuildWrapperPlugin now available, and is the preferred method to retrieve ParameterStore parameters. Start deprecating use of ParameterStoreExecPlugin. + +# v2.3.1 +* Optionally stash and unstash an artifact generated by the BuildStage. See Issue #40 (https://github.com/manheim/terraform-pipeline/issues/40) +* Delete and checkout SCM only once, at the beginning of every TerraformEnvironmentStage + +# v2.3 +* Add a BuildStage.groovy that can be used to insert an arbitrary build script in your pipeline. + +# v2.2.1 +* Fix typo in README for ParameterStoreExecPlugin. Example code did not work if you copy-paste. + +# v2.2 +* Update README with clarifications on Plugin use. +* Add missing AwssumePlugin to README + +# v2.1 +* Update README with strategies for DRY'ing up plugin configuration. + +# v2.0 +* [Issue #10](https://github.com/manheim/terraform-pipeline/issues/10) - flesh out a general pattern for plugins. These are breaking changes. +* AnsiColorPlugin is no longer active by default. Enable AnsiColorPlugin by calling `AnsiColorPlugin.init()` +* CrqPlugin is no longer active by default. Enable CrqPlugin by calling `CrqPlugin.init()` +* Combine and rename ParameterStorePlugin to ParameterStoreExecPlugin. +* ParameterStoreExecPlugin is no longer active by default. Enable ParameterExecStorePlugin by calling `ParameterStoreExecPlugin.init()` +* New TerraformEnvironmentStagePlugin interface - AnsiColorPlugin and CrqPlugin implements this. Plugins should implement this type of interface going forward. +* StageConditionPlugin is now implemented as a TerraformEnvironmentStagePlugin. It continues to be enabled by default, and continues to default to the master branch. +* Rename StageConditionPlugin to ConditionalApplyPlugin. +* TerraformConfirmPlugin is now implemented as a TerraformEnvironmentStagePlugin. It continues to be enabled by default, with all existing defaults. +* Rename TerraformConfirmPlugin to ConfirmApplyPlugin + +# v1.7 +* [Issue #16](https://github.com/manheim/terraform-pipeline/issues/16): support either HTTPS or SSH urls when constructing repo slug (used for consul state path on terraform plan and terraform apply) +* Add gradle and unit testing + +# v1.6 +* awssume is no longer used by default in terraform-plan and terraform-apply +* A new AwssumePlugin is available, which will add awssume functionality if you want it + +# v1.5 +* parameter-store-exec is no longer used by default in terraform-plan, terraform-apply +* A new ParameterStoreExec Plugin is available, which will restore that functionality if you want it. +* Reduce boiler plate code for Jenkinsfile - a new init() method takes in the Script, the environment, and an optional customization class (just needs an init()) method, where you can load any plugins that might customize the behavior of your pipeline (eg: ParameterStoreExec) + +# v1.3 +* Store the `env` variable for later use +* Allow pipeline users to provide a DEFAULT_NODE_NAME environment variable, rather than explicitly specifying it in the pipeline diff --git a/Jenkinsfile.terraform-pipeline b/Jenkinsfile.terraform-pipeline new file mode 100644 index 00000000..e69de29b diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..a7e8173a --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distbute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + rpply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md new file mode 100644 index 00000000..501f063d --- /dev/null +++ b/README.md @@ -0,0 +1,311 @@ +# terraform-pipeline +A reusable pipeline template to apply terraform configuration serially across multiple environments. + +# Requirements and Assumptions +1. You have a separate terraform project that can be run with the following commands: + 1. `terraform init` + 2. `terraform plan` + 3. `terraform apply` +2. After running a terraform plan, your pipeline will pause. A human must review and confirm the plan before `terraform apply` is run. See: [ConfirmApplyPlugin](#confirmapplyplugin). +3. When running your pipeline on a branch, only the `terraform init` and `terraform plan` commands will be run across all of your environments. `terraform apply` is only made available on the master branch. See: [ConditionalApplyPlugin](#conditionalapplyplugin). +4. If your environments might create conflicting resources, a TF_VAR_environment variable is automatically available to your project and can be used to namespace your resources and avoid conflicts. See: [DefaultEnvironmentPlugin](#defaultenvironmentplugin). +5. Import terraform-pipeline as a Jenkinsfile library to your Jenkins instance. +![Importing Pipeline Library](./images/import-terraform-pipeline.png) + +# How to Use +1. Create a Jenkinsfile in your terraform project and import the [version](https://github.com/manheim/terraform-pipeline/releases) of terraform-pipeline that you want to use. It's recommended that you always use the latest version. +``` +// Jenkinsfile +@Library(['terraform-pipeline@v5.0']) _ +``` +2. Provide terraform-pipeline with a reference to the Jenkinsfile context, so it can do all of it's magic under the hood. +``` +// Jenkinsfile +... +Jenkinsfile.init(this) +``` +3. Start your pipeline with a syntatic analysis of your terraform project (this is optional, but highly recommended) +``` +// Jenkinsfile +... +def validate = new TerraformValidateStage() +``` +4. Create deployment Stages for each of the environments that you would normally deploy to. This example creates terraform resources for qa, uat, and prod environments. The number and names of your environments can differ from this example. Choose the environments and environment names that reflect your own development process to go from Code to Customer. +``` +// Jenkinsfile +... +def deployQa = new TerraformEnvironmentStage('qa') +def deployUat = new TerraformEnvironmentStage('uat') +def deployProd = new TerraformEnvironmentStage('prod') +``` +5. Link the Stages together in the order that you want them to run. This examples first does a syntactic validation, then deploys qa, then uat, then prod. Each step *MUST* succeed before it can proceed on to the next. +``` +// Jenkinsfile +... +validate.then(deployQa) + .then(deployUat) + .then(deployProd) +``` +6. The design of this library is influenced by the [Builder Pattern](https://en.wikipedia.org/wiki/Builder_pattern) - your pipeline has been configured, but hasn't been constructed just yet. Finalize and create your pipeline by calling the `build()` method. This should only be done once - no code should come after calling this method. +``` +// Jenkinsfile +... + .build() +``` + +7. From beginning to end, your Jenkinsfile should roughly look like this: + +``` +@Library(['terraform-pipeline@v5.0']) _ + +Jenkinsfile.init(this) + +def validate = new TerraformValidateStage() +def deployQa = new TerraformEnvironmentStage('qa') +def deployUat = new TerraformEnvironmentStage('uat') +def deployProd = new TerraformEnvironmentStage('prod') + +validate.then(deployQa) + .then(deployUat) + .then(deployProd) + .build() +``` + +8. Load your project into Jenkins, and point it to your newly created Jenkinsfile. + 1. Create a new job using the 'New Item' menu + + ![New Item](./images/NewItem.png) + 2. Select Multibranch Pipeline after naming your new job + + ![Multibranch Pipeline](./images/MultibranchPipeline.png) + 3. Configure your new job, and point it to the location of your source code. + + ![Loading/Configuring Project](./images/configure-project.png) + +9. If everything was successful, you should see something like this: + +![DefaultPipelineSuccess](./images/default-pipeline-success.png) + +# Customizing Your Pipeline With Plugins + +The example above gives you a bare-bones pipeline, and there may be Jenkinsfile features that you'd like to take advantage of. Some of these features have been pre-defined as Plugins for this library. Pre-defined plugins can be enabled by simply calling their static `init()` method. + +### Default Plugins +* [ConfirmApplyPlugin](./docs/ConfirmApplyPlugin.md): pause and review the plan, before applying any changes. +* [ConditionalApplyPlugin](./docs/ConditionalApplyPlugin.md): only allow apply on master branch. +* [DefaultEnvironmentPlugin](./docs/DefaultEnvironmentPlugin.md): automatically set `TF_VAR_environment` variable. +### Credentials and Configuration Management +* [CredentialsPlugin](./docs/CredentialsPlugin.md): Inject Jenkins credentials into your BuildStage. +* [FileParametersPlugin](./docs/FileParametersPlugin.md): Use properties files to inject environment-specific variables. +* [ParameterStoreBuildWrapperPlugin](./docs/ParameterStoreBuildWrapperPlugin.md): Inject environment-specific variables using `withAwsParameterStore`. +* [ParameterStoreExecPlugin](./docs/ParameterStoreExecPlugin.md): Inject environment-specific variables using parameter-store-exec. +### IAM Role Management +* [AwssumePlugin](./docs/AwssumePlugin.md): Use the awssume gem to assume different IAM roles. +* [WithAwsPlugin](./docs/WithAwsPlugin.md): Use `withAws` to assume different IAM roles. +### Terraform Backend Management +* [ConsulBackendPlugin](./docs/ConsulBackendPlugin.md): Use Consul backend to manage terraform state. +* [S3BackendPlugin](./docs/S3BackendPlugin.md): Use S3 backend to manage terraform state. +### Other +* [AgentNodePlugin](./docs/AgentNodePlugin.md): Run your pipeline on agents that are configured with Docker. +* [AnsiColorPlugin](./docs/AnsiColorPlugin.md): Enable ansi-color output. +* [CrqPlugin](./docs/CrqPlugin.md): Use the manheim_remedier gem to open automated Change Requests. +* [TerraformDirectoryPlugin](./docs/TerraformDirectoryPlugin.md): Change the default directory containing your terraform code. + +## Write your own Plugin + +This library was intended to be customizable and extendable - if you don't find a predefined plugin for a feature that you need or want, feel free to create your own. + +1. Create your own shared library. See: [DRY'ing your Plugin configuration](#drying-your-plugin-configuration) +2. Create a `src` folder, and create a groovy file for your plugin. +3. Define your class, and implement the appropriate Plugin interface, depending on which Stage or Command your plugin will affect. (Eg: [TerraformEnvironmentStagePlugin](./src/TerraformEnvironmentStagePlugin.groovy), [TerraformApplyCommandPlugin](./src/TerraformApplyCommandPlugin.groovy), etc). +4. Define a `public static init()` method, then add an instance of your plugin to each of the Stages/Commands that it will modify. (Eg: [AnsiColorPlugin](./src/AnsiColorPlugin.groovy#L6-L8)) +5. Import your shared library into your Jenkinsfile. +6. Call your `init()` method in your Jenkinsfile before calling `build()` on your pipeline. +7. If your plugin could be useful to others, feel free to put in a Pull Request. + +# Control Where Your Jobs Are Run + +By default, the pipeline jobs are not assigned to a particular Jenkins slave label. If you want to tie your pipeline to particular Jenkins slave label, you can do so with the following line of code: + +``` +Jenkinsfile.defaultNodeName = 'myNode' +``` + +Alternatively, you can assign all of your pipelines to a particular Jenkins slave label without using code, by setting a `DEFAULT_NODE_NAME` environment variable on your Jenkins master. + +# Additional Pipeline Stages + +* [BuildStage](./docs/BuildStage.md) - build a deployment artifact that will subsequently be used by TerraformEnvironmentStage. +* [RegressionStage](./docs/RegressionStage.md) - run automated tests against an environment + +# [DRY'ing](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) your Plugin configuration + +It's likely that you'll use a number of different Plugins for your particular terraform-pipeline application. It's also likely that you'll have a number of different applications using terraform-pipeline, and many of these applications may share the same plugin configuration. Rather than duplicate and clutter your Jenkinsfile with these details, you can group all of your Plugin initialization into a single class, and share that class across your pipelines with a shared library. + +1. Create a new repository for the shared library called `terraform-pipeline-customizations`. +2. In that repository, create a new file called `Customizations.groovy`. +3. Create a static `init()` method in your class, and add your Plugin configuration there. In the example below, the Customization will enable the AnsiColorPlugin, and the ParameterStoreBuildWrapperPlugin by default. +``` +// Customizations.groovy + +class Customizations { + public static void init() { + AnsiColorPlugin.init() + ParameterStoreBuildWrapperPlugin.init() + } +} +``` +4. Load your repository as a shared library (See: [Using Libraries](https://jenkins.io/doc/book/pipeline/shared-libraries/)). +5. Import your shared library and pass your Customization class to the [Jenkinsfile.init()](./src/Jenkinsfile.groovy#L67-L74) method. Like terraform-pipeline, it's a good practice to strictly control your customization library versions. +``` +// Jenkinsfile +@Library(['terraform-pipeline@v5.0', 'terraform-pipeline-customizations@v1.0']) _ + +Jenkinsfile.init(this, Customizations) +... +``` +6. Repeat Step 5 above for every project that you want to apply your Customzations to. + +# Scripted vs Declarative Pipelines (+Restart From Stage) + +Jenkinsfile has a number of quirks, which in turn creates a number of frustrating short-comings. The most noticeable quirk is the two distinctive syntaxes for creating a pipeline: + +1. [Scripted Pipelines](https://jenkins.io/doc/book/pipeline/syntax/#scripted-pipeline) +2. [Declarative Pipelines](https://jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline) + +Scripted Pipelines are much easier to work with, and offer a lot of flexibility and programmability. Declarative Pipelines on the otherhand, are much less flexible, but offer the really important feature known as ['Restart From Stage'](https://jenkins.io/doc/book/pipeline/running-pipelines/#restart-from-a-stage) - the ability to re-run portions of a previous pipeline run. + +terraform-pipeline attempts to abstract away these two different types of pipelines, so that you can get the features that you want, without needing to write your pipeline code in a specific/arbitrary way. + +By default, your pipeline will be a Scripted Pipeline. You can convert your pipeline to a Declarative Pipeline by enabling a flag: + +``` +Jenkinsfile.declarative = true +``` + +A short-coming of Declarative Pipelines is the inability to use variables when defining Stage names (See: [JENKINS-43820](https://issues.jenkins-ci.org/browse/JENKINS-43820)). The compromise made by terraform-pipeline is to name each of the top-level Stage names using consecutive numbers '1', '2', '3', etc. The following code: + +``` +@Library(['terraform-pipeline']) _ + +Jenkinsfile.init(this) +Jenkinsfile.declarative = true + +def validate = new TerraformValidateStage() +def qa = new TerraformEnvironmentStage('qa') +def uat = new TerraformEnvironmentStage('uat') +def prod = new TerraformEnvironmentStage('prod') + +validate.then(qa) + .then(uat) + .then(prod) + .build() +``` + +will produce a Declarative Pipeline that looks like this: + +![Declarative Pipeline](./images/declarative-pipeline.png) + +When using the Restart from Stage feature, you'll need to map the numbered Stages to the Stages that you've defined in your Jenkinsfile. In this example, 1 = Validate, 2 = Qa, 3 = Uat, 4 = Prod. + +![Restart From Stage - Numbers](./images/restart-from-stage-numbers.png) + +Mapping arbitrary numbers to your Stages can likely be annoying. If you want to give your Stages more meaningful names, you can override the underlying Declarative Pipeline template with your own, using the `Jenkinsfile.pipelineTemplate` variable, and a Customizations library (See: [DRY'ing your Plugin Configuration](#drying-your-plugin-configuration)). + +As an example, we'll create a `vars/CustomPipelineTemplate.groovy` in our customizations library, and define top-level Stages that match the Stages of our pipeline - `Validate`, `Qa`, `Uat`, and `Prod`. + +``` +// terraform-pipeline-customizations/vars/CustomPipelineTemplate.groovy + +def call(stages) { + pipeline { + agent none + + stages { + stage('Validate') { + steps { + script { + ((Stage)stages.getAt(0)).build() + } + } + } + + stage('Qa') { + steps { + script { + ((Stage)stages.getAt(1)).build() + } + } + } + + stage('Uat') { + steps { + script { + ((Stage)stages.getAt(2)).build() + } + } + } + + stage('Prod') { + steps { + script { + ((Stage)stages.getAt(3)).build() + } + } + } + } + } +} +``` + +In your Jenkinsfile, override the default pipelineTemplate, and point it to your new pipeline template function. For example: + +``` +@Library(['terraform-pipeline', 'terraform-pipeline-customizations']) _ + +Jenkinsfile.init(this) +Jenkinsfile.declarative = true +Jenkinsfile.pipelineTemplate = this.CustomPipelineTemplate + +def validate = new TerraformValidateStage() +def qa = new TerraformEnvironmentStage('qa') +def uat = new TerraformEnvironmentStage('uat') +def prod = new TerraformEnvironmentStage('prod') + +validate.then(qa) + .then(uat) + .then(prod) + .build() +``` + +This will generate a new Declarative Pipeline, using your custom template. + +![Customized Declarative Pipeline](./images/custom-declarative-pipeline.png) + +Restart from Stage will now display more sensible names. __Note:__ This is in __NO__ way dynamic. If you reorder the Stages in your Jenkinsfile, you'll need to reorder the Stage names in your custom template. This is an unfortunate side-effect of the strict syntax of Declarative Pipelines. + +![Restart From Stage](./images/restart-from-stage.png) + +# How to Contribute + +1. Fork this project. +2. Make your changes and run the tests with `./gradlew test`. +3. Validate your changes by pointing a terraform-pipeline project to your fork. +4. Update the CHANGELOG with your changes. Changes are queued under "Unreleased", until an official release is cut. +5. Your PR will be reviewed and merged into a release branch. +6. Release branches are periodically reviewed, then merged into master. An official release is then published, and the release branch is deleted. + +# Goals that this library is trying to achieve: + +1. Just like our application code, infrastructure code should be written once, and should be reusable for all environments. + 1. Configuration, especially environment-specific configuration, should be externalized. Where it's externalized to should be irrelevant. +2. As much as possible, a pipeline should reflect what teams do to get from Code to Customer - no more, but also no less. + 1. Allow teams to specify their own steps in that process, and teams should choose how those steps are linked together. + 2. This is an OpenSource project - defaults should make reasonable sense for anyone that happens to use this project. +3. Apply the [Open/Closed Principle](https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle) + 1. You should rarely need to change the base code, everything should be open for extension without modification to the base code. + 2. It should be possible to add behaviors through Plugins and Decorations - this makes behavior addable/removable/extenable. + 3. Think of plugins as interchangeable Lego pieces - you can swap one piece out for another, without fundamentally altering what it is to be a Pipeline. +4. There should only be one way to Production, and that way should be crystal clear. + 1. The master branch (or its equivalent) is the one-and-only way to Production. + diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..e42f0108 --- /dev/null +++ b/build.gradle @@ -0,0 +1,32 @@ +apply plugin: 'groovy' +apply plugin: 'jacoco' + +repositories { + mavenCentral() +} + +dependencies { + compile 'org.codehaus.groovy:groovy-all:2.4.11' + + testCompile 'com.lesfurets:jenkins-pipeline-unit:1.1' + + testCompile 'junit:junit:4.11' + testCompile group: 'de.bechte.junit', name: 'junit-hierarchicalcontextrunner', version: '4.11.1' + testCompile group: 'com.cyrusinnovation', name: 'mockito-groovy-support', version: '1.3' + testImplementation 'org.hamcrest:hamcrest-library:1.3' +} + +sourceSets { + test { + groovy { + srcDirs = ['test'] + } + } + + main { + groovy { + srcDirs = ['src'] + } + } + +} diff --git a/build/classes/groovy/main/AgentNodePlugin$_addAgent_closure1$_closure2.class b/build/classes/groovy/main/AgentNodePlugin$_addAgent_closure1$_closure2.class new file mode 100644 index 00000000..69cf06e7 Binary files /dev/null and b/build/classes/groovy/main/AgentNodePlugin$_addAgent_closure1$_closure2.class differ diff --git a/build/classes/groovy/main/AgentNodePlugin$_addAgent_closure1.class b/build/classes/groovy/main/AgentNodePlugin$_addAgent_closure1.class new file mode 100644 index 00000000..be0db57b Binary files /dev/null and b/build/classes/groovy/main/AgentNodePlugin$_addAgent_closure1.class differ diff --git a/build/classes/groovy/main/AgentNodePlugin.class b/build/classes/groovy/main/AgentNodePlugin.class new file mode 100644 index 00000000..89df039f Binary files /dev/null and b/build/classes/groovy/main/AgentNodePlugin.class differ diff --git a/build/classes/groovy/main/AnsiColorPlugin$_addColor_closure1$_closure2.class b/build/classes/groovy/main/AnsiColorPlugin$_addColor_closure1$_closure2.class new file mode 100644 index 00000000..852e5f91 Binary files /dev/null and b/build/classes/groovy/main/AnsiColorPlugin$_addColor_closure1$_closure2.class differ diff --git a/build/classes/groovy/main/AnsiColorPlugin$_addColor_closure1.class b/build/classes/groovy/main/AnsiColorPlugin$_addColor_closure1.class new file mode 100644 index 00000000..a177cd10 Binary files /dev/null and b/build/classes/groovy/main/AnsiColorPlugin$_addColor_closure1.class differ diff --git a/build/classes/groovy/main/AnsiColorPlugin.class b/build/classes/groovy/main/AnsiColorPlugin.class new file mode 100644 index 00000000..c082ec98 Binary files /dev/null and b/build/classes/groovy/main/AnsiColorPlugin.class differ diff --git a/build/classes/groovy/main/AwssumePlugin.class b/build/classes/groovy/main/AwssumePlugin.class new file mode 100644 index 00000000..2826e37e Binary files /dev/null and b/build/classes/groovy/main/AwssumePlugin.class differ diff --git a/build/classes/groovy/main/BuildGraph.class b/build/classes/groovy/main/BuildGraph.class new file mode 100644 index 00000000..eddccc3c Binary files /dev/null and b/build/classes/groovy/main/BuildGraph.class differ diff --git a/build/classes/groovy/main/BuildStage$_decorate_closure3$_closure7.class b/build/classes/groovy/main/BuildStage$_decorate_closure3$_closure7.class new file mode 100644 index 00000000..86aa4f3b Binary files /dev/null and b/build/classes/groovy/main/BuildStage$_decorate_closure3$_closure7.class differ diff --git a/build/classes/groovy/main/BuildStage$_decorate_closure3.class b/build/classes/groovy/main/BuildStage$_decorate_closure3.class new file mode 100644 index 00000000..572c3acb Binary files /dev/null and b/build/classes/groovy/main/BuildStage$_decorate_closure3.class differ diff --git a/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2$_closure4$_closure5$_closure6.class b/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2$_closure4$_closure5$_closure6.class new file mode 100644 index 00000000..d5d7c097 Binary files /dev/null and b/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2$_closure4$_closure5$_closure6.class differ diff --git a/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2$_closure4$_closure5.class b/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2$_closure4$_closure5.class new file mode 100644 index 00000000..cd9a1b0d Binary files /dev/null and b/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2$_closure4$_closure5.class differ diff --git a/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2$_closure4.class b/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2$_closure4.class new file mode 100644 index 00000000..b5a8832a Binary files /dev/null and b/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2$_closure4.class differ diff --git a/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2.class b/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2.class new file mode 100644 index 00000000..7ccee43e Binary files /dev/null and b/build/classes/groovy/main/BuildStage$_pipelineConfiguration_closure2.class differ diff --git a/build/classes/groovy/main/BuildStage$_unstashArtifact_closure1.class b/build/classes/groovy/main/BuildStage$_unstashArtifact_closure1.class new file mode 100644 index 00000000..46f81ac6 Binary files /dev/null and b/build/classes/groovy/main/BuildStage$_unstashArtifact_closure1.class differ diff --git a/build/classes/groovy/main/BuildStage.class b/build/classes/groovy/main/BuildStage.class new file mode 100644 index 00000000..d2404c5f Binary files /dev/null and b/build/classes/groovy/main/BuildStage.class differ diff --git a/build/classes/groovy/main/BuildStagePlugin.class b/build/classes/groovy/main/BuildStagePlugin.class new file mode 100644 index 00000000..c8e2b36d Binary files /dev/null and b/build/classes/groovy/main/BuildStagePlugin.class differ diff --git a/build/classes/groovy/main/ConditionalApplyPlugin$_onlyOnExpectedBranch_closure1.class b/build/classes/groovy/main/ConditionalApplyPlugin$_onlyOnExpectedBranch_closure1.class new file mode 100644 index 00000000..75cf0ba5 Binary files /dev/null and b/build/classes/groovy/main/ConditionalApplyPlugin$_onlyOnExpectedBranch_closure1.class differ diff --git a/build/classes/groovy/main/ConditionalApplyPlugin.class b/build/classes/groovy/main/ConditionalApplyPlugin.class new file mode 100644 index 00000000..71cb1cd5 Binary files /dev/null and b/build/classes/groovy/main/ConditionalApplyPlugin.class differ diff --git a/build/classes/groovy/main/ConfirmApplyPlugin$_addConfirmation_closure1$_closure2.class b/build/classes/groovy/main/ConfirmApplyPlugin$_addConfirmation_closure1$_closure2.class new file mode 100644 index 00000000..321bde5f Binary files /dev/null and b/build/classes/groovy/main/ConfirmApplyPlugin$_addConfirmation_closure1$_closure2.class differ diff --git a/build/classes/groovy/main/ConfirmApplyPlugin$_addConfirmation_closure1.class b/build/classes/groovy/main/ConfirmApplyPlugin$_addConfirmation_closure1.class new file mode 100644 index 00000000..08586887 Binary files /dev/null and b/build/classes/groovy/main/ConfirmApplyPlugin$_addConfirmation_closure1.class differ diff --git a/build/classes/groovy/main/ConfirmApplyPlugin.class b/build/classes/groovy/main/ConfirmApplyPlugin.class new file mode 100644 index 00000000..154c2793 Binary files /dev/null and b/build/classes/groovy/main/ConfirmApplyPlugin.class differ diff --git a/build/classes/groovy/main/ConsulBackendPlugin$_getBackendPath_closure1.class b/build/classes/groovy/main/ConsulBackendPlugin$_getBackendPath_closure1.class new file mode 100644 index 00000000..d93d15ec Binary files /dev/null and b/build/classes/groovy/main/ConsulBackendPlugin$_getBackendPath_closure1.class differ diff --git a/build/classes/groovy/main/ConsulBackendPlugin.class b/build/classes/groovy/main/ConsulBackendPlugin.class new file mode 100644 index 00000000..d88d4765 Binary files /dev/null and b/build/classes/groovy/main/ConsulBackendPlugin.class differ diff --git a/build/classes/groovy/main/CredentialsPlugin$_addBuildCredentials_closure1$_closure2.class b/build/classes/groovy/main/CredentialsPlugin$_addBuildCredentials_closure1$_closure2.class new file mode 100644 index 00000000..8c1d3f14 Binary files /dev/null and b/build/classes/groovy/main/CredentialsPlugin$_addBuildCredentials_closure1$_closure2.class differ diff --git a/build/classes/groovy/main/CredentialsPlugin$_addBuildCredentials_closure1$_closure3.class b/build/classes/groovy/main/CredentialsPlugin$_addBuildCredentials_closure1$_closure3.class new file mode 100644 index 00000000..d2e52065 Binary files /dev/null and b/build/classes/groovy/main/CredentialsPlugin$_addBuildCredentials_closure1$_closure3.class differ diff --git a/build/classes/groovy/main/CredentialsPlugin$_addBuildCredentials_closure1.class b/build/classes/groovy/main/CredentialsPlugin$_addBuildCredentials_closure1.class new file mode 100644 index 00000000..7b594ced Binary files /dev/null and b/build/classes/groovy/main/CredentialsPlugin$_addBuildCredentials_closure1.class differ diff --git a/build/classes/groovy/main/CredentialsPlugin.class b/build/classes/groovy/main/CredentialsPlugin.class new file mode 100644 index 00000000..1e1f3b14 Binary files /dev/null and b/build/classes/groovy/main/CredentialsPlugin.class differ diff --git a/build/classes/groovy/main/CrqPlugin$_addCrq_closure1.class b/build/classes/groovy/main/CrqPlugin$_addCrq_closure1.class new file mode 100644 index 00000000..6e683a75 Binary files /dev/null and b/build/classes/groovy/main/CrqPlugin$_addCrq_closure1.class differ diff --git a/build/classes/groovy/main/CrqPlugin.class b/build/classes/groovy/main/CrqPlugin.class new file mode 100644 index 00000000..7c951e3b Binary files /dev/null and b/build/classes/groovy/main/CrqPlugin.class differ diff --git a/build/classes/groovy/main/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1$_closure2.class b/build/classes/groovy/main/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1$_closure2.class new file mode 100644 index 00000000..c1514cb9 Binary files /dev/null and b/build/classes/groovy/main/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1$_closure2.class differ diff --git a/build/classes/groovy/main/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1.class b/build/classes/groovy/main/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1.class new file mode 100644 index 00000000..470ff78b Binary files /dev/null and b/build/classes/groovy/main/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1.class differ diff --git a/build/classes/groovy/main/DefaultEnvironmentPlugin.class b/build/classes/groovy/main/DefaultEnvironmentPlugin.class new file mode 100644 index 00000000..74bc170e Binary files /dev/null and b/build/classes/groovy/main/DefaultEnvironmentPlugin.class differ diff --git a/build/classes/groovy/main/EnvironmentVariablePlugin$_withEnvClosure_closure1$_closure2.class b/build/classes/groovy/main/EnvironmentVariablePlugin$_withEnvClosure_closure1$_closure2.class new file mode 100644 index 00000000..0bf78c70 Binary files /dev/null and b/build/classes/groovy/main/EnvironmentVariablePlugin$_withEnvClosure_closure1$_closure2.class differ diff --git a/build/classes/groovy/main/EnvironmentVariablePlugin$_withEnvClosure_closure1.class b/build/classes/groovy/main/EnvironmentVariablePlugin$_withEnvClosure_closure1.class new file mode 100644 index 00000000..ebe72d09 Binary files /dev/null and b/build/classes/groovy/main/EnvironmentVariablePlugin$_withEnvClosure_closure1.class differ diff --git a/build/classes/groovy/main/EnvironmentVariablePlugin.class b/build/classes/groovy/main/EnvironmentVariablePlugin.class new file mode 100644 index 00000000..a24d4a87 Binary files /dev/null and b/build/classes/groovy/main/EnvironmentVariablePlugin.class differ diff --git a/build/classes/groovy/main/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1$_closure3.class b/build/classes/groovy/main/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1$_closure3.class new file mode 100644 index 00000000..d3619df8 Binary files /dev/null and b/build/classes/groovy/main/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1$_closure3.class differ diff --git a/build/classes/groovy/main/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1.class b/build/classes/groovy/main/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1.class new file mode 100644 index 00000000..2d3622b8 Binary files /dev/null and b/build/classes/groovy/main/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1.class differ diff --git a/build/classes/groovy/main/FileParametersPlugin$_getVariables_closure2.class b/build/classes/groovy/main/FileParametersPlugin$_getVariables_closure2.class new file mode 100644 index 00000000..f97823f3 Binary files /dev/null and b/build/classes/groovy/main/FileParametersPlugin$_getVariables_closure2.class differ diff --git a/build/classes/groovy/main/FileParametersPlugin.class b/build/classes/groovy/main/FileParametersPlugin.class new file mode 100644 index 00000000..a515f30f Binary files /dev/null and b/build/classes/groovy/main/FileParametersPlugin.class differ diff --git a/build/classes/groovy/main/Jenkinsfile$_build_closure2.class b/build/classes/groovy/main/Jenkinsfile$_build_closure2.class new file mode 100644 index 00000000..83df65a2 Binary files /dev/null and b/build/classes/groovy/main/Jenkinsfile$_build_closure2.class differ diff --git a/build/classes/groovy/main/Jenkinsfile$_getScmUrl_closure1.class b/build/classes/groovy/main/Jenkinsfile$_getScmUrl_closure1.class new file mode 100644 index 00000000..253a9114 Binary files /dev/null and b/build/classes/groovy/main/Jenkinsfile$_getScmUrl_closure1.class differ diff --git a/build/classes/groovy/main/Jenkinsfile.class b/build/classes/groovy/main/Jenkinsfile.class new file mode 100644 index 00000000..3871cf28 Binary files /dev/null and b/build/classes/groovy/main/Jenkinsfile.class differ diff --git a/build/classes/groovy/main/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1$_closure2.class b/build/classes/groovy/main/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1$_closure2.class new file mode 100644 index 00000000..93c3f540 Binary files /dev/null and b/build/classes/groovy/main/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1$_closure2.class differ diff --git a/build/classes/groovy/main/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1.class b/build/classes/groovy/main/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1.class new file mode 100644 index 00000000..cc299947 Binary files /dev/null and b/build/classes/groovy/main/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1.class differ diff --git a/build/classes/groovy/main/ParameterStoreBuildWrapperPlugin.class b/build/classes/groovy/main/ParameterStoreBuildWrapperPlugin.class new file mode 100644 index 00000000..00491fb6 Binary files /dev/null and b/build/classes/groovy/main/ParameterStoreBuildWrapperPlugin.class differ diff --git a/build/classes/groovy/main/ParameterStoreExecPlugin$_addEnvVariables_closure1$_closure2.class b/build/classes/groovy/main/ParameterStoreExecPlugin$_addEnvVariables_closure1$_closure2.class new file mode 100644 index 00000000..90cfeb21 Binary files /dev/null and b/build/classes/groovy/main/ParameterStoreExecPlugin$_addEnvVariables_closure1$_closure2.class differ diff --git a/build/classes/groovy/main/ParameterStoreExecPlugin$_addEnvVariables_closure1.class b/build/classes/groovy/main/ParameterStoreExecPlugin$_addEnvVariables_closure1.class new file mode 100644 index 00000000..3f9e6f2d Binary files /dev/null and b/build/classes/groovy/main/ParameterStoreExecPlugin$_addEnvVariables_closure1.class differ diff --git a/build/classes/groovy/main/ParameterStoreExecPlugin.class b/build/classes/groovy/main/ParameterStoreExecPlugin.class new file mode 100644 index 00000000..b4ff31fc Binary files /dev/null and b/build/classes/groovy/main/ParameterStoreExecPlugin.class differ diff --git a/build/classes/groovy/main/RegressionStage$_decorate_closure2$_closure8.class b/build/classes/groovy/main/RegressionStage$_decorate_closure2$_closure8.class new file mode 100644 index 00000000..d4dc32ce Binary files /dev/null and b/build/classes/groovy/main/RegressionStage$_decorate_closure2$_closure8.class differ diff --git a/build/classes/groovy/main/RegressionStage$_decorate_closure2.class b/build/classes/groovy/main/RegressionStage$_decorate_closure2.class new file mode 100644 index 00000000..439b37e6 Binary files /dev/null and b/build/classes/groovy/main/RegressionStage$_decorate_closure2.class differ diff --git a/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4$_closure5$_closure6.class b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4$_closure5$_closure6.class new file mode 100644 index 00000000..44efaaff Binary files /dev/null and b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4$_closure5$_closure6.class differ diff --git a/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4$_closure5$_closure7.class b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4$_closure5$_closure7.class new file mode 100644 index 00000000..d139bc4d Binary files /dev/null and b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4$_closure5$_closure7.class differ diff --git a/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4$_closure5.class b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4$_closure5.class new file mode 100644 index 00000000..db525080 Binary files /dev/null and b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4$_closure5.class differ diff --git a/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4.class b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4.class new file mode 100644 index 00000000..529fcc0a Binary files /dev/null and b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3$_closure4.class differ diff --git a/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3.class b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3.class new file mode 100644 index 00000000..30fc2be3 Binary files /dev/null and b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1$_closure3.class differ diff --git a/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1.class b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1.class new file mode 100644 index 00000000..e6844d33 Binary files /dev/null and b/build/classes/groovy/main/RegressionStage$_pipelineConfiguration_closure1.class differ diff --git a/build/classes/groovy/main/RegressionStage.class b/build/classes/groovy/main/RegressionStage.class new file mode 100644 index 00000000..8f29d7ac Binary files /dev/null and b/build/classes/groovy/main/RegressionStage.class differ diff --git a/build/classes/groovy/main/RegressionStagePlugin.class b/build/classes/groovy/main/RegressionStagePlugin.class new file mode 100644 index 00000000..d62ba2bb Binary files /dev/null and b/build/classes/groovy/main/RegressionStagePlugin.class differ diff --git a/build/classes/groovy/main/S3BackendPlugin$_apply_closure1.class b/build/classes/groovy/main/S3BackendPlugin$_apply_closure1.class new file mode 100644 index 00000000..b2d120b6 Binary files /dev/null and b/build/classes/groovy/main/S3BackendPlugin$_apply_closure1.class differ diff --git a/build/classes/groovy/main/S3BackendPlugin$_getKey_closure2.class b/build/classes/groovy/main/S3BackendPlugin$_getKey_closure2.class new file mode 100644 index 00000000..a715967e Binary files /dev/null and b/build/classes/groovy/main/S3BackendPlugin$_getKey_closure2.class differ diff --git a/build/classes/groovy/main/S3BackendPlugin.class b/build/classes/groovy/main/S3BackendPlugin.class new file mode 100644 index 00000000..0a8087f2 Binary files /dev/null and b/build/classes/groovy/main/S3BackendPlugin.class differ diff --git a/build/classes/groovy/main/Stage.class b/build/classes/groovy/main/Stage.class new file mode 100644 index 00000000..bb986447 Binary files /dev/null and b/build/classes/groovy/main/Stage.class differ diff --git a/build/classes/groovy/main/TerraformApplyCommand.class b/build/classes/groovy/main/TerraformApplyCommand.class new file mode 100644 index 00000000..77127300 Binary files /dev/null and b/build/classes/groovy/main/TerraformApplyCommand.class differ diff --git a/build/classes/groovy/main/TerraformApplyCommandPlugin.class b/build/classes/groovy/main/TerraformApplyCommandPlugin.class new file mode 100644 index 00000000..55fb7439 Binary files /dev/null and b/build/classes/groovy/main/TerraformApplyCommandPlugin.class differ diff --git a/build/classes/groovy/main/TerraformDirectoryPlugin.class b/build/classes/groovy/main/TerraformDirectoryPlugin.class new file mode 100644 index 00000000..c7389e22 Binary files /dev/null and b/build/classes/groovy/main/TerraformDirectoryPlugin.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_applyDecorations_closure2.class b/build/classes/groovy/main/TerraformEnvironmentStage$_applyDecorations_closure2.class new file mode 100644 index 00000000..9b78c641 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_applyDecorations_closure2.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_decorate_closure3.class b/build/classes/groovy/main/TerraformEnvironmentStage$_decorate_closure3.class new file mode 100644 index 00000000..ea98a79d Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_decorate_closure3.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_decorate_closure4$_closure15.class b/build/classes/groovy/main/TerraformEnvironmentStage$_decorate_closure4$_closure15.class new file mode 100644 index 00000000..3c1137b0 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_decorate_closure4$_closure15.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_decorate_closure4.class b/build/classes/groovy/main/TerraformEnvironmentStage$_decorate_closure4.class new file mode 100644 index 00000000..ead01784 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_decorate_closure4.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure7$_closure10.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure7$_closure10.class new file mode 100644 index 00000000..8df1bf51 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure7$_closure10.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure7.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure7.class new file mode 100644 index 00000000..9d799c67 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure7.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure8$_closure11$_closure12.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure8$_closure11$_closure12.class new file mode 100644 index 00000000..596f7397 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure8$_closure11$_closure12.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure8$_closure11.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure8$_closure11.class new file mode 100644 index 00000000..35a43116 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure8$_closure11.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure8.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure8.class new file mode 100644 index 00000000..a52c03a9 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure8.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure9$_closure13$_closure14.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure9$_closure13$_closure14.class new file mode 100644 index 00000000..e9aa12b2 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure9$_closure13$_closure14.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure9$_closure13.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure9$_closure13.class new file mode 100644 index 00000000..a3c4e59c Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure9$_closure13.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure9.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure9.class new file mode 100644 index 00000000..8fe5da05 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure9.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6.class new file mode 100644 index 00000000..cfcce1a5 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5$_closure6.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5.class new file mode 100644 index 00000000..5a5c90bb Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1$_closure5.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1.class b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1.class new file mode 100644 index 00000000..78685d17 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage$_pipelineConfiguration_closure1.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStage.class b/build/classes/groovy/main/TerraformEnvironmentStage.class new file mode 100644 index 00000000..2a76ae30 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStage.class differ diff --git a/build/classes/groovy/main/TerraformEnvironmentStagePlugin.class b/build/classes/groovy/main/TerraformEnvironmentStagePlugin.class new file mode 100644 index 00000000..d05befa4 Binary files /dev/null and b/build/classes/groovy/main/TerraformEnvironmentStagePlugin.class differ diff --git a/build/classes/groovy/main/TerraformInitCommand$_toString_closure1.class b/build/classes/groovy/main/TerraformInitCommand$_toString_closure1.class new file mode 100644 index 00000000..0ed0f09e Binary files /dev/null and b/build/classes/groovy/main/TerraformInitCommand$_toString_closure1.class differ diff --git a/build/classes/groovy/main/TerraformInitCommand.class b/build/classes/groovy/main/TerraformInitCommand.class new file mode 100644 index 00000000..950e128a Binary files /dev/null and b/build/classes/groovy/main/TerraformInitCommand.class differ diff --git a/build/classes/groovy/main/TerraformInitCommandPlugin.class b/build/classes/groovy/main/TerraformInitCommandPlugin.class new file mode 100644 index 00000000..3d8e15f9 Binary files /dev/null and b/build/classes/groovy/main/TerraformInitCommandPlugin.class differ diff --git a/build/classes/groovy/main/TerraformPlanCommand.class b/build/classes/groovy/main/TerraformPlanCommand.class new file mode 100644 index 00000000..da315b82 Binary files /dev/null and b/build/classes/groovy/main/TerraformPlanCommand.class differ diff --git a/build/classes/groovy/main/TerraformPlanCommandPlugin.class b/build/classes/groovy/main/TerraformPlanCommandPlugin.class new file mode 100644 index 00000000..6278390f Binary files /dev/null and b/build/classes/groovy/main/TerraformPlanCommandPlugin.class differ diff --git a/build/classes/groovy/main/TerraformValidateCommand.class b/build/classes/groovy/main/TerraformValidateCommand.class new file mode 100644 index 00000000..2232dbc8 Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateCommand.class differ diff --git a/build/classes/groovy/main/TerraformValidateCommandPlugin.class b/build/classes/groovy/main/TerraformValidateCommandPlugin.class new file mode 100644 index 00000000..3486f95c Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateCommandPlugin.class differ diff --git a/build/classes/groovy/main/TerraformValidateStage$_applyDecorations_closure2.class b/build/classes/groovy/main/TerraformValidateStage$_applyDecorations_closure2.class new file mode 100644 index 00000000..f7524480 Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStage$_applyDecorations_closure2.class differ diff --git a/build/classes/groovy/main/TerraformValidateStage$_decorate_closure3.class b/build/classes/groovy/main/TerraformValidateStage$_decorate_closure3.class new file mode 100644 index 00000000..2ef2e92e Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStage$_decorate_closure3.class differ diff --git a/build/classes/groovy/main/TerraformValidateStage$_decorate_closure4$_closure8.class b/build/classes/groovy/main/TerraformValidateStage$_decorate_closure4$_closure8.class new file mode 100644 index 00000000..23711733 Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStage$_decorate_closure4$_closure8.class differ diff --git a/build/classes/groovy/main/TerraformValidateStage$_decorate_closure4.class b/build/classes/groovy/main/TerraformValidateStage$_decorate_closure4.class new file mode 100644 index 00000000..4f0af9f0 Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStage$_decorate_closure4.class differ diff --git a/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure7.class b/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure7.class new file mode 100644 index 00000000..51d189c2 Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1$_closure5$_closure6$_closure7.class differ diff --git a/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1$_closure5$_closure6.class b/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1$_closure5$_closure6.class new file mode 100644 index 00000000..b5a78ae8 Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1$_closure5$_closure6.class differ diff --git a/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1$_closure5.class b/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1$_closure5.class new file mode 100644 index 00000000..bb5f094b Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1$_closure5.class differ diff --git a/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1.class b/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1.class new file mode 100644 index 00000000..7f8f79ed Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStage$_pipelineConfiguration_closure1.class differ diff --git a/build/classes/groovy/main/TerraformValidateStage.class b/build/classes/groovy/main/TerraformValidateStage.class new file mode 100644 index 00000000..39bc40c3 Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStage.class differ diff --git a/build/classes/groovy/main/TerraformValidateStagePlugin.class b/build/classes/groovy/main/TerraformValidateStagePlugin.class new file mode 100644 index 00000000..09428066 Binary files /dev/null and b/build/classes/groovy/main/TerraformValidateStagePlugin.class differ diff --git a/build/classes/groovy/main/WithAwsPlugin$_addWithAwsRole_closure1$_closure2.class b/build/classes/groovy/main/WithAwsPlugin$_addWithAwsRole_closure1$_closure2.class new file mode 100644 index 00000000..d7e48e7f Binary files /dev/null and b/build/classes/groovy/main/WithAwsPlugin$_addWithAwsRole_closure1$_closure2.class differ diff --git a/build/classes/groovy/main/WithAwsPlugin$_addWithAwsRole_closure1.class b/build/classes/groovy/main/WithAwsPlugin$_addWithAwsRole_closure1.class new file mode 100644 index 00000000..4132c299 Binary files /dev/null and b/build/classes/groovy/main/WithAwsPlugin$_addWithAwsRole_closure1.class differ diff --git a/build/classes/groovy/main/WithAwsPlugin.class b/build/classes/groovy/main/WithAwsPlugin.class new file mode 100644 index 00000000..201eadb0 Binary files /dev/null and b/build/classes/groovy/main/WithAwsPlugin.class differ diff --git a/build/classes/groovy/test/AnsiColorPluginTest$Init.class b/build/classes/groovy/test/AnsiColorPluginTest$Init.class new file mode 100644 index 00000000..5bc3079e Binary files /dev/null and b/build/classes/groovy/test/AnsiColorPluginTest$Init.class differ diff --git a/build/classes/groovy/test/AnsiColorPluginTest.class b/build/classes/groovy/test/AnsiColorPluginTest.class new file mode 100644 index 00000000..a824b2f2 Binary files /dev/null and b/build/classes/groovy/test/AnsiColorPluginTest.class differ diff --git a/build/classes/groovy/test/AwssumePluginTest$Apply$WithRoleProvided.class b/build/classes/groovy/test/AwssumePluginTest$Apply$WithRoleProvided.class new file mode 100644 index 00000000..020e1b3b Binary files /dev/null and b/build/classes/groovy/test/AwssumePluginTest$Apply$WithRoleProvided.class differ diff --git a/build/classes/groovy/test/AwssumePluginTest$Apply$WithoutRoleProvided.class b/build/classes/groovy/test/AwssumePluginTest$Apply$WithoutRoleProvided.class new file mode 100644 index 00000000..2099f60e Binary files /dev/null and b/build/classes/groovy/test/AwssumePluginTest$Apply$WithoutRoleProvided.class differ diff --git a/build/classes/groovy/test/AwssumePluginTest$Apply.class b/build/classes/groovy/test/AwssumePluginTest$Apply.class new file mode 100644 index 00000000..f61ab2b7 Binary files /dev/null and b/build/classes/groovy/test/AwssumePluginTest$Apply.class differ diff --git a/build/classes/groovy/test/AwssumePluginTest$GetAwsRoleArn.class b/build/classes/groovy/test/AwssumePluginTest$GetAwsRoleArn.class new file mode 100644 index 00000000..9c18fffa Binary files /dev/null and b/build/classes/groovy/test/AwssumePluginTest$GetAwsRoleArn.class differ diff --git a/build/classes/groovy/test/AwssumePluginTest$GetRegion.class b/build/classes/groovy/test/AwssumePluginTest$GetRegion.class new file mode 100644 index 00000000..ca914a48 Binary files /dev/null and b/build/classes/groovy/test/AwssumePluginTest$GetRegion.class differ diff --git a/build/classes/groovy/test/AwssumePluginTest$Init.class b/build/classes/groovy/test/AwssumePluginTest$Init.class new file mode 100644 index 00000000..ac3e2c3f Binary files /dev/null and b/build/classes/groovy/test/AwssumePluginTest$Init.class differ diff --git a/build/classes/groovy/test/AwssumePluginTest.class b/build/classes/groovy/test/AwssumePluginTest.class new file mode 100644 index 00000000..583dc903 Binary files /dev/null and b/build/classes/groovy/test/AwssumePluginTest.class differ diff --git a/build/classes/groovy/test/BuildGraphTest$WithASingleStage.class b/build/classes/groovy/test/BuildGraphTest$WithASingleStage.class new file mode 100644 index 00000000..a9bcb69e Binary files /dev/null and b/build/classes/groovy/test/BuildGraphTest$WithASingleStage.class differ diff --git a/build/classes/groovy/test/BuildGraphTest$WithMultipleStages.class b/build/classes/groovy/test/BuildGraphTest$WithMultipleStages.class new file mode 100644 index 00000000..ee0fcc5f Binary files /dev/null and b/build/classes/groovy/test/BuildGraphTest$WithMultipleStages.class differ diff --git a/build/classes/groovy/test/BuildGraphTest.class b/build/classes/groovy/test/BuildGraphTest.class new file mode 100644 index 00000000..0f35beec Binary files /dev/null and b/build/classes/groovy/test/BuildGraphTest.class differ diff --git a/build/classes/groovy/test/ConditionApplyPluginTest$ShouldApply.class b/build/classes/groovy/test/ConditionApplyPluginTest$ShouldApply.class new file mode 100644 index 00000000..f659bd7d Binary files /dev/null and b/build/classes/groovy/test/ConditionApplyPluginTest$ShouldApply.class differ diff --git a/build/classes/groovy/test/ConditionApplyPluginTest.class b/build/classes/groovy/test/ConditionApplyPluginTest.class new file mode 100644 index 00000000..a2e93eb4 Binary files /dev/null and b/build/classes/groovy/test/ConditionApplyPluginTest.class differ diff --git a/build/classes/groovy/test/ConfirmApplyPluginTest.class b/build/classes/groovy/test/ConfirmApplyPluginTest.class new file mode 100644 index 00000000..744a79ba Binary files /dev/null and b/build/classes/groovy/test/ConfirmApplyPluginTest.class differ diff --git a/build/classes/groovy/test/ConsulBackendPluginTest$Apply$AddressBackendParameter.class b/build/classes/groovy/test/ConsulBackendPluginTest$Apply$AddressBackendParameter.class new file mode 100644 index 00000000..75be182c Binary files /dev/null and b/build/classes/groovy/test/ConsulBackendPluginTest$Apply$AddressBackendParameter.class differ diff --git a/build/classes/groovy/test/ConsulBackendPluginTest$Apply$PathBackendParameter$_isAddedAndUsesCustomizablePattern_closure1.class b/build/classes/groovy/test/ConsulBackendPluginTest$Apply$PathBackendParameter$_isAddedAndUsesCustomizablePattern_closure1.class new file mode 100644 index 00000000..eae19098 Binary files /dev/null and b/build/classes/groovy/test/ConsulBackendPluginTest$Apply$PathBackendParameter$_isAddedAndUsesCustomizablePattern_closure1.class differ diff --git a/build/classes/groovy/test/ConsulBackendPluginTest$Apply$PathBackendParameter.class b/build/classes/groovy/test/ConsulBackendPluginTest$Apply$PathBackendParameter.class new file mode 100644 index 00000000..700ad519 Binary files /dev/null and b/build/classes/groovy/test/ConsulBackendPluginTest$Apply$PathBackendParameter.class differ diff --git a/build/classes/groovy/test/ConsulBackendPluginTest$Apply.class b/build/classes/groovy/test/ConsulBackendPluginTest$Apply.class new file mode 100644 index 00000000..e3b4d880 Binary files /dev/null and b/build/classes/groovy/test/ConsulBackendPluginTest$Apply.class differ diff --git a/build/classes/groovy/test/ConsulBackendPluginTest$Init.class b/build/classes/groovy/test/ConsulBackendPluginTest$Init.class new file mode 100644 index 00000000..c9dae936 Binary files /dev/null and b/build/classes/groovy/test/ConsulBackendPluginTest$Init.class differ diff --git a/build/classes/groovy/test/ConsulBackendPluginTest.class b/build/classes/groovy/test/ConsulBackendPluginTest.class new file mode 100644 index 00000000..1e352703 Binary files /dev/null and b/build/classes/groovy/test/ConsulBackendPluginTest.class differ diff --git a/build/classes/groovy/test/CredentialsPluginTest$Init.class b/build/classes/groovy/test/CredentialsPluginTest$Init.class new file mode 100644 index 00000000..5a8c285c Binary files /dev/null and b/build/classes/groovy/test/CredentialsPluginTest$Init.class differ diff --git a/build/classes/groovy/test/CredentialsPluginTest$PopulateDefaults.class b/build/classes/groovy/test/CredentialsPluginTest$PopulateDefaults.class new file mode 100644 index 00000000..8791f685 Binary files /dev/null and b/build/classes/groovy/test/CredentialsPluginTest$PopulateDefaults.class differ diff --git a/build/classes/groovy/test/CredentialsPluginTest$ToEnvironmentVariable.class b/build/classes/groovy/test/CredentialsPluginTest$ToEnvironmentVariable.class new file mode 100644 index 00000000..a90849d7 Binary files /dev/null and b/build/classes/groovy/test/CredentialsPluginTest$ToEnvironmentVariable.class differ diff --git a/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials$_addsCredentialsForBuildStage_closure1.class b/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials$_addsCredentialsForBuildStage_closure1.class new file mode 100644 index 00000000..fe206de0 Binary files /dev/null and b/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials$_addsCredentialsForBuildStage_closure1.class differ diff --git a/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials$_addsMultipleCredentialsForBuildStage_closure2.class b/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials$_addsMultipleCredentialsForBuildStage_closure2.class new file mode 100644 index 00000000..e5c26ceb Binary files /dev/null and b/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials$_addsMultipleCredentialsForBuildStage_closure2.class differ diff --git a/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials$_addsMultipleCredentialsForBuildStage_closure3.class b/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials$_addsMultipleCredentialsForBuildStage_closure3.class new file mode 100644 index 00000000..dff061e1 Binary files /dev/null and b/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials$_addsMultipleCredentialsForBuildStage_closure3.class differ diff --git a/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials.class b/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials.class new file mode 100644 index 00000000..85936bd0 Binary files /dev/null and b/build/classes/groovy/test/CredentialsPluginTest$WithBuildCredentials.class differ diff --git a/build/classes/groovy/test/CredentialsPluginTest.class b/build/classes/groovy/test/CredentialsPluginTest.class new file mode 100644 index 00000000..8a312dc8 Binary files /dev/null and b/build/classes/groovy/test/CredentialsPluginTest.class differ diff --git a/build/classes/groovy/test/CrqPluginTest$AddCrq$withCrqEnvironment.class b/build/classes/groovy/test/CrqPluginTest$AddCrq$withCrqEnvironment.class new file mode 100644 index 00000000..61ae5195 Binary files /dev/null and b/build/classes/groovy/test/CrqPluginTest$AddCrq$withCrqEnvironment.class differ diff --git a/build/classes/groovy/test/CrqPluginTest$AddCrq$withoutCrqEnvironment.class b/build/classes/groovy/test/CrqPluginTest$AddCrq$withoutCrqEnvironment.class new file mode 100644 index 00000000..8ff4f415 Binary files /dev/null and b/build/classes/groovy/test/CrqPluginTest$AddCrq$withoutCrqEnvironment.class differ diff --git a/build/classes/groovy/test/CrqPluginTest$AddCrq.class b/build/classes/groovy/test/CrqPluginTest$AddCrq.class new file mode 100644 index 00000000..73f97776 Binary files /dev/null and b/build/classes/groovy/test/CrqPluginTest$AddCrq.class differ diff --git a/build/classes/groovy/test/CrqPluginTest$GetCrqEnviroment.class b/build/classes/groovy/test/CrqPluginTest$GetCrqEnviroment.class new file mode 100644 index 00000000..cd49fe25 Binary files /dev/null and b/build/classes/groovy/test/CrqPluginTest$GetCrqEnviroment.class differ diff --git a/build/classes/groovy/test/CrqPluginTest$Init.class b/build/classes/groovy/test/CrqPluginTest$Init.class new file mode 100644 index 00000000..b461e6fb Binary files /dev/null and b/build/classes/groovy/test/CrqPluginTest$Init.class differ diff --git a/build/classes/groovy/test/CrqPluginTest.class b/build/classes/groovy/test/CrqPluginTest.class new file mode 100644 index 00000000..e2c22b05 Binary files /dev/null and b/build/classes/groovy/test/CrqPluginTest.class differ diff --git a/build/classes/groovy/test/DefaultEnvironmentPluginTest$Init.class b/build/classes/groovy/test/DefaultEnvironmentPluginTest$Init.class new file mode 100644 index 00000000..9cf68b15 Binary files /dev/null and b/build/classes/groovy/test/DefaultEnvironmentPluginTest$Init.class differ diff --git a/build/classes/groovy/test/DefaultEnvironmentPluginTest.class b/build/classes/groovy/test/DefaultEnvironmentPluginTest.class new file mode 100644 index 00000000..eaa47ecc Binary files /dev/null and b/build/classes/groovy/test/DefaultEnvironmentPluginTest.class differ diff --git a/build/classes/groovy/test/FileParametersPluginTest$GetVariables.class b/build/classes/groovy/test/FileParametersPluginTest$GetVariables.class new file mode 100644 index 00000000..349fcf01 Binary files /dev/null and b/build/classes/groovy/test/FileParametersPluginTest$GetVariables.class differ diff --git a/build/classes/groovy/test/FileParametersPluginTest$Init.class b/build/classes/groovy/test/FileParametersPluginTest$Init.class new file mode 100644 index 00000000..978879ff Binary files /dev/null and b/build/classes/groovy/test/FileParametersPluginTest$Init.class differ diff --git a/build/classes/groovy/test/FileParametersPluginTest.class b/build/classes/groovy/test/FileParametersPluginTest.class new file mode 100644 index 00000000..c1b5f60e Binary files /dev/null and b/build/classes/groovy/test/FileParametersPluginTest.class differ diff --git a/build/classes/groovy/test/JenkinsfileTest$GetNodeName.class b/build/classes/groovy/test/JenkinsfileTest$GetNodeName.class new file mode 100644 index 00000000..b90b0151 Binary files /dev/null and b/build/classes/groovy/test/JenkinsfileTest$GetNodeName.class differ diff --git a/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.class b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.class new file mode 100644 index 00000000..1be9094a Binary files /dev/null and b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.class differ diff --git a/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.class b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.class new file mode 100644 index 00000000..e6e6d819 Binary files /dev/null and b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.class differ diff --git a/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithHttpUrl.class b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithHttpUrl.class new file mode 100644 index 00000000..0017ed01 Binary files /dev/null and b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithHttpUrl.class differ diff --git a/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithSshUrl.class b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithSshUrl.class new file mode 100644 index 00000000..12f9939f Binary files /dev/null and b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl$WithSshUrl.class differ diff --git a/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl.class b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl.class new file mode 100644 index 00000000..625dde34 Binary files /dev/null and b/build/classes/groovy/test/JenkinsfileTest$ParseScmUrl.class differ diff --git a/build/classes/groovy/test/JenkinsfileTest.class b/build/classes/groovy/test/JenkinsfileTest.class new file mode 100644 index 00000000..0a5d89a0 Binary files /dev/null and b/build/classes/groovy/test/JenkinsfileTest.class differ diff --git a/build/classes/groovy/test/ParameterStoreBuildWrapperPluginTest$Init.class b/build/classes/groovy/test/ParameterStoreBuildWrapperPluginTest$Init.class new file mode 100644 index 00000000..5aa69006 Binary files /dev/null and b/build/classes/groovy/test/ParameterStoreBuildWrapperPluginTest$Init.class differ diff --git a/build/classes/groovy/test/ParameterStoreBuildWrapperPluginTest$PathForEnvironment.class b/build/classes/groovy/test/ParameterStoreBuildWrapperPluginTest$PathForEnvironment.class new file mode 100644 index 00000000..f2a638f3 Binary files /dev/null and b/build/classes/groovy/test/ParameterStoreBuildWrapperPluginTest$PathForEnvironment.class differ diff --git a/build/classes/groovy/test/ParameterStoreBuildWrapperPluginTest.class b/build/classes/groovy/test/ParameterStoreBuildWrapperPluginTest.class new file mode 100644 index 00000000..295b5ed3 Binary files /dev/null and b/build/classes/groovy/test/ParameterStoreBuildWrapperPluginTest.class differ diff --git a/build/classes/groovy/test/ParameterStoreExecPluginTest$Apply.class b/build/classes/groovy/test/ParameterStoreExecPluginTest$Apply.class new file mode 100644 index 00000000..3c2a0301 Binary files /dev/null and b/build/classes/groovy/test/ParameterStoreExecPluginTest$Apply.class differ diff --git a/build/classes/groovy/test/ParameterStoreExecPluginTest$Init.class b/build/classes/groovy/test/ParameterStoreExecPluginTest$Init.class new file mode 100644 index 00000000..a027fd8c Binary files /dev/null and b/build/classes/groovy/test/ParameterStoreExecPluginTest$Init.class differ diff --git a/build/classes/groovy/test/ParameterStoreExecPluginTest$PathForEnvironment.class b/build/classes/groovy/test/ParameterStoreExecPluginTest$PathForEnvironment.class new file mode 100644 index 00000000..9e2459ec Binary files /dev/null and b/build/classes/groovy/test/ParameterStoreExecPluginTest$PathForEnvironment.class differ diff --git a/build/classes/groovy/test/ParameterStoreExecPluginTest.class b/build/classes/groovy/test/ParameterStoreExecPluginTest.class new file mode 100644 index 00000000..21a3e230 Binary files /dev/null and b/build/classes/groovy/test/ParameterStoreExecPluginTest.class differ diff --git a/build/classes/groovy/test/RegressionStageTest$AddedPlugins.class b/build/classes/groovy/test/RegressionStageTest$AddedPlugins.class new file mode 100644 index 00000000..7d7b2c48 Binary files /dev/null and b/build/classes/groovy/test/RegressionStageTest$AddedPlugins.class differ diff --git a/build/classes/groovy/test/RegressionStageTest$AutomationRepo.class b/build/classes/groovy/test/RegressionStageTest$AutomationRepo.class new file mode 100644 index 00000000..4a795cfc Binary files /dev/null and b/build/classes/groovy/test/RegressionStageTest$AutomationRepo.class differ diff --git a/build/classes/groovy/test/RegressionStageTest.class b/build/classes/groovy/test/RegressionStageTest.class new file mode 100644 index 00000000..c4c3cf17 Binary files /dev/null and b/build/classes/groovy/test/RegressionStageTest.class differ diff --git a/build/classes/groovy/test/S3BackendPluginTest$Apply$_isAddedAndUsesCustomizedPatternFolderKeyAsBackendParameter_closure1.class b/build/classes/groovy/test/S3BackendPluginTest$Apply$_isAddedAndUsesCustomizedPatternFolderKeyAsBackendParameter_closure1.class new file mode 100644 index 00000000..ac146e0d Binary files /dev/null and b/build/classes/groovy/test/S3BackendPluginTest$Apply$_isAddedAndUsesCustomizedPatternFolderKeyAsBackendParameter_closure1.class differ diff --git a/build/classes/groovy/test/S3BackendPluginTest$Apply.class b/build/classes/groovy/test/S3BackendPluginTest$Apply.class new file mode 100644 index 00000000..df7b06b3 Binary files /dev/null and b/build/classes/groovy/test/S3BackendPluginTest$Apply.class differ diff --git a/build/classes/groovy/test/S3BackendPluginTest$GetBackend.class b/build/classes/groovy/test/S3BackendPluginTest$GetBackend.class new file mode 100644 index 00000000..095af955 Binary files /dev/null and b/build/classes/groovy/test/S3BackendPluginTest$GetBackend.class differ diff --git a/build/classes/groovy/test/S3BackendPluginTest$GetDynamoTable.class b/build/classes/groovy/test/S3BackendPluginTest$GetDynamoTable.class new file mode 100644 index 00000000..549ee7c3 Binary files /dev/null and b/build/classes/groovy/test/S3BackendPluginTest$GetDynamoTable.class differ diff --git a/build/classes/groovy/test/S3BackendPluginTest$GetKey$_shouldBeGeneratedFromTheCustomKeyPattern_closure1.class b/build/classes/groovy/test/S3BackendPluginTest$GetKey$_shouldBeGeneratedFromTheCustomKeyPattern_closure1.class new file mode 100644 index 00000000..c23bbc5f Binary files /dev/null and b/build/classes/groovy/test/S3BackendPluginTest$GetKey$_shouldBeGeneratedFromTheCustomKeyPattern_closure1.class differ diff --git a/build/classes/groovy/test/S3BackendPluginTest$GetKey.class b/build/classes/groovy/test/S3BackendPluginTest$GetKey.class new file mode 100644 index 00000000..2365e7de Binary files /dev/null and b/build/classes/groovy/test/S3BackendPluginTest$GetKey.class differ diff --git a/build/classes/groovy/test/S3BackendPluginTest$GetRegion.class b/build/classes/groovy/test/S3BackendPluginTest$GetRegion.class new file mode 100644 index 00000000..b693da66 Binary files /dev/null and b/build/classes/groovy/test/S3BackendPluginTest$GetRegion.class differ diff --git a/build/classes/groovy/test/S3BackendPluginTest$Init.class b/build/classes/groovy/test/S3BackendPluginTest$Init.class new file mode 100644 index 00000000..d2420d32 Binary files /dev/null and b/build/classes/groovy/test/S3BackendPluginTest$Init.class differ diff --git a/build/classes/groovy/test/S3BackendPluginTest.class b/build/classes/groovy/test/S3BackendPluginTest.class new file mode 100644 index 00000000..9a271653 Binary files /dev/null and b/build/classes/groovy/test/S3BackendPluginTest.class differ diff --git a/build/classes/groovy/test/TerraformApplyCommandTest$Plugins.class b/build/classes/groovy/test/TerraformApplyCommandTest$Plugins.class new file mode 100644 index 00000000..5c9889cc Binary files /dev/null and b/build/classes/groovy/test/TerraformApplyCommandTest$Plugins.class differ diff --git a/build/classes/groovy/test/TerraformApplyCommandTest$WithArgument.class b/build/classes/groovy/test/TerraformApplyCommandTest$WithArgument.class new file mode 100644 index 00000000..b703703a Binary files /dev/null and b/build/classes/groovy/test/TerraformApplyCommandTest$WithArgument.class differ diff --git a/build/classes/groovy/test/TerraformApplyCommandTest$WithDirectory.class b/build/classes/groovy/test/TerraformApplyCommandTest$WithDirectory.class new file mode 100644 index 00000000..68b2d92a Binary files /dev/null and b/build/classes/groovy/test/TerraformApplyCommandTest$WithDirectory.class differ diff --git a/build/classes/groovy/test/TerraformApplyCommandTest$WithInput.class b/build/classes/groovy/test/TerraformApplyCommandTest$WithInput.class new file mode 100644 index 00000000..43a96617 Binary files /dev/null and b/build/classes/groovy/test/TerraformApplyCommandTest$WithInput.class differ diff --git a/build/classes/groovy/test/TerraformApplyCommandTest$WithPrefix.class b/build/classes/groovy/test/TerraformApplyCommandTest$WithPrefix.class new file mode 100644 index 00000000..e181fced Binary files /dev/null and b/build/classes/groovy/test/TerraformApplyCommandTest$WithPrefix.class differ diff --git a/build/classes/groovy/test/TerraformApplyCommandTest.class b/build/classes/groovy/test/TerraformApplyCommandTest.class new file mode 100644 index 00000000..c3e8d8ad Binary files /dev/null and b/build/classes/groovy/test/TerraformApplyCommandTest.class differ diff --git a/build/classes/groovy/test/TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.class b/build/classes/groovy/test/TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.class new file mode 100644 index 00000000..bc74e802 Binary files /dev/null and b/build/classes/groovy/test/TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.class differ diff --git a/build/classes/groovy/test/TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.class b/build/classes/groovy/test/TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.class new file mode 100644 index 00000000..8389a161 Binary files /dev/null and b/build/classes/groovy/test/TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.class differ diff --git a/build/classes/groovy/test/TerraformDirectoryPluginTest$Apply.class b/build/classes/groovy/test/TerraformDirectoryPluginTest$Apply.class new file mode 100644 index 00000000..e9360b2c Binary files /dev/null and b/build/classes/groovy/test/TerraformDirectoryPluginTest$Apply.class differ diff --git a/build/classes/groovy/test/TerraformDirectoryPluginTest$Init.class b/build/classes/groovy/test/TerraformDirectoryPluginTest$Init.class new file mode 100644 index 00000000..f87c5a3f Binary files /dev/null and b/build/classes/groovy/test/TerraformDirectoryPluginTest$Init.class differ diff --git a/build/classes/groovy/test/TerraformDirectoryPluginTest.class b/build/classes/groovy/test/TerraformDirectoryPluginTest.class new file mode 100644 index 00000000..8def54d7 Binary files /dev/null and b/build/classes/groovy/test/TerraformDirectoryPluginTest.class differ diff --git a/build/classes/groovy/test/TerraformEnvironmentStageTest$AddedPlugins.class b/build/classes/groovy/test/TerraformEnvironmentStageTest$AddedPlugins.class new file mode 100644 index 00000000..0eb6c369 Binary files /dev/null and b/build/classes/groovy/test/TerraformEnvironmentStageTest$AddedPlugins.class differ diff --git a/build/classes/groovy/test/TerraformEnvironmentStageTest$WithEnv$_preservesOrderOfOtherPlugins_closure1.class b/build/classes/groovy/test/TerraformEnvironmentStageTest$WithEnv$_preservesOrderOfOtherPlugins_closure1.class new file mode 100644 index 00000000..6a16945d Binary files /dev/null and b/build/classes/groovy/test/TerraformEnvironmentStageTest$WithEnv$_preservesOrderOfOtherPlugins_closure1.class differ diff --git a/build/classes/groovy/test/TerraformEnvironmentStageTest$WithEnv.class b/build/classes/groovy/test/TerraformEnvironmentStageTest$WithEnv.class new file mode 100644 index 00000000..02078ab6 Binary files /dev/null and b/build/classes/groovy/test/TerraformEnvironmentStageTest$WithEnv.class differ diff --git a/build/classes/groovy/test/TerraformEnvironmentStageTest$WithGlobalEnv.class b/build/classes/groovy/test/TerraformEnvironmentStageTest$WithGlobalEnv.class new file mode 100644 index 00000000..be83e483 Binary files /dev/null and b/build/classes/groovy/test/TerraformEnvironmentStageTest$WithGlobalEnv.class differ diff --git a/build/classes/groovy/test/TerraformEnvironmentStageTest.class b/build/classes/groovy/test/TerraformEnvironmentStageTest.class new file mode 100644 index 00000000..8a8d7610 Binary files /dev/null and b/build/classes/groovy/test/TerraformEnvironmentStageTest.class differ diff --git a/build/classes/groovy/test/TerraformInitCommandTest$Plugins.class b/build/classes/groovy/test/TerraformInitCommandTest$Plugins.class new file mode 100644 index 00000000..810c6dd5 Binary files /dev/null and b/build/classes/groovy/test/TerraformInitCommandTest$Plugins.class differ diff --git a/build/classes/groovy/test/TerraformInitCommandTest$WithBackendConfig.class b/build/classes/groovy/test/TerraformInitCommandTest$WithBackendConfig.class new file mode 100644 index 00000000..13d5f76e Binary files /dev/null and b/build/classes/groovy/test/TerraformInitCommandTest$WithBackendConfig.class differ diff --git a/build/classes/groovy/test/TerraformInitCommandTest$WithDirectory.class b/build/classes/groovy/test/TerraformInitCommandTest$WithDirectory.class new file mode 100644 index 00000000..61a6889d Binary files /dev/null and b/build/classes/groovy/test/TerraformInitCommandTest$WithDirectory.class differ diff --git a/build/classes/groovy/test/TerraformInitCommandTest$WithInput.class b/build/classes/groovy/test/TerraformInitCommandTest$WithInput.class new file mode 100644 index 00000000..57759425 Binary files /dev/null and b/build/classes/groovy/test/TerraformInitCommandTest$WithInput.class differ diff --git a/build/classes/groovy/test/TerraformInitCommandTest.class b/build/classes/groovy/test/TerraformInitCommandTest.class new file mode 100644 index 00000000..6411a925 Binary files /dev/null and b/build/classes/groovy/test/TerraformInitCommandTest.class differ diff --git a/build/classes/groovy/test/TerraformPlanCommandTest$Plugins.class b/build/classes/groovy/test/TerraformPlanCommandTest$Plugins.class new file mode 100644 index 00000000..8e49def6 Binary files /dev/null and b/build/classes/groovy/test/TerraformPlanCommandTest$Plugins.class differ diff --git a/build/classes/groovy/test/TerraformPlanCommandTest$WithDirectory.class b/build/classes/groovy/test/TerraformPlanCommandTest$WithDirectory.class new file mode 100644 index 00000000..757798b0 Binary files /dev/null and b/build/classes/groovy/test/TerraformPlanCommandTest$WithDirectory.class differ diff --git a/build/classes/groovy/test/TerraformPlanCommandTest$WithInput.class b/build/classes/groovy/test/TerraformPlanCommandTest$WithInput.class new file mode 100644 index 00000000..f2376177 Binary files /dev/null and b/build/classes/groovy/test/TerraformPlanCommandTest$WithInput.class differ diff --git a/build/classes/groovy/test/TerraformPlanCommandTest$WithPrefix.class b/build/classes/groovy/test/TerraformPlanCommandTest$WithPrefix.class new file mode 100644 index 00000000..a2ac0ac1 Binary files /dev/null and b/build/classes/groovy/test/TerraformPlanCommandTest$WithPrefix.class differ diff --git a/build/classes/groovy/test/TerraformPlanCommandTest.class b/build/classes/groovy/test/TerraformPlanCommandTest.class new file mode 100644 index 00000000..969c4b04 Binary files /dev/null and b/build/classes/groovy/test/TerraformPlanCommandTest.class differ diff --git a/build/classes/groovy/test/TerraformValidateCommandTest$Plugins.class b/build/classes/groovy/test/TerraformValidateCommandTest$Plugins.class new file mode 100644 index 00000000..0cdccc71 Binary files /dev/null and b/build/classes/groovy/test/TerraformValidateCommandTest$Plugins.class differ diff --git a/build/classes/groovy/test/TerraformValidateCommandTest$WithDirectory.class b/build/classes/groovy/test/TerraformValidateCommandTest$WithDirectory.class new file mode 100644 index 00000000..3ebf9c6e Binary files /dev/null and b/build/classes/groovy/test/TerraformValidateCommandTest$WithDirectory.class differ diff --git a/build/classes/groovy/test/TerraformValidateCommandTest$WithPrefix.class b/build/classes/groovy/test/TerraformValidateCommandTest$WithPrefix.class new file mode 100644 index 00000000..d51721cf Binary files /dev/null and b/build/classes/groovy/test/TerraformValidateCommandTest$WithPrefix.class differ diff --git a/build/classes/groovy/test/TerraformValidateCommandTest.class b/build/classes/groovy/test/TerraformValidateCommandTest.class new file mode 100644 index 00000000..8ccaca3d Binary files /dev/null and b/build/classes/groovy/test/TerraformValidateCommandTest.class differ diff --git a/build/classes/groovy/test/WithAwsPluginTest$Init.class b/build/classes/groovy/test/WithAwsPluginTest$Init.class new file mode 100644 index 00000000..1fb7da61 Binary files /dev/null and b/build/classes/groovy/test/WithAwsPluginTest$Init.class differ diff --git a/build/classes/groovy/test/WithAwsPluginTest$WithExplicitRole.class b/build/classes/groovy/test/WithAwsPluginTest$WithExplicitRole.class new file mode 100644 index 00000000..1777e9b9 Binary files /dev/null and b/build/classes/groovy/test/WithAwsPluginTest$WithExplicitRole.class differ diff --git a/build/classes/groovy/test/WithAwsPluginTest$WithImplicitRole.class b/build/classes/groovy/test/WithAwsPluginTest$WithImplicitRole.class new file mode 100644 index 00000000..5ae87d1c Binary files /dev/null and b/build/classes/groovy/test/WithAwsPluginTest$WithImplicitRole.class differ diff --git a/build/classes/groovy/test/WithAwsPluginTest$WithRole.class b/build/classes/groovy/test/WithAwsPluginTest$WithRole.class new file mode 100644 index 00000000..25d1a640 Binary files /dev/null and b/build/classes/groovy/test/WithAwsPluginTest$WithRole.class differ diff --git a/build/classes/groovy/test/WithAwsPluginTest.class b/build/classes/groovy/test/WithAwsPluginTest.class new file mode 100644 index 00000000..bd028daf Binary files /dev/null and b/build/classes/groovy/test/WithAwsPluginTest.class differ diff --git a/build/jacoco/test.exec b/build/jacoco/test.exec new file mode 100644 index 00000000..774bf497 Binary files /dev/null and b/build/jacoco/test.exec differ diff --git a/build/reports/jacoco/test/html/default/AnsiColorPlugin$_addColor_closure1$_closure2.html b/build/reports/jacoco/test/html/default/AnsiColorPlugin$_addColor_closure1$_closure2.html new file mode 100644 index 00000000..18e1f6af --- /dev/null +++ b/build/reports/jacoco/test/html/default/AnsiColorPlugin$_addColor_closure1$_closure2.html @@ -0,0 +1 @@ +AnsiColorPlugin._addColor_closure1._closure2

AnsiColorPlugin._addColor_closure1._closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total43 of 430%0 of 0n/a441144
AnsiColorPlugin._addColor_closure1._closure2(Object, Object, Reference)150%n/a110011
doCall(Object)120%n/a111111
getClosure()80%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/AnsiColorPlugin$_addColor_closure1.html b/build/reports/jacoco/test/html/default/AnsiColorPlugin$_addColor_closure1.html new file mode 100644 index 00000000..ea8d6da5 --- /dev/null +++ b/build/reports/jacoco/test/html/default/AnsiColorPlugin$_addColor_closure1.html @@ -0,0 +1 @@ +AnsiColorPlugin._addColor_closure1

AnsiColorPlugin._addColor_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total31 of 310%0 of 0n/a221122
doCall(Object)240%n/a111111
AnsiColorPlugin._addColor_closure1(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/AnsiColorPlugin.groovy.html b/build/reports/jacoco/test/html/default/AnsiColorPlugin.groovy.html new file mode 100644 index 00000000..d68a5038 --- /dev/null +++ b/build/reports/jacoco/test/html/default/AnsiColorPlugin.groovy.html @@ -0,0 +1,21 @@ +AnsiColorPlugin.groovy

AnsiColorPlugin.groovy

import static TerraformEnvironmentStage.PLAN
+import static TerraformEnvironmentStage.APPLY
+
+class AnsiColorPlugin implements TerraformEnvironmentStagePlugin {
+
+    public static void init() {
+        TerraformEnvironmentStage.addPlugin(new AnsiColorPlugin())
+    }
+
+    @Override
+    public void apply(TerraformEnvironmentStage stage) {
+        stage.decorate(PLAN, addColor())
+        stage.decorate(APPLY, addColor())
+    }
+
+    public static Closure addColor() {
+        return { closure -> ansiColor('xterm') { closure() } }
+    }
+
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/AnsiColorPlugin.html b/build/reports/jacoco/test/html/default/AnsiColorPlugin.html new file mode 100644 index 00000000..572d5e5f --- /dev/null +++ b/build/reports/jacoco/test/html/default/AnsiColorPlugin.html @@ -0,0 +1 @@ +AnsiColorPlugin

AnsiColorPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total75 of 10327%4 of 40%463424
apply(TerraformEnvironmentStage)650%40%332211
addColor()100%n/a111111
AnsiColorPlugin()14100%n/a010001
init()14100%n/a010101
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/AwssumePlugin.groovy.html b/build/reports/jacoco/test/html/default/AwssumePlugin.groovy.html new file mode 100644 index 00000000..6c09e6bd --- /dev/null +++ b/build/reports/jacoco/test/html/default/AwssumePlugin.groovy.html @@ -0,0 +1,28 @@ +AwssumePlugin.groovy

AwssumePlugin.groovy

class AwssumePlugin implements TerraformInitCommandPlugin, TerraformPlanCommandPlugin, TerraformApplyCommandPlugin {
+    public static void init() {
+        AwssumePlugin plugin = new AwssumePlugin()
+
+        TerraformInitCommand.addPlugin(plugin)
+        TerraformPlanCommand.addPlugin(plugin)
+        TerraformApplyCommand.addPlugin(plugin)
+    }
+
+    @Override
+    public void apply(TerraformInitCommand command) {
+        String environment = command.getEnvironment()
+        command.withPrefix("AWS_REGION=\$DEFAULT_AWS_REGION AWS_ROLE_ARN=\$${environment.toUpperCase()}_AWS_ROLE_ARN awssume")
+    }
+
+    @Override
+    public void apply(TerraformPlanCommand command) {
+        String environment = command.getEnvironment()
+        command.withPrefix("AWS_REGION=\$DEFAULT_AWS_REGION AWS_ROLE_ARN=\$${environment.toUpperCase()}_AWS_ROLE_ARN awssume")
+    }
+
+    @Override
+    public void apply(TerraformApplyCommand command) {
+        String environment = command.getEnvironment()
+        command.withPrefix("AWS_REGION=\$DEFAULT_AWS_REGION AWS_ROLE_ARN=\$${environment.toUpperCase()}_AWS_ROLE_ARN awssume")
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/AwssumePlugin.html b/build/reports/jacoco/test/html/default/AwssumePlugin.html new file mode 100644 index 00000000..3598f473 --- /dev/null +++ b/build/reports/jacoco/test/html/default/AwssumePlugin.html @@ -0,0 +1 @@ +AwssumePlugin

AwssumePlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total0 of 175100%0 of 0n/a0501005
apply(TerraformInitCommand)42100%n/a010201
apply(TerraformPlanCommand)42100%n/a010201
apply(TerraformApplyCommand)42100%n/a010201
init()35100%n/a010401
AwssumePlugin()14100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/BuildStage$_pipelineConfiguration_closure2$_closure3$_closure4.html b/build/reports/jacoco/test/html/default/BuildStage$_pipelineConfiguration_closure2$_closure3$_closure4.html new file mode 100644 index 00000000..89512b12 --- /dev/null +++ b/build/reports/jacoco/test/html/default/BuildStage$_pipelineConfiguration_closure2$_closure3$_closure4.html @@ -0,0 +1 @@ +BuildStage._pipelineConfiguration_closure2._closure3._closure4

BuildStage._pipelineConfiguration_closure2._closure3._closure4

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total87 of 870%2 of 20%444433
doCall(Object)720%20%224411
doCall()80%n/a110011
BuildStage._pipelineConfiguration_closure2._closure3._closure4(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/BuildStage$_pipelineConfiguration_closure2$_closure3.html b/build/reports/jacoco/test/html/default/BuildStage$_pipelineConfiguration_closure2$_closure3.html new file mode 100644 index 00000000..9b87d741 --- /dev/null +++ b/build/reports/jacoco/test/html/default/BuildStage$_pipelineConfiguration_closure2$_closure3.html @@ -0,0 +1 @@ +BuildStage._pipelineConfiguration_closure2._closure3

BuildStage._pipelineConfiguration_closure2._closure3

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total32 of 320%0 of 0n/a331133
doCall(Object)170%n/a111111
doCall()80%n/a110011
BuildStage._pipelineConfiguration_closure2._closure3(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/BuildStage$_pipelineConfiguration_closure2.html b/build/reports/jacoco/test/html/default/BuildStage$_pipelineConfiguration_closure2.html new file mode 100644 index 00000000..13ae578f --- /dev/null +++ b/build/reports/jacoco/test/html/default/BuildStage$_pipelineConfiguration_closure2.html @@ -0,0 +1 @@ +BuildStage._pipelineConfiguration_closure2

BuildStage._pipelineConfiguration_closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total31 of 310%0 of 0n/a331133
doCall(Object)160%n/a111111
doCall()80%n/a110011
BuildStage._pipelineConfiguration_closure2(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/BuildStage$_unstashArtifact_closure1.html b/build/reports/jacoco/test/html/default/BuildStage$_unstashArtifact_closure1.html new file mode 100644 index 00000000..a62f9dc0 --- /dev/null +++ b/build/reports/jacoco/test/html/default/BuildStage$_unstashArtifact_closure1.html @@ -0,0 +1 @@ +BuildStage._unstashArtifact_closure1

BuildStage._unstashArtifact_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total62 of 620%0 of 0n/a332233
doCall(Object)370%n/a112211
BuildStage._unstashArtifact_closure1(Object, Object, Reference)150%n/a110011
getArtifactStashKey()100%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/BuildStage.groovy.html b/build/reports/jacoco/test/html/default/BuildStage.groovy.html new file mode 100644 index 00000000..998961e9 --- /dev/null +++ b/build/reports/jacoco/test/html/default/BuildStage.groovy.html @@ -0,0 +1,64 @@ +BuildStage.groovy

BuildStage.groovy

import static TerraformEnvironmentStage.ALL
+
+class BuildStage implements TerraformEnvironmentStagePlugin {
+    private final String ARTIFACT_STASH_KEY = 'buildArtifact'
+
+    public String buildCommand
+
+    private String artifactIncludePattern
+
+    private jenkinsFileScript
+
+    public BuildStage() {
+        this("./build.sh")
+    }
+
+    public BuildStage(String buildCommand) {
+        jenkinsFileScript = Jenkinsfile.instance
+        this.buildCommand = buildCommand
+    }
+
+    public BuildStage saveArtifact(String artifactIncludePattern) {
+        this.artifactIncludePattern = artifactIncludePattern
+        TerraformEnvironmentStage.addPlugin(this)
+        return this
+    }
+
+    public then(nextStage) {
+        build()
+        return nextStage
+    }
+
+    public build() {
+        def configuration = pipelineConfiguration()
+        configuration.delegate = jenkinsFileScript
+        configuration()
+    }
+
+    @Override
+    public void apply(TerraformEnvironmentStage stage) {
+        stage.decorate(ALL, unstashArtifact(ARTIFACT_STASH_KEY))
+    }
+
+    private Closure unstashArtifact(String artifactStashKey) {
+        return { closure ->
+            unstash "${artifactStashKey}"
+            closure()
+        }
+    }
+
+    private Closure pipelineConfiguration() {
+        return {
+            node {
+                stage("build") {
+                    checkout(scm)
+                    sh buildCommand
+                    if (artifactIncludePattern != null) {
+                        stash includes: artifactIncludePattern, name: ARTIFACT_STASH_KEY
+                    }
+                }
+            }
+        }
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/BuildStage.html b/build/reports/jacoco/test/html/default/BuildStage.html new file mode 100644 index 00000000..b59d42c5 --- /dev/null +++ b/build/reports/jacoco/test/html/default/BuildStage.html @@ -0,0 +1 @@ +BuildStage

BuildStage

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total209 of 2090%12 of 120%1414141488
build()460%40%333311
BuildStage(String)440%n/a112211
apply(TerraformEnvironmentStage)420%40%331111
saveArtifact(String)230%n/a113311
then(Object)210%40%332211
unstashArtifact(String)170%n/a111111
pipelineConfiguration()100%n/a111111
BuildStage()60%n/a111111
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConditionalApplyPlugin$_onlyOnBranch_closure1.html b/build/reports/jacoco/test/html/default/ConditionalApplyPlugin$_onlyOnBranch_closure1.html new file mode 100644 index 00000000..b02d9706 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConditionalApplyPlugin$_onlyOnBranch_closure1.html @@ -0,0 +1 @@ +ConditionalApplyPlugin._onlyOnBranch_closure1

ConditionalApplyPlugin._onlyOnBranch_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total123 of 13810%2 of 20%344423
doCall(Object)1130%20%224411
getExpectedBranch()100%n/a110011
ConditionalApplyPlugin._onlyOnBranch_closure1(Object, Object, Reference)15100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConditionalApplyPlugin.groovy.html b/build/reports/jacoco/test/html/default/ConditionalApplyPlugin.groovy.html new file mode 100644 index 00000000..0d9ba195 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConditionalApplyPlugin.groovy.html @@ -0,0 +1,29 @@ +ConditionalApplyPlugin.groovy

ConditionalApplyPlugin.groovy

import static TerraformEnvironmentStage.CONFIRM
+import static TerraformEnvironmentStage.APPLY
+
+public class ConditionalApplyPlugin implements TerraformEnvironmentStagePlugin {
+
+    private String branch
+
+    ConditionalApplyPlugin() {
+        branch = 'master'
+    }
+
+    @Override
+    public void apply(TerraformEnvironmentStage stage) {
+        stage.decorateAround(CONFIRM, onlyOnBranch(branch))
+        stage.decorateAround(APPLY, onlyOnBranch(branch))
+    }
+
+    public static Closure onlyOnBranch(String expectedBranch) {
+        return  { closure ->
+            if (expectedBranch == Jenkinsfile.env.BRANCH_NAME) {
+                echo "Current branch '${Jenkinsfile.env.BRANCH_NAME}' matches expected branch '${expectedBranch}', stage branch-condition is met and will run."
+                closure()
+            } else {
+                echo "This stage can only be run on the '${expectedBranch}' branch, but this pipeline is currently running on branch '${Jenkinsfile.env.BRANCH_NAME}'.  Skipping stage."
+            }
+        }
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConditionalApplyPlugin.html b/build/reports/jacoco/test/html/default/ConditionalApplyPlugin.html new file mode 100644 index 00000000..24d5531b --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConditionalApplyPlugin.html @@ -0,0 +1 @@ +ConditionalApplyPlugin

ConditionalApplyPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total39 of 11265%2 of 450%250403
apply(TerraformEnvironmentStage)373649%2250%230201
onlyOnBranch(String)21588%n/a010101
ConditionalApplyPlugin()22100%n/a010101
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConfirmApplyPlugin$_addConfirmation_closure1$_closure2.html b/build/reports/jacoco/test/html/default/ConfirmApplyPlugin$_addConfirmation_closure1$_closure2.html new file mode 100644 index 00000000..45d80b57 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConfirmApplyPlugin$_addConfirmation_closure1$_closure2.html @@ -0,0 +1 @@ +ConfirmApplyPlugin._addConfirmation_closure1._closure2

ConfirmApplyPlugin._addConfirmation_closure1._closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total52 of 520%0 of 0n/a331133
doCall(Object)370%n/a111111
doCall()80%n/a110011
ConfirmApplyPlugin._addConfirmation_closure1._closure2(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConfirmApplyPlugin$_addConfirmation_closure1.html b/build/reports/jacoco/test/html/default/ConfirmApplyPlugin$_addConfirmation_closure1.html new file mode 100644 index 00000000..68b39b44 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConfirmApplyPlugin$_addConfirmation_closure1.html @@ -0,0 +1 @@ +ConfirmApplyPlugin._addConfirmation_closure1

ConfirmApplyPlugin._addConfirmation_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total56 of 6311%0 of 0n/a123312
doCall(Object)560%n/a113311
ConfirmApplyPlugin._addConfirmation_closure1(Object, Object)7100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConfirmApplyPlugin.groovy.html b/build/reports/jacoco/test/html/default/ConfirmApplyPlugin.groovy.html new file mode 100644 index 00000000..75a26b93 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConfirmApplyPlugin.groovy.html @@ -0,0 +1,35 @@ +ConfirmApplyPlugin.groovy

ConfirmApplyPlugin.groovy

import static TerraformEnvironmentStage.CONFIRM
+
+class ConfirmApplyPlugin implements TerraformEnvironmentStagePlugin {
+
+    ConfirmApplyPlugin() {
+    }
+
+    public static void init() {
+        TerraformEnvironmentStage.addPlugin(new ConfirmApplyPlugin())
+    }
+
+    @Override
+    public void apply(TerraformEnvironmentStage stage) {
+        stage.decorate(CONFIRM, addConfirmation())
+    }
+
+    public static Closure addConfirmation() {
+        return { closure ->
+            // ask for human input
+            try {
+                timeout(time: 15, unit: 'MINUTES') {
+                    input(
+                        message: 'Are you absolutely sure the plan above is correct, and should be IMMEDIATELY DEPLOYED via "terraform apply"?',
+                        ok: 'Run terraform APPLY now',
+                        submitterParameter: 'approver'
+                    )
+                }
+            } catch (ex) {
+                throw ex
+            }
+            closure()
+        }
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConfirmApplyPlugin.html b/build/reports/jacoco/test/html/default/ConfirmApplyPlugin.html new file mode 100644 index 00000000..e41f0914 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConfirmApplyPlugin.html @@ -0,0 +1 @@ +ConfirmApplyPlugin

ConfirmApplyPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total33 of 7556%2 of 450%361314
apply(TerraformEnvironmentStage)172054%2250%230101
init()140%n/a111111
addConfirmation()2880%n/a010101
ConfirmApplyPlugin()14100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConsulBackendPlugin$_getBackendPath_closure1.html b/build/reports/jacoco/test/html/default/ConsulBackendPlugin$_getBackendPath_closure1.html new file mode 100644 index 00000000..7977fb0f --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConsulBackendPlugin$_getBackendPath_closure1.html @@ -0,0 +1 @@ +ConsulBackendPlugin._getBackendPath_closure1

ConsulBackendPlugin._getBackendPath_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total35 of 8257%4 of 40%460124
call(String)230%40%330011
getRepoSlug()100%n/a110011
doCall(String)23294%n/a010101
ConsulBackendPlugin._getBackendPath_closure1(Object, Object, Reference)15100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConsulBackendPlugin.groovy.html b/build/reports/jacoco/test/html/default/ConsulBackendPlugin.groovy.html new file mode 100644 index 00000000..0a328afc --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConsulBackendPlugin.groovy.html @@ -0,0 +1,39 @@ +ConsulBackendPlugin.groovy

ConsulBackendPlugin.groovy

class ConsulBackendPlugin implements TerraformInitCommandPlugin {
+
+    public static String defaultAddress
+    public static Closure pathPattern
+
+    public static void init() {
+        ConsulBackendPlugin plugin = new ConsulBackendPlugin()
+
+        TerraformInitCommand.addPlugin(plugin)
+    }
+
+    @Override
+    public void apply(TerraformInitCommand command) {
+        String environment = command.getEnvironment()
+        String backendPath = getBackendPath(environment)
+        command.withBackendConfig("path=${backendPath}")
+
+        String consulAddress = getConsulAddress()
+        if (consulAddress) {
+            command.withBackendConfig("address=${consulAddress}")
+        }
+    }
+
+    public String getBackendPath(String environment) {
+        Closure backendPathPattern = pathPattern
+
+        if (backendPathPattern == null)  {
+            String repoSlug = Jenkinsfile.instance.getStandardizedRepoSlug()
+            backendPathPattern = { String env -> "terraform/${repoSlug}_${env}" }
+        }
+
+        return backendPathPattern.call(environment)
+    }
+
+    public String getConsulAddress() {
+        return defaultAddress ?: Jenkinsfile.env.DEFAULT_CONSUL_ADDRESS
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ConsulBackendPlugin.html b/build/reports/jacoco/test/html/default/ConsulBackendPlugin.html new file mode 100644 index 00000000..070b709a --- /dev/null +++ b/build/reports/jacoco/test/html/default/ConsulBackendPlugin.html @@ -0,0 +1 @@ +ConsulBackendPlugin

ConsulBackendPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total31 of 23086%4 of 1471%41201405
apply(TerraformInitCommand)279577%4660%460601
getBackendPath(String)24896%2100%020501
getConsulAddress()22191%2100%020101
init()21100%n/a010201
ConsulBackendPlugin()14100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/CrqPlugin$_addCrq_closure1.html b/build/reports/jacoco/test/html/default/CrqPlugin$_addCrq_closure1.html new file mode 100644 index 00000000..65f905c1 --- /dev/null +++ b/build/reports/jacoco/test/html/default/CrqPlugin$_addCrq_closure1.html @@ -0,0 +1 @@ +CrqPlugin._addCrq_closure1

CrqPlugin._addCrq_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total151 of 1510%0 of 0n/a335533
doCall(Object)1280%n/a115511
CrqPlugin._addCrq_closure1(Object, Object, Reference)150%n/a110011
getConfig()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/CrqPlugin.groovy.html b/build/reports/jacoco/test/html/default/CrqPlugin.groovy.html new file mode 100644 index 00000000..e632fc2e --- /dev/null +++ b/build/reports/jacoco/test/html/default/CrqPlugin.groovy.html @@ -0,0 +1,64 @@ +CrqPlugin.groovy

CrqPlugin.groovy

class CrqPlugin implements TerraformEnvironmentStagePlugin {
+    public static defaultBau = 152
+    private Jenkinsfile jenkinsfile
+
+    public static void init() {
+        TerraformEnvironmentStage.addPlugin(new CrqPlugin())
+    }
+
+    CrqPlugin() {
+        this.jenkinsfile = Jenkinsfile.instance
+    }
+
+    @Override
+    public void apply(TerraformEnvironmentStage stage) {
+        def crqOptions = [
+            environment: stage.getEnvironment(),
+            app: jenkinsfile.getRepoName()
+        ]
+
+        stage.decorate(TerraformEnvironmentStage.APPLY, addCrq(crqOptions))
+    }
+
+    public static Closure addCrq(config = [:]) {
+        return { closure ->
+            sh "if [ ! -z \$CRQ_ENVIRONMENT ]; then ${remedierOpen(config)}; else echo No CRQ_ENVIRONMENT set, skipping open CRQ; fi"
+            try {
+                closure()
+                sh "if [ ! -z \$CRQ_ENVIRONMENT ]; then ${remedierClose(config)}; else echo No CRQ_ENVIRONMENT set, skipping close CRQ; fi"
+            } catch (err) {
+                sh "if [ ! -z \$CRQ_ENVIRONMENT ]; then ${remedierBackout(config)}; else echo No CRQ_ENVIRONMENT set, skipping backout CRQ; fi"
+                throw err
+            }
+        }
+    }
+
+    public static String remedierOpen(config = [:]) {
+        def app = config.app ?: "\$APP"
+        def bau = config.bau ?: defaultBau
+        def environment = config.environment ?: "\$ENVIRONMENT"
+        def crqEnvironment = config.crqEnvironment ?: '$CRQ_ENVIRONMENT'
+        def summary     = config.summary ?: "${app} - Deploy - ${environment}"
+        def productName = config.productName ?: "Software Delivery Pipeline"
+        def firstName   = config.firstName ?: "\$DEFAULT_PIPELINE_CRQ_FIRST_NAME"
+        def lastName    = config.lastName ?: "\$DEFAULT_PIPELINE_CRQ_LAST_NAME"
+        def login       = config.login ?: "\$DEFAULT_PIPELINE_CRQ_LOGIN"
+        def tier1       = config.tier1 ?: "Software"
+        def tier2       = config.tier2 ?: "Application"
+        def tier3       = config.tier3 ?: "Release Management"
+
+        def message = "See \$BUILD_URL"
+        return "manheim_remedy open \"${bau}\" \"${productName}\" \"${firstName}\" \"${lastName}\" \"${login}\" \"${tier1}\" \"${tier2}\" \"${tier3}\" \"${summary}\" \"${crqEnvironment}\" \"${message}\""
+    }
+
+    public static String remedierClose(config = [:]) {
+        return "manheim_remedy close `cat ChangeID.txt | sed 's/ChangeID=//g'`"
+    }
+
+    public static String remedierBackout(config = [:]) {
+        def reason = "Change failed"
+        return "manheim_remedy error `cat ChangeID.txt | sed 's/ChangeID=//g'` \"${reason}\""
+    }
+
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/CrqPlugin.html b/build/reports/jacoco/test/html/default/CrqPlugin.html new file mode 100644 index 00000000..e2597b89 --- /dev/null +++ b/build/reports/jacoco/test/html/default/CrqPlugin.html @@ -0,0 +1 @@ +CrqPlugin

CrqPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total456 of 50710%24 of 240%21242224912
remedierOpen(Object)3160%240%1313141411
apply(TerraformEnvironmentStage)510%n/a114411
remedierBackout(Object)300%n/a112211
addCrq(Object)170%n/a111111
addCrq()90%n/a110011
remedierOpen()90%n/a110011
remedierClose()90%n/a110011
remedierBackout()90%n/a110011
remedierClose(Object)60%n/a111111
CrqPlugin()29100%n/a010101
init()14100%n/a010101
static {...}8100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1$_closure2.html b/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1$_closure2.html new file mode 100644 index 00000000..9c22ab76 --- /dev/null +++ b/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1$_closure2.html @@ -0,0 +1 @@ +DefaultEnvironmentPlugin._addEnvironmentTerraformVariable_closure1._closure2

DefaultEnvironmentPlugin._addEnvironmentTerraformVariable_closure1._closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total43 of 430%0 of 0n/a441144
DefaultEnvironmentPlugin._addEnvironmentTerraformVariable_closure1._closure2(Object, Object, Reference)150%n/a110011
doCall(Object)120%n/a111111
getClosure()80%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1.html b/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1.html new file mode 100644 index 00000000..9e0895f8 --- /dev/null +++ b/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1.html @@ -0,0 +1 @@ +DefaultEnvironmentPlugin._addEnvironmentTerraformVariable_closure1

DefaultEnvironmentPlugin._addEnvironmentTerraformVariable_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total60 of 7520%0 of 0n/a231123
doCall(Object)500%n/a111111
getEnvironment()100%n/a110011
DefaultEnvironmentPlugin._addEnvironmentTerraformVariable_closure1(Object, Object, Reference)15100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin.groovy.html b/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin.groovy.html new file mode 100644 index 00000000..f2d2478c --- /dev/null +++ b/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin.groovy.html @@ -0,0 +1,17 @@ +DefaultEnvironmentPlugin.groovy

DefaultEnvironmentPlugin.groovy

import static TerraformEnvironmentStage.ALL
+
+class DefaultEnvironmentPlugin implements TerraformEnvironmentStagePlugin {
+
+    @Override
+    public void apply(TerraformEnvironmentStage stage) {
+        String environment = stage.getEnvironment()
+
+        stage.decorate(ALL, addEnvironmentTerraformVariable(environment))
+    }
+
+    public static Closure addEnvironmentTerraformVariable(String environment) {
+        return { closure -> withEnv(["TF_VAR_environment=${environment}"]) { closure() } }
+    }
+
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin.html b/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin.html new file mode 100644 index 00000000..073a7c20 --- /dev/null +++ b/build/reports/jacoco/test/html/default/DefaultEnvironmentPlugin.html @@ -0,0 +1 @@ +DefaultEnvironmentPlugin

DefaultEnvironmentPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total20 of 8075%2 of 450%250303
apply(TerraformEnvironmentStage)183163%2250%230201
addEnvironmentTerraformVariable(String)21588%n/a010101
DefaultEnvironmentPlugin()14100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1$_closure3.html b/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1$_closure3.html new file mode 100644 index 00000000..777edd2a --- /dev/null +++ b/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1$_closure3.html @@ -0,0 +1 @@ +FileParametersPlugin._addEnvironmentSpecificVariables_closure1._closure3

FileParametersPlugin._addEnvironmentSpecificVariables_closure1._closure3

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total43 of 430%0 of 0n/a441144
FileParametersPlugin._addEnvironmentSpecificVariables_closure1._closure3(Object, Object, Reference)150%n/a110011
doCall(Object)120%n/a111111
getClosure()80%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1.html b/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1.html new file mode 100644 index 00000000..1560d480 --- /dev/null +++ b/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure1.html @@ -0,0 +1 @@ +FileParametersPlugin._addEnvironmentSpecificVariables_closure1

FileParametersPlugin._addEnvironmentSpecificVariables_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total148 of 1480%2 of 20%447733
doCall(Object)1230%20%227711
FileParametersPlugin._addEnvironmentSpecificVariables_closure1(Object, Object, Reference)150%n/a110011
getEnvironmentFilename()100%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure2$_closure3.html b/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure2$_closure3.html new file mode 100644 index 00000000..4845860b --- /dev/null +++ b/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure2$_closure3.html @@ -0,0 +1 @@ +FileParametersPlugin._addEnvironmentSpecificVariables_closure2._closure3

FileParametersPlugin._addEnvironmentSpecificVariables_closure2._closure3

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total43 of 430%0 of 0n/a441144
FileParametersPlugin._addEnvironmentSpecificVariables_closure2._closure3(Object, Object, Reference)150%n/a110011
doCall(Object)120%n/a111111
getClosure()80%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure2.html b/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure2.html new file mode 100644 index 00000000..4d8f2382 --- /dev/null +++ b/build/reports/jacoco/test/html/default/FileParametersPlugin$_addEnvironmentSpecificVariables_closure2.html @@ -0,0 +1 @@ +FileParametersPlugin._addEnvironmentSpecificVariables_closure2

FileParametersPlugin._addEnvironmentSpecificVariables_closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total148 of 1480%2 of 20%447733
doCall(Object)1230%20%227711
FileParametersPlugin._addEnvironmentSpecificVariables_closure2(Object, Object, Reference)150%n/a110011
getEnvironmentFilename()100%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/FileParametersPlugin$_getVariables_closure1.html b/build/reports/jacoco/test/html/default/FileParametersPlugin$_getVariables_closure1.html new file mode 100644 index 00000000..f062934f --- /dev/null +++ b/build/reports/jacoco/test/html/default/FileParametersPlugin$_getVariables_closure1.html @@ -0,0 +1 @@ +FileParametersPlugin._getVariables_closure1

FileParametersPlugin._getVariables_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total25 of 6863%4 of 40%350113
call(String)230%40%330011
doCall(String)23694%n/a010101
FileParametersPlugin._getVariables_closure1(Object, Object)7100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/FileParametersPlugin$_getVariables_closure2.html b/build/reports/jacoco/test/html/default/FileParametersPlugin$_getVariables_closure2.html new file mode 100644 index 00000000..ec3d79dd --- /dev/null +++ b/build/reports/jacoco/test/html/default/FileParametersPlugin$_getVariables_closure2.html @@ -0,0 +1 @@ +FileParametersPlugin._getVariables_closure2

FileParametersPlugin._getVariables_closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total25 of 4139%4 of 40%350113
call(String)230%40%330011
doCall(String)2981%n/a010101
FileParametersPlugin._getVariables_closure2(Object, Object)7100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/FileParametersPlugin.groovy.html b/build/reports/jacoco/test/html/default/FileParametersPlugin.groovy.html new file mode 100644 index 00000000..c80705cc --- /dev/null +++ b/build/reports/jacoco/test/html/default/FileParametersPlugin.groovy.html @@ -0,0 +1,44 @@ +FileParametersPlugin.groovy

FileParametersPlugin.groovy

import groovy.text.StreamingTemplateEngine
+
+import static TerraformEnvironmentStage.ALL
+
+class FileParametersPlugin implements TerraformEnvironmentStagePlugin {
+    public static void init() {
+        FileParametersPlugin plugin = new FileParametersPlugin()
+
+        TerraformEnvironmentStage.addPlugin(plugin)
+    }
+
+    @Override
+    public void apply(TerraformEnvironmentStage stage) {
+        String environment = stage.getEnvironment()
+
+        stage.decorate(ALL, addEnvironmentSpecificVariables(environment))
+    }
+
+    public Closure addEnvironmentSpecificVariables(String environment) {
+        String environmentFilename = "${environment}.properties"
+
+        return { closure ->
+            if (fileExists(environmentFilename)) {
+                echo "Found file: ${environmentFilename} - loading the contents as environment variables."
+                String fileContent = readFile(environmentFilename)
+                List variables = getVariables(fileContent)
+
+                withEnv(variables) { closure() }
+            } else {
+                echo "No environment properties file found.  Create a ${environmentFilename} file to add environment-specific variables to this stage."
+                closure()
+            }
+        }
+    }
+
+    public List getVariables(String fileContent) {
+        return fileContent.split('\\r?\\n').collect { String value -> interpolate(value) }
+    }
+
+    public String interpolate(String value) {
+        return new StreamingTemplateEngine().createTemplate(value).make([env: Jenkinsfile.env]).toString()
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/FileParametersPlugin.html b/build/reports/jacoco/test/html/default/FileParametersPlugin.html new file mode 100644 index 00000000..bda46cab --- /dev/null +++ b/build/reports/jacoco/test/html/default/FileParametersPlugin.html @@ -0,0 +1 @@ +FileParametersPlugin

FileParametersPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total93 of 18750%4 of 40%484826
apply(TerraformEnvironmentStage)500%40%332211
addEnvironmentSpecificVariables(String)390%n/a112211
interpolate(String)23895%n/a010101
getVariables(String)22191%n/a010101
init()21100%n/a010201
FileParametersPlugin()14100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/Jenkinsfile$_getScmUrl_closure1.html b/build/reports/jacoco/test/html/default/Jenkinsfile$_getScmUrl_closure1.html new file mode 100644 index 00000000..3905cb95 --- /dev/null +++ b/build/reports/jacoco/test/html/default/Jenkinsfile$_getScmUrl_closure1.html @@ -0,0 +1 @@ +Jenkinsfile._getScmUrl_closure1

Jenkinsfile._getScmUrl_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total39 of 390%0 of 0n/a331133
doCall(Object)240%n/a111111
doCall()80%n/a110011
Jenkinsfile._getScmUrl_closure1(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/Jenkinsfile.groovy.html b/build/reports/jacoco/test/html/default/Jenkinsfile.groovy.html new file mode 100644 index 00000000..f109b9cc --- /dev/null +++ b/build/reports/jacoco/test/html/default/Jenkinsfile.groovy.html @@ -0,0 +1,78 @@ +Jenkinsfile.groovy

Jenkinsfile.groovy

class Jenkinsfile {
+    public static original
+    public static env
+    public static defaultNodeName
+    public static repoSlug = null
+    public static instance = new Jenkinsfile()
+
+    def node(Closure closure) {
+        closure.delegate = original
+        String label = getNodeName()
+        if (label != null) {
+            echo "Using node: ${label}"
+            original.node(label, closure)
+        } else {
+            echo "defaultNodeName and DEFAULT_NODE_NAME environment variable are null"
+            original.node(closure)
+        }
+    }
+
+    def invokeMethod(String name, args) {
+        original.invokeMethod(name, args)
+    }
+
+    def String getStandardizedRepoSlug() {
+        if (repoSlug != null) {
+            return repoSlug
+        }
+
+        def scmUrl = getScmUrl()
+        def scmMap = parseScmUrl(scmUrl)
+        repoSlug = "${standardizeString(scmMap['organization'])}/${standardizeString(scmMap['repo'])}"
+        return repoSlug
+    }
+
+    def String getScmUrl() {
+        def closure = {
+            scm.getUserRemoteConfigs()[0].getUrl()
+        }
+        closure.delegate = original
+        closure.call()
+    }
+
+    def Map parseScmUrl(String scmUrl) {
+        def matcher = scmUrl =~ /.*(?:\/\/|\@)[^\/:]+[\/:]([^\/]+)\/([^\/.]+)(.git)?/
+        def Map results = new HashMap<String,String>()
+        results.put("organization", matcher[0][1])
+        results.put("repo", matcher[0][2])
+        return results
+    }
+
+    def String standardizeString(String original) {
+        original.replaceAll( /-/, '_').replaceAll( /([A-Z]+)/, /_$1/ ).toLowerCase().replaceAll( /^_/, '' ).replaceAll( /_+/, '_')
+    }
+
+    def String getRepoName() {
+        def Map scmMap = parseScmUrl(getScmUrl())
+        return scmMap['repo']
+    }
+
+    def String getOrganization() {
+        def Map scmMap = parseScmUrl(getScmUrl())
+        return scmMap['organization']
+    }
+
+    def static void init(original, env, Class customizations=null) {
+        this.original = original
+        this.env = env
+
+        if (customizations != null) {
+            customizations.init()
+        }
+    }
+
+    def static String getNodeName() {
+        return defaultNodeName ?: env.DEFAULT_NODE_NAME
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/Jenkinsfile.html b/build/reports/jacoco/test/html/default/Jenkinsfile.html new file mode 100644 index 00000000..6f2cc3fb --- /dev/null +++ b/build/reports/jacoco/test/html/default/Jenkinsfile.html @@ -0,0 +1 @@ +Jenkinsfile

Jenkinsfile

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total408 of 51721%22 of 248%20252633913
getStandardizedRepoSlug()1020%60%446611
node(Closure)940%60%447711
getRepoName()480%40%332211
getOrganization()480%40%332211
standardizeString(String)360%n/a111111
getScmUrl()300%n/a113311
init(Object, Object, Class)250%20%224411
invokeMethod(String, Object)120%n/a111111
init(Object, Object)90%n/a110011
parseScmUrl(String)26196%n/a010501
getNodeName()21789%2100%020101
static {...}17100%n/a010101
Jenkinsfile()14100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1$_closure2.html b/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1$_closure2.html new file mode 100644 index 00000000..8323974e --- /dev/null +++ b/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1$_closure2.html @@ -0,0 +1 @@ +ParameterStoreBuildWrapperPlugin._addParameterStoreBuildWrapper_closure1._closure2

ParameterStoreBuildWrapperPlugin._addParameterStoreBuildWrapper_closure1._closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total43 of 430%0 of 0n/a441144
ParameterStoreBuildWrapperPlugin._addParameterStoreBuildWrapper_closure1._closure2(Object, Object, Reference)150%n/a110011
doCall(Object)120%n/a111111
getClosure()80%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1.html b/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1.html new file mode 100644 index 00000000..d255d75b --- /dev/null +++ b/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin$_addParameterStoreBuildWrapper_closure1.html @@ -0,0 +1 @@ +ParameterStoreBuildWrapperPlugin._addParameterStoreBuildWrapper_closure1

ParameterStoreBuildWrapperPlugin._addParameterStoreBuildWrapper_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total49 of 490%0 of 0n/a331133
doCall(Object)260%n/a111111
ParameterStoreBuildWrapperPlugin._addParameterStoreBuildWrapper_closure1(Object, Object, Reference)150%n/a110011
getParameterStoreOptions()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin.groovy.html b/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin.groovy.html new file mode 100644 index 00000000..314cb811 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin.groovy.html @@ -0,0 +1,44 @@ +ParameterStoreBuildWrapperPlugin.groovy

ParameterStoreBuildWrapperPlugin.groovy

import static TerraformEnvironmentStage.PLAN
+import static TerraformEnvironmentStage.APPLY
+
+class ParameterStoreBuildWrapperPlugin implements TerraformEnvironmentStagePlugin {
+    public static void init() {
+        TerraformEnvironmentStage.addPlugin(new ParameterStoreBuildWrapperPlugin())
+    }
+
+    @Override
+    public void apply(TerraformEnvironmentStage stage) {
+        def environment = stage.getEnvironment()
+        def parameterStorePath = pathForEnvironment(environment)
+
+        def options = [
+            path: parameterStorePath,
+            credentialsId: "${environment.toUpperCase()}_PARAMETER_STORE_ACCESS"
+        ]
+
+        stage.decorate(PLAN, addParameterStoreBuildWrapper(options))
+        stage.decorate(APPLY, addParameterStoreBuildWrapper(options))
+    }
+
+    String pathForEnvironment(String environment) {
+        String organization = Jenkinsfile.instance.getOrganization()
+        String repoName = Jenkinsfile.instance.getRepoName()
+
+        return "/${organization}/${repoName}/${environment}/"
+    }
+
+    public static Closure addParameterStoreBuildWrapper(Map options = []) {
+        def Map defaultOptions = [
+            naming: 'basename'
+        ]
+
+        def parameterStoreOptions = defaultOptions + options
+
+        return { closure ->
+            withAWSParameterStore(parameterStoreOptions) {
+                closure()
+            }
+        }
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin.html b/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin.html new file mode 100644 index 00000000..7bcc7b27 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ParameterStoreBuildWrapperPlugin.html @@ -0,0 +1 @@ +ParameterStoreBuildWrapperPlugin

ParameterStoreBuildWrapperPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total150 of 24639%0 of 0n/a36101436
apply(TerraformEnvironmentStage)980%n/a116611
addParameterStoreBuildWrapper(Map)380%n/a113311
addParameterStoreBuildWrapper()120%n/a111111
pathForEnvironment(String)26897%n/a010301
ParameterStoreBuildWrapperPlugin()14100%n/a010001
init()14100%n/a010101
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin$_addEnvVariables_closure1$_closure2.html b/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin$_addEnvVariables_closure1$_closure2.html new file mode 100644 index 00000000..4ec3a2f6 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin$_addEnvVariables_closure1$_closure2.html @@ -0,0 +1 @@ +ParameterStoreExecPlugin._addEnvVariables_closure1._closure2

ParameterStoreExecPlugin._addEnvVariables_closure1._closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total43 of 430%0 of 0n/a441144
ParameterStoreExecPlugin._addEnvVariables_closure1._closure2(Object, Object, Reference)150%n/a110011
doCall(Object)120%n/a111111
getClosure()80%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin$_addEnvVariables_closure1.html b/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin$_addEnvVariables_closure1.html new file mode 100644 index 00000000..6a4bb12c --- /dev/null +++ b/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin$_addEnvVariables_closure1.html @@ -0,0 +1 @@ +ParameterStoreExecPlugin._addEnvVariables_closure1

ParameterStoreExecPlugin._addEnvVariables_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total83 of 830%0 of 0n/a331133
doCall(Object)580%n/a111111
ParameterStoreExecPlugin._addEnvVariables_closure1(Object, Object, Reference)150%n/a110011
getPath()100%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin.groovy.html b/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin.groovy.html new file mode 100644 index 00000000..a72e8257 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin.groovy.html @@ -0,0 +1,47 @@ +ParameterStoreExecPlugin.groovy

ParameterStoreExecPlugin.groovy

import static TerraformEnvironmentStage.PLAN
+import static TerraformEnvironmentStage.APPLY
+
+class ParameterStoreExecPlugin implements TerraformEnvironmentStagePlugin, TerraformPlanCommandPlugin, TerraformApplyCommandPlugin {
+    public static void init() {
+        ParameterStoreExecPlugin plugin = new ParameterStoreExecPlugin()
+
+        TerraformEnvironmentStage.addPlugin(plugin)
+        TerraformPlanCommand.addPlugin(plugin)
+        TerraformApplyCommand.addPlugin(plugin)
+    }
+
+    @Override
+    public void apply(TerraformEnvironmentStage stage) {
+        def environment = stage.getEnvironment()
+        def parameterStorePath = pathForEnvironment(environment)
+
+        stage.decorate(PLAN, addEnvVariables(parameterStorePath))
+        stage.decorate(APPLY, addEnvVariables(parameterStorePath))
+    }
+
+    public String pathForEnvironment(String environment) {
+        String organization = Jenkinsfile.instance.getOrganization()
+        String repoName = Jenkinsfile.instance.getRepoName()
+
+        return "/${organization}/${repoName}/${environment}/"
+    }
+
+    public static Closure addEnvVariables(String path) {
+        return { closure ->
+            withEnv(["PARAMETER_STORE_EXEC_PATH=${path}", "PARAMETER_STORE_EXEC_DISABLE_TRANSLATION=true", "AWS_REGION=us-east-1"]) {
+                closure()
+            }
+        }
+    }
+
+    @Override
+    public void apply(TerraformPlanCommand command) {
+        command.withPrefix('parameter-store-exec')
+    }
+
+    @Override
+    public void apply(TerraformApplyCommand command) {
+        command.withPrefix('parameter-store-exec')
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin.html b/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin.html new file mode 100644 index 00000000..5e8f92d1 --- /dev/null +++ b/build/reports/jacoco/test/html/default/ParameterStoreExecPlugin.html @@ -0,0 +1 @@ +ParameterStoreExecPlugin

ParameterStoreExecPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total73 of 21065%0 of 0n/a2751427
apply(TerraformEnvironmentStage)540%n/a114411
addEnvVariables(String)170%n/a111111
pathForEnvironment(String)26897%n/a010301
init()35100%n/a010401
ParameterStoreExecPlugin()14100%n/a010001
apply(TerraformPlanCommand)10100%n/a010101
apply(TerraformApplyCommand)10100%n/a010101
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/S3BackendPlugin.groovy.html b/build/reports/jacoco/test/html/default/S3BackendPlugin.groovy.html new file mode 100644 index 00000000..b2078695 --- /dev/null +++ b/build/reports/jacoco/test/html/default/S3BackendPlugin.groovy.html @@ -0,0 +1,22 @@ +S3BackendPlugin.groovy

S3BackendPlugin.groovy

class S3BackendPlugin implements TerraformInitCommandPlugin {
+    public static void init() {
+        S3BackendPlugin plugin = new S3BackendPlugin()
+
+        TerraformInitCommand.addPlugin(plugin)
+    }
+
+    @Override
+    public void apply(TerraformInitCommand command) {
+        String repoSlug = Jenkinsfile.instance.getStandardizedRepoSlug()
+        String environment = command.getEnvironment()
+
+        String key = "terraform/${repoSlug}/${environment}"
+        String bucket = "\$${environment.toUpperCase()}_S3_BACKEND_BUCKET"
+        String region = Jenkinsfile.env.DEFAULT_S3_BACKEND_REGION
+
+        command.withBackendConfig("key=${key}")
+        command.withBackendConfig("bucket=${bucket}")
+        command.withBackendConfig("region=${region}")
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/S3BackendPlugin.html b/build/reports/jacoco/test/html/default/S3BackendPlugin.html new file mode 100644 index 00000000..d01087ff --- /dev/null +++ b/build/reports/jacoco/test/html/default/S3BackendPlugin.html @@ -0,0 +1 @@ +S3BackendPlugin

S3BackendPlugin

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total0 of 211100%0 of 0n/a0301003
apply(TerraformInitCommand)176100%n/a010801
init()21100%n/a010201
S3BackendPlugin()14100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformApplyCommand.groovy.html b/build/reports/jacoco/test/html/default/TerraformApplyCommand.groovy.html new file mode 100644 index 00000000..bccedeb6 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformApplyCommand.groovy.html @@ -0,0 +1,66 @@ +TerraformApplyCommand.groovy

TerraformApplyCommand.groovy

class TerraformApplyCommand {
+    private boolean input = false
+    private String terraformBinary = "terraform"
+    private String command = "apply"
+    String environment
+    private prefixes = []
+    private args = []
+    private static plugins = []
+
+    public TerraformApplyCommand(String environment) {
+        this.environment = environment
+    }
+
+    public TerraformApplyCommand withInput(boolean input) {
+        this.input = input
+        return this
+    }
+
+    public TerraformApplyCommand withArgument(String arg) {
+        this.args << arg
+        return this
+    }
+
+    public TerraformApplyCommand withPrefix(String prefix) {
+        prefixes << prefix
+        return this
+    }
+
+    public String toString() {
+        def pieces = []
+        pieces += prefixes
+        pieces << terraformBinary
+        pieces << command
+        if (!input) {
+            pieces << "-input=false"
+        }
+        pieces += args
+
+        return pieces.join(' ')
+    }
+
+    public static void addPlugin(TerraformApplyCommandPlugin plugin) {
+        plugins << plugin
+    }
+
+    public static TerraformApplyCommand instanceFor(String environment) {
+        TerraformApplyCommand command = new TerraformApplyCommand(environment)
+            .withInput(false)
+            .withArgument("-auto-approve")
+
+        for(TerraformApplyCommandPlugin plugin in plugins) {
+            plugin.apply(command)
+        }
+
+        return command
+    }
+
+    public static getPlugins() {
+        return plugins
+    }
+
+    public static resetPlugins() {
+        this.plugins = []
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformApplyCommand.html b/build/reports/jacoco/test/html/default/TerraformApplyCommand.html new file mode 100644 index 00000000..b5d08ada --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformApplyCommand.html @@ -0,0 +1 @@ +TerraformApplyCommand

TerraformApplyCommand

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total100 of 28264%4 of 633%715825412
instanceFor(String)570%20%224411
withInput(boolean)160%n/a112211
withArgument(String)140%n/a112211
setEnvironment(String)40%n/a110011
toString()36695%2250%230801
withPrefix(String)21285%n/a010201
resetPlugins()21083%n/a010101
getPlugins()2466%n/a010101
TerraformApplyCommand(String)68100%n/a010301
addPlugin(TerraformApplyCommandPlugin)10100%n/a010101
static {...}9100%n/a010101
getEnvironment()3100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_applyDecorations_closure3.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_applyDecorations_closure3.html new file mode 100644 index 00000000..7272a11a --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_applyDecorations_closure3.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._applyDecorations_closure3

TerraformEnvironmentStage._applyDecorations_closure3

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total17 of 170%0 of 0n/a221122
doCall(Object)100%n/a111111
TerraformEnvironmentStage._applyDecorations_closure3(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_decorate_closure4.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_decorate_closure4.html new file mode 100644 index 00000000..01f65eef --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_decorate_closure4.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._decorate_closure4

TerraformEnvironmentStage._decorate_closure4

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total10 of 1741%0 of 0n/a121112
doCall(Object)100%n/a111111
TerraformEnvironmentStage._decorate_closure4(Object, Object)7100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_decorate_closure5$_closure17.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_decorate_closure5$_closure17.html new file mode 100644 index 00000000..f967b600 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_decorate_closure5$_closure17.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._decorate_closure5._closure17

TerraformEnvironmentStage._decorate_closure5._closure17

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total94 of 940%0 of 0n/a553355
doCall(Object)470%n/a113311
TerraformEnvironmentStage._decorate_closure5._closure17(Object, Object, Reference, Reference)230%n/a110011
getStage()80%n/a110011
getExistingDecorations()80%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_decorate_closure5.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_decorate_closure5.html new file mode 100644 index 00000000..c6e487bd --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_decorate_closure5.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._decorate_closure5

TerraformEnvironmentStage._decorate_closure5

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total62 of 8527%0 of 0n/a342234
doCall(Object)430%n/a112211
getDecoration()110%n/a110011
getExistingDecorations()80%n/a110011
TerraformEnvironmentStage._decorate_closure5(Object, Object, Reference, Reference)23100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure10$_closure13$_closure14.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure10$_closure13$_closure14.html new file mode 100644 index 00000000..51ce577c --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure10$_closure13$_closure14.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10._closure13._closure14

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10._closure13._closure14

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total26 of 260%0 of 0n/a331133
doCall(Object)110%n/a111111
doCall()80%n/a110011
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10._closure13._closure14(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure10$_closure13.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure10$_closure13.html new file mode 100644 index 00000000..d73cf8db --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure10$_closure13.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10._closure13

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10._closure13

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total36 of 360%0 of 0n/a331133
doCall(Object)210%n/a111111
doCall()80%n/a110011
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10._closure13(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure10.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure10.html new file mode 100644 index 00000000..4fc84e91 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure10.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total82 of 820%0 of 0n/a441144
doCall(Object)490%n/a111111
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10(Object, Object, Reference)150%n/a110011
getEnvironment()100%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure11$_closure15$_closure16.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure11$_closure15$_closure16.html new file mode 100644 index 00000000..f73cc359 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure11$_closure15$_closure16.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11._closure15._closure16

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11._closure15._closure16

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total49 of 490%0 of 0n/a332233
doCall(Object)340%n/a112211
doCall()80%n/a110011
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11._closure15._closure16(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure11$_closure15.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure11$_closure15.html new file mode 100644 index 00000000..4eec349b --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure11$_closure15.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11._closure15

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11._closure15

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total36 of 360%0 of 0n/a331133
doCall(Object)210%n/a111111
doCall()80%n/a110011
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11._closure15(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure11.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure11.html new file mode 100644 index 00000000..7e99b3b8 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure11.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total82 of 820%0 of 0n/a441144
doCall(Object)490%n/a111111
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11(Object, Object, Reference)150%n/a110011
getEnvironment()100%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure9$_closure12.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure9$_closure12.html new file mode 100644 index 00000000..75903acc --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure9$_closure12.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure9._closure12

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure9._closure12

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total49 of 490%0 of 0n/a332233
doCall(Object)340%n/a112211
doCall()80%n/a110011
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure9._closure12(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure9.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure9.html new file mode 100644 index 00000000..f2948454 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8$_closure9.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure9

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure9

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total36 of 360%0 of 0n/a331133
doCall(Object)210%n/a111111
doCall()80%n/a110011
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure9(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8.html new file mode 100644 index 00000000..5b5b2ea6 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7$_closure8.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total120 of 1200%0 of 0n/a443344
doCall(Object)870%n/a113311
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8(Object, Object, Reference)150%n/a110011
getEnvironment()100%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7.html new file mode 100644 index 00000000..c01c75b1 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2$_closure7.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7

TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total73 of 730%0 of 0n/a443344
doCall(Object)400%n/a113311
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7(Object, Object, Reference)150%n/a110011
getEnvironment()100%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2.html new file mode 100644 index 00000000..eb1308e2 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_pipelineConfiguration_closure2.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._pipelineConfiguration_closure2

TerraformEnvironmentStage._pipelineConfiguration_closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total43 of 430%0 of 0n/a331133
doCall()180%n/a111111
TerraformEnvironmentStage._pipelineConfiguration_closure2(Object, Object, Reference)150%n/a110011
getEnvironment()100%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_withEnv_closure1$_closure6.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_withEnv_closure1$_closure6.html new file mode 100644 index 00000000..ce3b5f33 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_withEnv_closure1$_closure6.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._withEnv_closure1._closure6

TerraformEnvironmentStage._withEnv_closure1._closure6

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total43 of 430%0 of 0n/a441144
TerraformEnvironmentStage._withEnv_closure1._closure6(Object, Object, Reference)150%n/a110011
doCall(Object)120%n/a111111
getClosure()80%n/a110011
doCall()80%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_withEnv_closure1.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_withEnv_closure1.html new file mode 100644 index 00000000..31d320aa --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage$_withEnv_closure1.html @@ -0,0 +1 @@ +TerraformEnvironmentStage._withEnv_closure1

TerraformEnvironmentStage._withEnv_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total103 of 1030%0 of 0n/a441144
doCall(Object)600%n/a111111
TerraformEnvironmentStage._withEnv_closure1(Object, Object, Reference, Reference)230%n/a110011
getKey()100%n/a110011
getValue()100%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage.groovy.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage.groovy.html new file mode 100644 index 00000000..137b1335 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage.groovy.html @@ -0,0 +1,142 @@ +TerraformEnvironmentStage.groovy

TerraformEnvironmentStage.groovy

class TerraformEnvironmentStage {
+    private Jenkinsfile jenkinsfile
+    private String environment
+    private Map<String,Closure> decorations
+    private TerraformInitCommand initCommand
+    private TerraformPlanCommand planCommand
+    private TerraformApplyCommand applyCommand
+
+    private static plugins = [ new ConditionalApplyPlugin(), new ConfirmApplyPlugin(), new DefaultEnvironmentPlugin() ]
+
+    public static final String ALL = 'all'
+    public static final String PLAN = 'plan'
+    public static final String CONFIRM = 'confirm'
+    public static final String APPLY = 'apply'
+
+    TerraformEnvironmentStage(String environment) {
+        this.environment = environment
+        this.jenkinsfile = Jenkinsfile.instance
+        this.decorations = new HashMap<String,Closure>()
+    }
+
+    public then(nextStages) {
+        build()
+        return nextStages
+    }
+
+    public void configure() {
+        initCommand = TerraformInitCommand.instanceFor(environment)
+        planCommand = TerraformPlanCommand.instanceFor(environment)
+        applyCommand = TerraformApplyCommand.instanceFor(environment)
+
+        applyPlugins()
+    }
+
+    public TerraformEnvironmentStage withEnv(String key, String value) {
+        def environmentClosure = { closure ->
+            withEnv(["${key}=${value}"]) {
+                closure()
+            }
+        }
+        decorate(ALL, environmentClosure)
+        return this
+    }
+
+    public build() {
+        configure()
+        def configuration = pipelineConfiguration()
+        configuration.delegate = jenkinsfile
+        configuration.call()
+    }
+
+    private Closure pipelineConfiguration() {
+        def String environment = this.environment
+        return { ->
+            node {
+                deleteDir()
+                checkout(scm)
+
+                applyDecorations(ALL) {
+                    stage("${PLAN}-${environment}") {
+                        applyDecorations(PLAN) {
+                            sh initCommand.toString()
+                            sh planCommand.toString()
+                        }
+                    }
+
+                    applyDecorationsAround(CONFIRM) {
+                        stage("${CONFIRM}-${environment}") {
+                            applyDecorations(CONFIRM) {
+                                echo "Approved"
+                            }
+                        }
+                    }
+
+                    applyDecorationsAround(APPLY) {
+                        stage("${APPLY}-${environment}") {
+                            applyDecorations(APPLY) {
+                                sh initCommand.toString()
+                                sh applyCommand.toString()
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private void applyDecorations(String stageName, Closure stageClosure) {
+        def stageDecorations = decorations.get(stageName) ?: { stage -> stage() }
+        stageDecorations.delegate = jenkinsfile
+        stageDecorations(stageClosure)
+    }
+
+    public decorate(String stageName, Closure decoration) {
+        def existingDecorations = decorations.get(stageName) ?: { stage -> stage() }
+        def newDecoration = { stage ->
+            decoration.delegate = delegate
+            decoration() {
+                stage.delegate = delegate
+                existingDecorations.delegate = delegate
+                existingDecorations(stage)
+            }
+        }
+
+        decorations.put(stageName,newDecoration)
+    }
+
+    private void applyDecorationsAround(String stageName, Closure stageClosure) {
+        applyDecorations("Around-${stageName}", stageClosure)
+    }
+
+    public decorateAround(String stageName, Closure decoration) {
+        decorate("Around-${stageName}", decoration)
+    }
+
+    public String toString() {
+        return environment
+    }
+
+    public static addPlugin(plugin) {
+        plugins << plugin
+    }
+
+    public void applyPlugins() {
+        for(plugin in plugins) {
+            plugin.apply(this)
+        }
+    }
+
+    public String getEnvironment() {
+        return environment
+    }
+
+    public static getPlugins() {
+        return plugins
+    }
+
+    public static void resetPlugins() {
+        this.plugins = [ new ConditionalApplyPlugin(), new ConfirmApplyPlugin(), new DefaultEnvironmentPlugin() ]
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformEnvironmentStage.html b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage.html new file mode 100644 index 00000000..5844c476 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformEnvironmentStage.html @@ -0,0 +1 @@ +TerraformEnvironmentStage

TerraformEnvironmentStage

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total299 of 54545%19 of 2213%18282034817
configure()700%40%334411
build()620%80%554411
applyDecorations(String, Closure)420%20%223311
withEnv(String, String)360%n/a113311
applyDecorationsAround(String, Closure)290%n/a111111
then(Object)210%40%332211
pipelineConfiguration()200%n/a112211
toString()70%n/a111111
decorate(String, Closure)45092%1150%120301
decorateAround(String, Closure)22893%n/a010101
addPlugin(Object)2981%n/a010101
getEnvironment()2571%n/a010101
getPlugins()2466%n/a010101
TerraformEnvironmentStage(String)54100%n/a010301
resetPlugins()35100%n/a010101
static {...}33100%n/a010101
applyPlugins()28100%2100%020201
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformInitCommand$_toString_closure1.html b/build/reports/jacoco/test/html/default/TerraformInitCommand$_toString_closure1.html new file mode 100644 index 00000000..b7594f7e --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformInitCommand$_toString_closure1.html @@ -0,0 +1 @@ +TerraformInitCommand._toString_closure1

TerraformInitCommand._toString_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total10 of 5481%0 of 0n/a130113
getPieces()80%n/a110011
doCall(Object)22993%n/a010101
TerraformInitCommand._toString_closure1(Object, Object, Reference)15100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformInitCommand.groovy.html b/build/reports/jacoco/test/html/default/TerraformInitCommand.groovy.html new file mode 100644 index 00000000..90615b0c --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformInitCommand.groovy.html @@ -0,0 +1,67 @@ +TerraformInitCommand.groovy

TerraformInitCommand.groovy

class TerraformInitCommand {
+    private boolean input = false
+    private String terraformBinary = "terraform"
+    private String command = "init"
+    String environment
+    private prefixes = []
+    private backendConfigs = []
+
+    private static plugins = []
+
+    public TerraformInitCommand(String environment) {
+        this.environment = environment
+    }
+
+    public TerraformInitCommand withInput(boolean input) {
+        this.input = input
+        return this
+    }
+
+    public TerraformInitCommand withPrefix(String prefix) {
+        prefixes = prefix
+        return this
+    }
+
+    public TerraformInitCommand withBackendConfig(String backendConfig) {
+        this.backendConfigs << backendConfig
+        return this
+    }
+
+    public String toString() {
+        def pieces = []
+        pieces = pieces + prefixes
+        pieces << terraformBinary
+        pieces << command
+        if (!input) {
+            pieces << "-input=false"
+        }
+        backendConfigs.each { config ->
+            pieces << "-backend-config=${config}"
+        }
+
+        return pieces.join(' ')
+    }
+
+    public static void addPlugin(TerraformInitCommandPlugin plugin) {
+        plugins << plugin
+    }
+
+    public static TerraformInitCommand instanceFor(String environment) {
+        TerraformInitCommand command = new TerraformInitCommand(environment)
+
+        for(TerraformInitCommandPlugin plugin in plugins) {
+            plugin.apply(command)
+        }
+
+        return command
+    }
+
+    public static getPlugins() {
+        return plugins
+    }
+
+    public static resetPlugins() {
+        this.plugins = []
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformInitCommand.html b/build/reports/jacoco/test/html/default/TerraformInitCommand.html new file mode 100644 index 00000000..7dc3f87a --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformInitCommand.html @@ -0,0 +1 @@ +TerraformInitCommand

TerraformInitCommand

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total77 of 28873%4 of 633%615625312
instanceFor(String)460%20%224411
withInput(boolean)160%n/a112211
setEnvironment(String)40%n/a110011
toString()38396%2250%230801
withPrefix(String)21285%n/a010201
withBackendConfig(String)21285%n/a010201
resetPlugins()21083%n/a010101
getPlugins()2466%n/a010101
TerraformInitCommand(String)68100%n/a010301
addPlugin(TerraformInitCommandPlugin)10100%n/a010101
static {...}9100%n/a010101
getEnvironment()3100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformPlanCommand.groovy.html b/build/reports/jacoco/test/html/default/TerraformPlanCommand.groovy.html new file mode 100644 index 00000000..38e546c8 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformPlanCommand.groovy.html @@ -0,0 +1,58 @@ +TerraformPlanCommand.groovy

TerraformPlanCommand.groovy

class TerraformPlanCommand {
+    private boolean input = false
+    private String terraformBinary = "terraform"
+    private String command = "plan"
+    String environment
+    private prefixes = []
+    private static plugins = []
+
+    public TerraformPlanCommand(String environment) {
+        this.environment = environment
+    }
+
+    public TerraformPlanCommand withInput(boolean input) {
+        this.input = input
+        return this
+    }
+
+    public TerraformPlanCommand withPrefix(String prefix) {
+        prefixes << prefix
+        return this
+    }
+
+    public String toString() {
+        def pieces = []
+        pieces = pieces + prefixes
+        pieces << terraformBinary
+        pieces << command
+        if (!input) {
+            pieces << "-input=false"
+        }
+
+        return pieces.join(' ')
+    }
+
+    public static addPlugin(TerraformPlanCommandPlugin plugin) {
+        plugins << plugin
+    }
+
+    public static TerraformPlanCommand instanceFor(String environment) {
+        TerraformPlanCommand command = new TerraformPlanCommand(environment)
+            .withInput(false)
+
+        for(TerraformPlanCommandPlugin plugin in plugins) {
+            plugin.apply(command)
+        }
+
+        return command
+    }
+
+    public static getPlugins() {
+        return plugins
+    }
+
+    public static resetPlugins() {
+        this.plugins = []
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformPlanCommand.html b/build/reports/jacoco/test/html/default/TerraformPlanCommand.html new file mode 100644 index 00000000..cc9e7b9e --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformPlanCommand.html @@ -0,0 +1 @@ +TerraformPlanCommand

TerraformPlanCommand

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total83 of 24666%4 of 633%614621311
instanceFor(String)520%20%224411
withInput(boolean)160%n/a112211
setEnvironment(String)40%n/a110011
toString()35895%2250%230701
withPrefix(String)21285%n/a010201
resetPlugins()21083%n/a010101
addPlugin(TerraformPlanCommandPlugin)2981%n/a010101
getPlugins()2466%n/a010101
TerraformPlanCommand(String)58100%n/a010201
static {...}9100%n/a010101
getEnvironment()3100%n/a010001
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformValidateStage$_pipelineConfiguration_closure1$_closure2$_closure3.html b/build/reports/jacoco/test/html/default/TerraformValidateStage$_pipelineConfiguration_closure1$_closure2$_closure3.html new file mode 100644 index 00000000..020c4e20 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformValidateStage$_pipelineConfiguration_closure1$_closure2$_closure3.html @@ -0,0 +1 @@ +TerraformValidateStage._pipelineConfiguration_closure1._closure2._closure3

TerraformValidateStage._pipelineConfiguration_closure1._closure2._closure3

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total47 of 470%0 of 0n/a333333
doCall(Object)320%n/a113311
doCall()80%n/a110011
TerraformValidateStage._pipelineConfiguration_closure1._closure2._closure3(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformValidateStage$_pipelineConfiguration_closure1$_closure2.html b/build/reports/jacoco/test/html/default/TerraformValidateStage$_pipelineConfiguration_closure1$_closure2.html new file mode 100644 index 00000000..465b2b65 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformValidateStage$_pipelineConfiguration_closure1$_closure2.html @@ -0,0 +1 @@ +TerraformValidateStage._pipelineConfiguration_closure1._closure2

TerraformValidateStage._pipelineConfiguration_closure1._closure2

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total32 of 320%0 of 0n/a331133
doCall(Object)170%n/a111111
doCall()80%n/a110011
TerraformValidateStage._pipelineConfiguration_closure1._closure2(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformValidateStage$_pipelineConfiguration_closure1.html b/build/reports/jacoco/test/html/default/TerraformValidateStage$_pipelineConfiguration_closure1.html new file mode 100644 index 00000000..db8ca9e1 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformValidateStage$_pipelineConfiguration_closure1.html @@ -0,0 +1 @@ +TerraformValidateStage._pipelineConfiguration_closure1

TerraformValidateStage._pipelineConfiguration_closure1

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total31 of 310%0 of 0n/a331133
doCall(Object)160%n/a111111
doCall()80%n/a110011
TerraformValidateStage._pipelineConfiguration_closure1(Object, Object)70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformValidateStage.groovy.html b/build/reports/jacoco/test/html/default/TerraformValidateStage.groovy.html new file mode 100644 index 00000000..92f11586 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformValidateStage.groovy.html @@ -0,0 +1,33 @@ +TerraformValidateStage.groovy

TerraformValidateStage.groovy

class TerraformValidateStage {
+    public static String validateCommand = "terraform validate -check-variables=false"
+
+    private jenkinsFileScript
+
+    public TerraformValidateStage() {
+        jenkinsFileScript = Jenkinsfile.instance
+    }
+
+    public then(nextStage) {
+        build()
+        return nextStage
+    }
+
+    public build() {
+        def configuration = pipelineConfiguration()
+        configuration.delegate = jenkinsFileScript
+        configuration()
+    }
+
+    private Closure pipelineConfiguration() {
+        return {
+            node {
+                stage("validate") {
+                    deleteDir()
+                    checkout(scm)
+                    sh validateCommand
+                }
+            }
+        }
+    }
+}
+
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/TerraformValidateStage.html b/build/reports/jacoco/test/html/default/TerraformValidateStage.html new file mode 100644 index 00000000..9df1fe44 --- /dev/null +++ b/build/reports/jacoco/test/html/default/TerraformValidateStage.html @@ -0,0 +1 @@ +TerraformValidateStage

TerraformValidateStage

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethods
Total110 of 1100%8 of 80%997755
build()460%40%333311
TerraformValidateStage()260%n/a111111
then(Object)210%40%332211
pipelineConfiguration()100%n/a111111
static {...}70%n/a110011
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/index.html b/build/reports/jacoco/test/html/default/index.html new file mode 100644 index 00000000..2af96b01 --- /dev/null +++ b/build/reports/jacoco/test/html/default/index.html @@ -0,0 +1 @@ +default

default

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total4,616 of 6,86732%129 of 15617%2583511943301852733660
CrqPlugin4565110%240%2124222491201
Jenkinsfile40810921%2228%2025263391301
TerraformEnvironmentStage29924645%19313%1828203481701
BuildStage2090%120%141414148811
CrqPlugin._addCrq_closure11510%n/a33553311
ParameterStoreBuildWrapperPlugin1509639%n/a3610143601
FileParametersPlugin._addEnvironmentSpecificVariables_closure11480%20%44773311
ConditionalApplyPlugin._onlyOnBranch_closure11231510%20%34442301
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure81200%n/a44334411
TerraformValidateStage1100%80%99775511
TerraformEnvironmentStage._withEnv_closure11030%n/a44114411
TerraformApplyCommand10018264%4233%71582541201
TerraformEnvironmentStage._decorate_closure5._closure17940%n/a55335511
FileParametersPlugin939450%40%48482601
BuildStage._pipelineConfiguration_closure2._closure3._closure4870%20%44443311
TerraformPlanCommand8316366%4233%61462131101
ParameterStoreExecPlugin._addEnvVariables_closure1830%n/a33113311
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10820%n/a44114411
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11820%n/a44114411
TerraformInitCommand7721173%4233%61562531201
AnsiColorPlugin752827%40%46342401
ParameterStoreExecPlugin7313765%n/a275142701
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7730%n/a44334411
TerraformEnvironmentStage._decorate_closure5622327%n/a34223401
BuildStage._unstashArtifact_closure1620%n/a33223311
DefaultEnvironmentPlugin._addEnvironmentTerraformVariable_closure1601520%n/a23112301
ConfirmApplyPlugin._addConfirmation_closure156711%n/a12331201
ConfirmApplyPlugin._addConfirmation_closure1._closure2520%n/a33113311
ParameterStoreBuildWrapperPlugin._addParameterStoreBuildWrapper_closure1490%n/a33113311
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure9._closure12490%n/a33223311
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11._closure15._closure16490%n/a33223311
TerraformValidateStage._pipelineConfiguration_closure1._closure2._closure3470%n/a33333311
ParameterStoreBuildWrapperPlugin._addParameterStoreBuildWrapper_closure1._closure2430%n/a44114411
AnsiColorPlugin._addColor_closure1._closure2430%n/a44114411
TerraformEnvironmentStage._pipelineConfiguration_closure2430%n/a33113311
DefaultEnvironmentPlugin._addEnvironmentTerraformVariable_closure1._closure2430%n/a44114411
ParameterStoreExecPlugin._addEnvVariables_closure1._closure2430%n/a44114411
TerraformEnvironmentStage._withEnv_closure1._closure6430%n/a44114411
FileParametersPlugin._addEnvironmentSpecificVariables_closure1._closure3430%n/a44114411
ConditionalApplyPlugin397365%2250%25040301
Jenkinsfile._getScmUrl_closure1390%n/a33113311
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10._closure13360%n/a33113311
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure9360%n/a33113311
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure11._closure15360%n/a33113311
ConsulBackendPlugin._getBackendPath_closure1354757%40%46012401
ConfirmApplyPlugin334256%2250%36131401
TerraformValidateStage._pipelineConfiguration_closure1._closure2320%n/a33113311
BuildStage._pipelineConfiguration_closure2._closure3320%n/a33113311
ConsulBackendPlugin3119986%41071%4120140501
BuildStage._pipelineConfiguration_closure2310%n/a33113311
AnsiColorPlugin._addColor_closure1310%n/a22112211
TerraformValidateStage._pipelineConfiguration_closure1310%n/a33113311
TerraformEnvironmentStage._pipelineConfiguration_closure2._closure7._closure8._closure10._closure13._closure14260%n/a33113311
FileParametersPlugin._getVariables_closure2251639%40%35011301
DefaultEnvironmentPlugin206075%2250%25030301
TerraformEnvironmentStage._applyDecorations_closure3170%n/a22112211
TerraformInitCommand._toString_closure1104481%n/a13011301
TerraformEnvironmentStage._decorate_closure410741%n/a12111201
S3BackendPlugin211100%n/a030100301
AwssumePlugin175100%n/a050100501
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/default/index.source.html b/build/reports/jacoco/test/html/default/index.source.html new file mode 100644 index 00000000..d3fe8e34 --- /dev/null +++ b/build/reports/jacoco/test/html/default/index.source.html @@ -0,0 +1 @@ +default

default

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total4,616 of 6,86732%129 of 15617%2583511943301852733660
TerraformEnvironmentStage.groovy1,26027617%19313%7486445864751518
CrqPlugin.groovy607517%240%24272729121512
Jenkinsfile.groovy44710919%2228%23282734121612
BuildStage.groovy4210%140%27272222202055
FileParametersPlugin.groovy30911026%100%15211115101624
ParameterStoreBuildWrapperPlugin.groovy2429628%n/a10131216101323
TerraformValidateStage.groovy2200%80%18181212141444
ParameterStoreExecPlugin.groovy19913740%n/a91471691423
ConditionalApplyPlugin.groovy1628835%4233%59482602
AnsiColorPlugin.groovy1492815%40%10123481023
ConfirmApplyPlugin.groovy1414925%2250%711575913
DefaultEnvironmentPlugin.groovy1237537%2250%8120361013
TerraformApplyCommand.groovy10018264%4233%71582541201
TerraformInitCommand.groovy8725574%4233%71862641502
TerraformPlanCommand.groovy8316366%4233%61462131101
ConsulBackendPlugin.groovy6624678%81055%8180142902
S3BackendPlugin.groovy211100%n/a030100301
AwssumePlugin.groovy175100%n/a050100501
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/index.html b/build/reports/jacoco/test/html/index.html new file mode 100644 index 00000000..ee26557e --- /dev/null +++ b/build/reports/jacoco/test/html/index.html @@ -0,0 +1 @@ +terraform-pipeline

terraform-pipeline

ElementMissed InstructionsCov.Missed BranchesCov.MissedCxtyMissedLinesMissedMethodsMissedClasses
Total4,616 of 6,86732%129 of 15617%2583511943301852733660
default4,6162,25132%1292717%2583511943301852733660
\ No newline at end of file diff --git a/build/reports/jacoco/test/html/jacoco-resources/branchfc.gif b/build/reports/jacoco/test/html/jacoco-resources/branchfc.gif new file mode 100644 index 00000000..989b46d3 Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/branchfc.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/branchnc.gif b/build/reports/jacoco/test/html/jacoco-resources/branchnc.gif new file mode 100644 index 00000000..1933e07c Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/branchnc.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/branchpc.gif b/build/reports/jacoco/test/html/jacoco-resources/branchpc.gif new file mode 100644 index 00000000..cbf711b7 Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/branchpc.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/bundle.gif b/build/reports/jacoco/test/html/jacoco-resources/bundle.gif new file mode 100644 index 00000000..fca9c53e Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/bundle.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/class.gif b/build/reports/jacoco/test/html/jacoco-resources/class.gif new file mode 100644 index 00000000..eb348fb0 Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/class.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/down.gif b/build/reports/jacoco/test/html/jacoco-resources/down.gif new file mode 100644 index 00000000..440a14db Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/down.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/greenbar.gif b/build/reports/jacoco/test/html/jacoco-resources/greenbar.gif new file mode 100644 index 00000000..0ba65672 Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/greenbar.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/group.gif b/build/reports/jacoco/test/html/jacoco-resources/group.gif new file mode 100644 index 00000000..a4ea580d Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/group.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/method.gif b/build/reports/jacoco/test/html/jacoco-resources/method.gif new file mode 100644 index 00000000..7d24707e Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/method.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/package.gif b/build/reports/jacoco/test/html/jacoco-resources/package.gif new file mode 100644 index 00000000..131c28da Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/package.gif differ diff --git a/build/reports/jacoco/test/html/jacoco-resources/prettify.css b/build/reports/jacoco/test/html/jacoco-resources/prettify.css new file mode 100644 index 00000000..be5166e0 --- /dev/null +++ b/build/reports/jacoco/test/html/jacoco-resources/prettify.css @@ -0,0 +1,13 @@ +/* Pretty printing styles. Used with prettify.js. */ + +.str { color: #2A00FF; } +.kwd { color: #7F0055; font-weight:bold; } +.com { color: #3F5FBF; } +.typ { color: #606; } +.lit { color: #066; } +.pun { color: #660; } +.pln { color: #000; } +.tag { color: #008; } +.atn { color: #606; } +.atv { color: #080; } +.dec { color: #606; } diff --git a/build/reports/jacoco/test/html/jacoco-resources/prettify.js b/build/reports/jacoco/test/html/jacoco-resources/prettify.js new file mode 100644 index 00000000..ab278821 --- /dev/null +++ b/build/reports/jacoco/test/html/jacoco-resources/prettify.js @@ -0,0 +1,1510 @@ +// Copyright (C) 2006 Google Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + + +/** + * @fileoverview + * some functions for browser-side pretty printing of code contained in html. + *

+ * + * For a fairly comprehensive set of languages see the + * README + * file that came with this source. At a minimum, the lexer should work on a + * number of languages including C and friends, Java, Python, Bash, SQL, HTML, + * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk + * and a subset of Perl, but, because of commenting conventions, doesn't work on + * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class. + *

+ * Usage:

    + *
  1. include this source file in an html page via + * {@code } + *
  2. define style rules. See the example page for examples. + *
  3. mark the {@code
    } and {@code } tags in your source with
    + *    {@code class=prettyprint.}
    + *    You can also use the (html deprecated) {@code } tag, but the pretty
    + *    printer needs to do more substantial DOM manipulations to support that, so
    + *    some css styles may not be preserved.
    + * </ol>
    + * That's it.  I wanted to keep the API as simple as possible, so there's no
    + * need to specify which language the code is in, but if you wish, you can add
    + * another class to the {@code <pre>} or {@code <code>} element to specify the
    + * language, as in {@code <pre class="prettyprint lang-java">}.  Any class that
    + * starts with "lang-" followed by a file extension, specifies the file type.
    + * See the "lang-*.js" files in this directory for code that implements
    + * per-language file handlers.
    + * <p>
    + * Change log:<br>
    + * cbeust, 2006/08/22
    + * <blockquote>
    + *   Java annotations (start with "@") are now captured as literals ("lit")
    + * </blockquote>
    + * @requires console
    + */
    +
    +// JSLint declarations
    +/*global console, document, navigator, setTimeout, window */
    +
    +/**
    + * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
    + * UI events.
    + * If set to {@code false}, {@code prettyPrint()} is synchronous.
    + */
    +window['PR_SHOULD_USE_CONTINUATION'] = true;
    +
    +/** the number of characters between tab columns */
    +window['PR_TAB_WIDTH'] = 8;
    +
    +/** Walks the DOM returning a properly escaped version of innerHTML.
    +  * @param {Node} node
    +  * @param {Array.<string>} out output buffer that receives chunks of HTML.
    +  */
    +window['PR_normalizedHtml']
    +
    +/** Contains functions for creating and registering new language handlers.
    +  * @type {Object}
    +  */
    +  = window['PR']
    +
    +/** Pretty print a chunk of code.
    +  *
    +  * @param {string} sourceCodeHtml code as html
    +  * @return {string} code as html, but prettier
    +  */
    +  = window['prettyPrintOne']
    +/** Find all the {@code <pre>} and {@code <code>} tags in the DOM with
    +  * {@code class=prettyprint} and prettify them.
    +  * @param {Function?} opt_whenDone if specified, called when the last entry
    +  *     has been finished.
    +  */
    +  = window['prettyPrint'] = void 0;
    +
    +/** browser detection. @extern @returns false if not IE, otherwise the major version. */
    +window['_pr_isIE6'] = function () {
    +  var ieVersion = navigator && navigator.userAgent &&
    +      navigator.userAgent.match(/\bMSIE ([678])\./);
    +  ieVersion = ieVersion ? +ieVersion[1] : false;
    +  window['_pr_isIE6'] = function () { return ieVersion; };
    +  return ieVersion;
    +};
    +
    +
    +(function () {
    +  // Keyword lists for various languages.
    +  var FLOW_CONTROL_KEYWORDS =
    +      "break continue do else for if return while ";
    +  var C_KEYWORDS = FLOW_CONTROL_KEYWORDS + "auto case char const default " +
    +      "double enum extern float goto int long register short signed sizeof " +
    +      "static struct switch typedef union unsigned void volatile ";
    +  var COMMON_KEYWORDS = C_KEYWORDS + "catch class delete false import " +
    +      "new operator private protected public this throw true try typeof ";
    +  var CPP_KEYWORDS = COMMON_KEYWORDS + "alignof align_union asm axiom bool " +
    +      "concept concept_map const_cast constexpr decltype " +
    +      "dynamic_cast explicit export friend inline late_check " +
    +      "mutable namespace nullptr reinterpret_cast static_assert static_cast " +
    +      "template typeid typename using virtual wchar_t where ";
    +  var JAVA_KEYWORDS = COMMON_KEYWORDS +
    +      "abstract boolean byte extends final finally implements import " +
    +      "instanceof null native package strictfp super synchronized throws " +
    +      "transient ";
    +  var CSHARP_KEYWORDS = JAVA_KEYWORDS +
    +      "as base by checked decimal delegate descending event " +
    +      "fixed foreach from group implicit in interface internal into is lock " +
    +      "object out override orderby params partial readonly ref sbyte sealed " +
    +      "stackalloc string select uint ulong unchecked unsafe ushort var ";
    +  var JSCRIPT_KEYWORDS = COMMON_KEYWORDS +
    +      "debugger eval export function get null set undefined var with " +
    +      "Infinity NaN ";
    +  var PERL_KEYWORDS = "caller delete die do dump elsif eval exit foreach for " +
    +      "goto if import last local my next no our print package redo require " +
    +      "sub undef unless until use wantarray while BEGIN END ";
    +  var PYTHON_KEYWORDS = FLOW_CONTROL_KEYWORDS + "and as assert class def del " +
    +      "elif except exec finally from global import in is lambda " +
    +      "nonlocal not or pass print raise try with yield " +
    +      "False True None ";
    +  var RUBY_KEYWORDS = FLOW_CONTROL_KEYWORDS + "alias and begin case class def" +
    +      " defined elsif end ensure false in module next nil not or redo rescue " +
    +      "retry self super then true undef unless until when yield BEGIN END ";
    +  var SH_KEYWORDS = FLOW_CONTROL_KEYWORDS + "case done elif esac eval fi " +
    +      "function in local set then until ";
    +  var ALL_KEYWORDS = (
    +      CPP_KEYWORDS + CSHARP_KEYWORDS + JSCRIPT_KEYWORDS + PERL_KEYWORDS +
    +      PYTHON_KEYWORDS + RUBY_KEYWORDS + SH_KEYWORDS);
    +
    +  // token style names.  correspond to css classes
    +  /** token style for a string literal */
    +  var PR_STRING = 'str';
    +  /** token style for a keyword */
    +  var PR_KEYWORD = 'kwd';
    +  /** token style for a comment */
    +  var PR_COMMENT = 'com';
    +  /** token style for a type */
    +  var PR_TYPE = 'typ';
    +  /** token style for a literal value.  e.g. 1, null, true. */
    +  var PR_LITERAL = 'lit';
    +  /** token style for a punctuation string. */
    +  var PR_PUNCTUATION = 'pun';
    +  /** token style for a punctuation string. */
    +  var PR_PLAIN = 'pln';
    +
    +  /** token style for an sgml tag. */
    +  var PR_TAG = 'tag';
    +  /** token style for a markup declaration such as a DOCTYPE. */
    +  var PR_DECLARATION = 'dec';
    +  /** token style for embedded source. */
    +  var PR_SOURCE = 'src';
    +  /** token style for an sgml attribute name. */
    +  var PR_ATTRIB_NAME = 'atn';
    +  /** token style for an sgml attribute value. */
    +  var PR_ATTRIB_VALUE = 'atv';
    +
    +  /**
    +   * A class that indicates a section of markup that is not code, e.g. to allow
    +   * embedding of line numbers within code listings.
    +   */
    +  var PR_NOCODE = 'nocode';
    +
    +  /** A set of tokens that can precede a regular expression literal in
    +    * javascript.
    +    * http://www.mozilla.org/js/language/js20/rationale/syntax.html has the full
    +    * list, but I've removed ones that might be problematic when seen in
    +    * languages that don't support regular expression literals.
    +    *
    +    * <p>Specifically, I've removed any keywords that can't precede a regexp
    +    * literal in a syntactically legal javascript program, and I've removed the
    +    * "in" keyword since it's not a keyword in many languages, and might be used
    +    * as a count of inches.
    +    *
    +    * <p>The link a above does not accurately describe EcmaScript rules since
    +    * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
    +    * very well in practice.
    +    *
    +    * @private
    +    */
    +  var REGEXP_PRECEDER_PATTERN = function () {
    +      var preceders = [
    +          "!", "!=", "!==", "#", "%", "%=", "&", "&&", "&&=",
    +          "&=", "(", "*", "*=", /* "+", */ "+=", ",", /* "-", */ "-=",
    +          "->", /*".", "..", "...", handled below */ "/", "/=", ":", "::", ";",
    +          "<", "<<", "<<=", "<=", "=", "==", "===", ">",
    +          ">=", ">>", ">>=", ">>>", ">>>=", "?", "@", "[",
    +          "^", "^=", "^^", "^^=", "{", "|", "|=", "||",
    +          "||=", "~" /* handles =~ and !~ */,
    +          "break", "case", "continue", "delete",
    +          "do", "else", "finally", "instanceof",
    +          "return", "throw", "try", "typeof"
    +          ];
    +      var pattern = '(?:^^|[+-]';
    +      for (var i = 0; i < preceders.length; ++i) {
    +        pattern += '|' + preceders[i].replace(/([^=<>:&a-z])/g, '\\$1');
    +      }
    +      pattern += ')\\s*';  // matches at end, and matches empty string
    +      return pattern;
    +      // CAVEAT: this does not properly handle the case where a regular
    +      // expression immediately follows another since a regular expression may
    +      // have flags for case-sensitivity and the like.  Having regexp tokens
    +      // adjacent is not valid in any language I'm aware of, so I'm punting.
    +      // TODO: maybe style special characters inside a regexp as punctuation.
    +    }();
    +
    +  // Define regexps here so that the interpreter doesn't have to create an
    +  // object each time the function containing them is called.
    +  // The language spec requires a new object created even if you don't access
    +  // the $1 members.
    +  var pr_amp = /&/g;
    +  var pr_lt = /</g;
    +  var pr_gt = />/g;
    +  var pr_quot = /\"/g;
    +  /** like textToHtml but escapes double quotes to be attribute safe. */
    +  function attribToHtml(str) {
    +    return str.replace(pr_amp, '&amp;')
    +        .replace(pr_lt, '&lt;')
    +        .replace(pr_gt, '&gt;')
    +        .replace(pr_quot, '&quot;');
    +  }
    +
    +  /** escapest html special characters to html. */
    +  function textToHtml(str) {
    +    return str.replace(pr_amp, '&amp;')
    +        .replace(pr_lt, '&lt;')
    +        .replace(pr_gt, '&gt;');
    +  }
    +
    +
    +  var pr_ltEnt = /&lt;/g;
    +  var pr_gtEnt = /&gt;/g;
    +  var pr_aposEnt = /&apos;/g;
    +  var pr_quotEnt = /&quot;/g;
    +  var pr_ampEnt = /&amp;/g;
    +  var pr_nbspEnt = /&nbsp;/g;
    +  /** unescapes html to plain text. */
    +  function htmlToText(html) {
    +    var pos = html.indexOf('&');
    +    if (pos < 0) { return html; }
    +    // Handle numeric entities specially.  We can't use functional substitution
    +    // since that doesn't work in older versions of Safari.
    +    // These should be rare since most browsers convert them to normal chars.
    +    for (--pos; (pos = html.indexOf('&#', pos + 1)) >= 0;) {
    +      var end = html.indexOf(';', pos);
    +      if (end >= 0) {
    +        var num = html.substring(pos + 3, end);
    +        var radix = 10;
    +        if (num && num.charAt(0) === 'x') {
    +          num = num.substring(1);
    +          radix = 16;
    +        }
    +        var codePoint = parseInt(num, radix);
    +        if (!isNaN(codePoint)) {
    +          html = (html.substring(0, pos) + String.fromCharCode(codePoint) +
    +                  html.substring(end + 1));
    +        }
    +      }
    +    }
    +
    +    return html.replace(pr_ltEnt, '<')
    +        .replace(pr_gtEnt, '>')
    +        .replace(pr_aposEnt, "'")
    +        .replace(pr_quotEnt, '"')
    +        .replace(pr_nbspEnt, ' ')
    +        .replace(pr_ampEnt, '&');
    +  }
    +
    +  /** is the given node's innerHTML normally unescaped? */
    +  function isRawContent(node) {
    +    return 'XMP' === node.tagName;
    +  }
    +
    +  var newlineRe = /[\r\n]/g;
    +  /**
    +   * Are newlines and adjacent spaces significant in the given node's innerHTML?
    +   */
    +  function isPreformatted(node, content) {
    +    // PRE means preformatted, and is a very common case, so don't create
    +    // unnecessary computed style objects.
    +    if ('PRE' === node.tagName) { return true; }
    +    if (!newlineRe.test(content)) { return true; }  // Don't care
    +    var whitespace = '';
    +    // For disconnected nodes, IE has no currentStyle.
    +    if (node.currentStyle) {
    +      whitespace = node.currentStyle.whiteSpace;
    +    } else if (window.getComputedStyle) {
    +      // Firefox makes a best guess if node is disconnected whereas Safari
    +      // returns the empty string.
    +      whitespace = window.getComputedStyle(node, null).whiteSpace;
    +    }
    +    return !whitespace || whitespace === 'pre';
    +  }
    +
    +  function normalizedHtml(node, out, opt_sortAttrs) {
    +    switch (node.nodeType) {
    +      case 1:  // an element
    +        var name = node.tagName.toLowerCase();
    +
    +        out.push('<', name);
    +        var attrs = node.attributes;
    +        var n = attrs.length;
    +        if (n) {
    +          if (opt_sortAttrs) {
    +            var sortedAttrs = [];
    +            for (var i = n; --i >= 0;) { sortedAttrs[i] = attrs[i]; }
    +            sortedAttrs.sort(function (a, b) {
    +                return (a.name < b.name) ? -1 : a.name === b.name ? 0 : 1;
    +              });
    +            attrs = sortedAttrs;
    +          }
    +          for (var i = 0; i < n; ++i) {
    +            var attr = attrs[i];
    +            if (!attr.specified) { continue; }
    +            out.push(' ', attr.name.toLowerCase(),
    +                     '="', attribToHtml(attr.value), '"');
    +          }
    +        }
    +        out.push('>');
    +        for (var child = node.firstChild; child; child = child.nextSibling) {
    +          normalizedHtml(child, out, opt_sortAttrs);
    +        }
    +        if (node.firstChild || !/^(?:br|link|img)$/.test(name)) {
    +          out.push('<\/', name, '>');
    +        }
    +        break;
    +      case 3: case 4: // text
    +        out.push(textToHtml(node.nodeValue));
    +        break;
    +    }
    +  }
    +
    +  /**
    +   * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
    +   * matches the union o the sets o strings matched d by the input RegExp.
    +   * Since it matches globally, if the input strings have a start-of-input
    +   * anchor (/^.../), it is ignored for the purposes of unioning.
    +   * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
    +   * @return {RegExp} a global regex.
    +   */
    +  function combinePrefixPatterns(regexs) {
    +    var capturedGroupIndex = 0;
    +
    +    var needToFoldCase = false;
    +    var ignoreCase = false;
    +    for (var i = 0, n = regexs.length; i < n; ++i) {
    +      var regex = regexs[i];
    +      if (regex.ignoreCase) {
    +        ignoreCase = true;
    +      } else if (/[a-z]/i.test(regex.source.replace(
    +                     /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
    +        needToFoldCase = true;
    +        ignoreCase = false;
    +        break;
    +      }
    +    }
    +
    +    function decodeEscape(charsetPart) {
    +      if (charsetPart.charAt(0) !== '\\') { return charsetPart.charCodeAt(0); }
    +      switch (charsetPart.charAt(1)) {
    +        case 'b': return 8;
    +        case 't': return 9;
    +        case 'n': return 0xa;
    +        case 'v': return 0xb;
    +        case 'f': return 0xc;
    +        case 'r': return 0xd;
    +        case 'u': case 'x':
    +          return parseInt(charsetPart.substring(2), 16)
    +              || charsetPart.charCodeAt(1);
    +        case '0': case '1': case '2': case '3': case '4':
    +        case '5': case '6': case '7':
    +          return parseInt(charsetPart.substring(1), 8);
    +        default: return charsetPart.charCodeAt(1);
    +      }
    +    }
    +
    +    function encodeEscape(charCode) {
    +      if (charCode < 0x20) {
    +        return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
    +      }
    +      var ch = String.fromCharCode(charCode);
    +      if (ch === '\\' || ch === '-' || ch === '[' || ch === ']') {
    +        ch = '\\' + ch;
    +      }
    +      return ch;
    +    }
    +
    +    function caseFoldCharset(charSet) {
    +      var charsetParts = charSet.substring(1, charSet.length - 1).match(
    +          new RegExp(
    +              '\\\\u[0-9A-Fa-f]{4}'
    +              + '|\\\\x[0-9A-Fa-f]{2}'
    +              + '|\\\\[0-3][0-7]{0,2}'
    +              + '|\\\\[0-7]{1,2}'
    +              + '|\\\\[\\s\\S]'
    +              + '|-'
    +              + '|[^-\\\\]',
    +              'g'));
    +      var groups = [];
    +      var ranges = [];
    +      var inverse = charsetParts[0] === '^';
    +      for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
    +        var p = charsetParts[i];
    +        switch (p) {
    +          case '\\B': case '\\b':
    +          case '\\D': case '\\d':
    +          case '\\S': case '\\s':
    +          case '\\W': case '\\w':
    +            groups.push(p);
    +            continue;
    +        }
    +        var start = decodeEscape(p);
    +        var end;
    +        if (i + 2 < n && '-' === charsetParts[i + 1]) {
    +          end = decodeEscape(charsetParts[i + 2]);
    +          i += 2;
    +        } else {
    +          end = start;
    +        }
    +        ranges.push([start, end]);
    +        // If the range might intersect letters, then expand it.
    +        if (!(end < 65 || start > 122)) {
    +          if (!(end < 65 || start > 90)) {
    +            ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
    +          }
    +          if (!(end < 97 || start > 122)) {
    +            ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
    +          }
    +        }
    +      }
    +
    +      // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
    +      // -> [[1, 12], [14, 14], [16, 17]]
    +      ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1]  - a[1]); });
    +      var consolidatedRanges = [];
    +      var lastRange = [NaN, NaN];
    +      for (var i = 0; i < ranges.length; ++i) {
    +        var range = ranges[i];
    +        if (range[0] <= lastRange[1] + 1) {
    +          lastRange[1] = Math.max(lastRange[1], range[1]);
    +        } else {
    +          consolidatedRanges.push(lastRange = range);
    +        }
    +      }
    +
    +      var out = ['['];
    +      if (inverse) { out.push('^'); }
    +      out.push.apply(out, groups);
    +      for (var i = 0; i < consolidatedRanges.length; ++i) {
    +        var range = consolidatedRanges[i];
    +        out.push(encodeEscape(range[0]));
    +        if (range[1] > range[0]) {
    +          if (range[1] + 1 > range[0]) { out.push('-'); }
    +          out.push(encodeEscape(range[1]));
    +        }
    +      }
    +      out.push(']');
    +      return out.join('');
    +    }
    +
    +    function allowAnywhereFoldCaseAndRenumberGroups(regex) {
    +      // Split into character sets, escape sequences, punctuation strings
    +      // like ('(', '(?:', ')', '^'), and runs of characters that do not
    +      // include any of the above.
    +      var parts = regex.source.match(
    +          new RegExp(
    +              '(?:'
    +              + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'  // a character set
    +              + '|\\\\u[A-Fa-f0-9]{4}'  // a unicode escape
    +              + '|\\\\x[A-Fa-f0-9]{2}'  // a hex escape
    +              + '|\\\\[0-9]+'  // a back-reference or octal escape
    +              + '|\\\\[^ux0-9]'  // other escape sequence
    +              + '|\\(\\?[:!=]'  // start of a non-capturing group
    +              + '|[\\(\\)\\^]'  // start/emd of a group, or line start
    +              + '|[^\\x5B\\x5C\\(\\)\\^]+'  // run of other characters
    +              + ')',
    +              'g'));
    +      var n = parts.length;
    +
    +      // Maps captured group numbers to the number they will occupy in
    +      // the output or to -1 if that has not been determined, or to
    +      // undefined if they need not be capturing in the output.
    +      var capturedGroups = [];
    +
    +      // Walk over and identify back references to build the capturedGroups
    +      // mapping.
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        var p = parts[i];
    +        if (p === '(') {
    +          // groups are 1-indexed, so max group index is count of '('
    +          ++groupIndex;
    +        } else if ('\\' === p.charAt(0)) {
    +          var decimalValue = +p.substring(1);
    +          if (decimalValue && decimalValue <= groupIndex) {
    +            capturedGroups[decimalValue] = -1;
    +          }
    +        }
    +      }
    +
    +      // Renumber groups and reduce capturing groups to non-capturing groups
    +      // where possible.
    +      for (var i = 1; i < capturedGroups.length; ++i) {
    +        if (-1 === capturedGroups[i]) {
    +          capturedGroups[i] = ++capturedGroupIndex;
    +        }
    +      }
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        var p = parts[i];
    +        if (p === '(') {
    +          ++groupIndex;
    +          if (capturedGroups[groupIndex] === undefined) {
    +            parts[i] = '(?:';
    +          }
    +        } else if ('\\' === p.charAt(0)) {
    +          var decimalValue = +p.substring(1);
    +          if (decimalValue && decimalValue <= groupIndex) {
    +            parts[i] = '\\' + capturedGroups[groupIndex];
    +          }
    +        }
    +      }
    +
    +      // Remove any prefix anchors so that the output will match anywhere.
    +      // ^^ really does mean an anchored match though.
    +      for (var i = 0, groupIndex = 0; i < n; ++i) {
    +        if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
    +      }
    +
    +      // Expand letters to groupts to handle mixing of case-sensitive and
    +      // case-insensitive patterns if necessary.
    +      if (regex.ignoreCase && needToFoldCase) {
    +        for (var i = 0; i < n; ++i) {
    +          var p = parts[i];
    +          var ch0 = p.charAt(0);
    +          if (p.length >= 2 && ch0 === '[') {
    +            parts[i] = caseFoldCharset(p);
    +          } else if (ch0 !== '\\') {
    +            // TODO: handle letters in numeric escapes.
    +            parts[i] = p.replace(
    +                /[a-zA-Z]/g,
    +                function (ch) {
    +                  var cc = ch.charCodeAt(0);
    +                  return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
    +                });
    +          }
    +        }
    +      }
    +
    +      return parts.join('');
    +    }
    +
    +    var rewritten = [];
    +    for (var i = 0, n = regexs.length; i < n; ++i) {
    +      var regex = regexs[i];
    +      if (regex.global || regex.multiline) { throw new Error('' + regex); }
    +      rewritten.push(
    +          '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
    +    }
    +
    +    return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
    +  }
    +
    +  var PR_innerHtmlWorks = null;
    +  function getInnerHtml(node) {
    +    // inner html is hopelessly broken in Safari 2.0.4 when the content is
    +    // an html description of well formed XML and the containing tag is a PRE
    +    // tag, so we detect that case and emulate innerHTML.
    +    if (null === PR_innerHtmlWorks) {
    +      var testNode = document.createElement('PRE');
    +      testNode.appendChild(
    +          document.createTextNode('<!DOCTYPE foo PUBLIC "foo bar">\n<foo />'));
    +      PR_innerHtmlWorks = !/</.test(testNode.innerHTML);
    +    }
    +
    +    if (PR_innerHtmlWorks) {
    +      var content = node.innerHTML;
    +      // XMP tags contain unescaped entities so require special handling.
    +      if (isRawContent(node)) {
    +        content = textToHtml(content);
    +      } else if (!isPreformatted(node, content)) {
    +        content = content.replace(/(<br\s*\/?>)[\r\n]+/g, '$1')
    +            .replace(/(?:[\r\n]+[ \t]*)+/g, ' ');
    +      }
    +      return content;
    +    }
    +
    +    var out = [];
    +    for (var child = node.firstChild; child; child = child.nextSibling) {
    +      normalizedHtml(child, out);
    +    }
    +    return out.join('');
    +  }
    +
    +  /** returns a function that expand tabs to spaces.  This function can be fed
    +    * successive chunks of text, and will maintain its own internal state to
    +    * keep track of how tabs are expanded.
    +    * @return {function (string) : string} a function that takes
    +    *   plain text and return the text with tabs expanded.
    +    * @private
    +    */
    +  function makeTabExpander(tabWidth) {
    +    var SPACES = '                ';
    +    var charInLine = 0;
    +
    +    return function (plainText) {
    +      // walk over each character looking for tabs and newlines.
    +      // On tabs, expand them.  On newlines, reset charInLine.
    +      // Otherwise increment charInLine
    +      var out = null;
    +      var pos = 0;
    +      for (var i = 0, n = plainText.length; i < n; ++i) {
    +        var ch = plainText.charAt(i);
    +
    +        switch (ch) {
    +          case '\t':
    +            if (!out) { out = []; }
    +            out.push(plainText.substring(pos, i));
    +            // calculate how much space we need in front of this part
    +            // nSpaces is the amount of padding -- the number of spaces needed
    +            // to move us to the next column, where columns occur at factors of
    +            // tabWidth.
    +            var nSpaces = tabWidth - (charInLine % tabWidth);
    +            charInLine += nSpaces;
    +            for (; nSpaces >= 0; nSpaces -= SPACES.length) {
    +              out.push(SPACES.substring(0, nSpaces));
    +            }
    +            pos = i + 1;
    +            break;
    +          case '\n':
    +            charInLine = 0;
    +            break;
    +          default:
    +            ++charInLine;
    +        }
    +      }
    +      if (!out) { return plainText; }
    +      out.push(plainText.substring(pos));
    +      return out.join('');
    +    };
    +  }
    +
    +  var pr_chunkPattern = new RegExp(
    +      '[^<]+'  // A run of characters other than '<'
    +      + '|<\!--[\\s\\S]*?--\>'  // an HTML comment
    +      + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>'  // a CDATA section
    +      // a probable tag that should not be highlighted
    +      + '|<\/?[a-zA-Z](?:[^>\"\']|\'[^\']*\'|\"[^\"]*\")*>'
    +      + '|<',  // A '<' that does not begin a larger chunk
    +      'g');
    +  var pr_commentPrefix = /^<\!--/;
    +  var pr_cdataPrefix = /^<!\[CDATA\[/;
    +  var pr_brPrefix = /^<br\b/i;
    +  var pr_tagNameRe = /^<(\/?)([a-zA-Z][a-zA-Z0-9]*)/;
    +
    +  /** split markup into chunks of html tags (style null) and
    +    * plain text (style {@link #PR_PLAIN}), converting tags which are
    +    * significant for tokenization (<br>) into their textual equivalent.
    +    *
    +    * @param {string} s html where whitespace is considered significant.
    +    * @return {Object} source code and extracted tags.
    +    * @private
    +    */
    +  function extractTags(s) {
    +    // since the pattern has the 'g' modifier and defines no capturing groups,
    +    // this will return a list of all chunks which we then classify and wrap as
    +    // PR_Tokens
    +    var matches = s.match(pr_chunkPattern);
    +    var sourceBuf = [];
    +    var sourceBufLen = 0;
    +    var extractedTags = [];
    +    if (matches) {
    +      for (var i = 0, n = matches.length; i < n; ++i) {
    +        var match = matches[i];
    +        if (match.length > 1 && match.charAt(0) === '<') {
    +          if (pr_commentPrefix.test(match)) { continue; }
    +          if (pr_cdataPrefix.test(match)) {
    +            // strip CDATA prefix and suffix.  Don't unescape since it's CDATA
    +            sourceBuf.push(match.substring(9, match.length - 3));
    +            sourceBufLen += match.length - 12;
    +          } else if (pr_brPrefix.test(match)) {
    +            // <br> tags are lexically significant so convert them to text.
    +            // This is undone later.
    +            sourceBuf.push('\n');
    +            ++sourceBufLen;
    +          } else {
    +            if (match.indexOf(PR_NOCODE) >= 0 && isNoCodeTag(match)) {
    +              // A <span class="nocode"> will start a section that should be
    +              // ignored.  Continue walking the list until we see a matching end
    +              // tag.
    +              var name = match.match(pr_tagNameRe)[2];
    +              var depth = 1;
    +              var j;
    +              end_tag_loop:
    +              for (j = i + 1; j < n; ++j) {
    +                var name2 = matches[j].match(pr_tagNameRe);
    +                if (name2 && name2[2] === name) {
    +                  if (name2[1] === '/') {
    +                    if (--depth === 0) { break end_tag_loop; }
    +                  } else {
    +                    ++depth;
    +                  }
    +                }
    +              }
    +              if (j < n) {
    +                extractedTags.push(
    +                    sourceBufLen, matches.slice(i, j + 1).join(''));
    +                i = j;
    +              } else {  // Ignore unclosed sections.
    +                extractedTags.push(sourceBufLen, match);
    +              }
    +            } else {
    +              extractedTags.push(sourceBufLen, match);
    +            }
    +          }
    +        } else {
    +          var literalText = htmlToText(match);
    +          sourceBuf.push(literalText);
    +          sourceBufLen += literalText.length;
    +        }
    +      }
    +    }
    +    return { source: sourceBuf.join(''), tags: extractedTags };
    +  }
    +
    +  /** True if the given tag contains a class attribute with the nocode class. */
    +  function isNoCodeTag(tag) {
    +    return !!tag
    +        // First canonicalize the representation of attributes
    +        .replace(/\s(\w+)\s*=\s*(?:\"([^\"]*)\"|'([^\']*)'|(\S+))/g,
    +                 ' $1="$2$3$4"')
    +        // Then look for the attribute we want.
    +        .match(/[cC][lL][aA][sS][sS]=\"[^\"]*\bnocode\b/);
    +  }
    +
    +  /**
    +   * Apply the given language handler to sourceCode and add the resulting
    +   * decorations to out.
    +   * @param {number} basePos the index of sourceCode within the chunk of source
    +   *    whose decorations are already present on out.
    +   */
    +  function appendDecorations(basePos, sourceCode, langHandler, out) {
    +    if (!sourceCode) { return; }
    +    var job = {
    +      source: sourceCode,
    +      basePos: basePos
    +    };
    +    langHandler(job);
    +    out.push.apply(out, job.decorations);
    +  }
    +
    +  /** Given triples of [style, pattern, context] returns a lexing function,
    +    * The lexing function interprets the patterns to find token boundaries and
    +    * returns a decoration list of the form
    +    * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
    +    * where index_n is an index into the sourceCode, and style_n is a style
    +    * constant like PR_PLAIN.  index_n-1 <= index_n, and style_n-1 applies to
    +    * all characters in sourceCode[index_n-1:index_n].
    +    *
    +    * The stylePatterns is a list whose elements have the form
    +    * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
    +    *
    +    * Style is a style constant like PR_PLAIN, or can be a string of the
    +    * form 'lang-FOO', where FOO is a language extension describing the
    +    * language of the portion of the token in $1 after pattern executes.
    +    * E.g., if style is 'lang-lisp', and group 1 contains the text
    +    * '(hello (world))', then that portion of the token will be passed to the
    +    * registered lisp handler for formatting.
    +    * The text before and after group 1 will be restyled using this decorator
    +    * so decorators should take care that this doesn't result in infinite
    +    * recursion.  For example, the HTML lexer rule for SCRIPT elements looks
    +    * something like ['lang-js', /<[s]cript>(.+?)<\/script>/].  This may match
    +    * '<script>foo()<\/script>', which would cause the current decorator to
    +    * be called with '<script>' which would not match the same rule since
    +    * group 1 must not be empty, so it would be instead styled as PR_TAG by
    +    * the generic tag rule.  The handler registered for the 'js' extension would
    +    * then be called with 'foo()', and finally, the current decorator would
    +    * be called with '<\/script>' which would not match the original rule and
    +    * so the generic tag rule would identify it as a tag.
    +    *
    +    * Pattern must only match prefixes, and if it matches a prefix, then that
    +    * match is considered a token with the same style.
    +    *
    +    * Context is applied to the last non-whitespace, non-comment token
    +    * recognized.
    +    *
    +    * Shortcut is an optional string of characters, any of which, if the first
    +    * character, gurantee that this pattern and only this pattern matches.
    +    *
    +    * @param {Array} shortcutStylePatterns patterns that always start with
    +    *   a known character.  Must have a shortcut string.
    +    * @param {Array} fallthroughStylePatterns patterns that will be tried in
    +    *   order if the shortcut ones fail.  May have shortcuts.
    +    *
    +    * @return {function (Object)} a
    +    *   function that takes source code and returns a list of decorations.
    +    */
    +  function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
    +    var shortcuts = {};
    +    var tokenizer;
    +    (function () {
    +      var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
    +      var allRegexs = [];
    +      var regexKeys = {};
    +      for (var i = 0, n = allPatterns.length; i < n; ++i) {
    +        var patternParts = allPatterns[i];
    +        var shortcutChars = patternParts[3];
    +        if (shortcutChars) {
    +          for (var c = shortcutChars.length; --c >= 0;) {
    +            shortcuts[shortcutChars.charAt(c)] = patternParts;
    +          }
    +        }
    +        var regex = patternParts[1];
    +        var k = '' + regex;
    +        if (!regexKeys.hasOwnProperty(k)) {
    +          allRegexs.push(regex);
    +          regexKeys[k] = null;
    +        }
    +      }
    +      allRegexs.push(/[\0-\uffff]/);
    +      tokenizer = combinePrefixPatterns(allRegexs);
    +    })();
    +
    +    var nPatterns = fallthroughStylePatterns.length;
    +    var notWs = /\S/;
    +
    +    /**
    +     * Lexes job.source and produces an output array job.decorations of style
    +     * classes preceded by the position at which they start in job.source in
    +     * order.
    +     *
    +     * @param {Object} job an object like {@code
    +     *    source: {string} sourceText plain text,
    +     *    basePos: {int} position of job.source in the larger chunk of
    +     *        sourceCode.
    +     * }
    +     */
    +    var decorate = function (job) {
    +      var sourceCode = job.source, basePos = job.basePos;
    +      /** Even entries are positions in source in ascending order.  Odd enties
    +        * are style markers (e.g., PR_COMMENT) that run from that position until
    +        * the end.
    +        * @type {Array.<number|string>}
    +        */
    +      var decorations = [basePos, PR_PLAIN];
    +      var pos = 0;  // index into sourceCode
    +      var tokens = sourceCode.match(tokenizer) || [];
    +      var styleCache = {};
    +
    +      for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
    +        var token = tokens[ti];
    +        var style = styleCache[token];
    +        var match = void 0;
    +
    +        var isEmbedded;
    +        if (typeof style === 'string') {
    +          isEmbedded = false;
    +        } else {
    +          var patternParts = shortcuts[token.charAt(0)];
    +          if (patternParts) {
    +            match = token.match(patternParts[1]);
    +            style = patternParts[0];
    +          } else {
    +            for (var i = 0; i < nPatterns; ++i) {
    +              patternParts = fallthroughStylePatterns[i];
    +              match = token.match(patternParts[1]);
    +              if (match) {
    +                style = patternParts[0];
    +                break;
    +              }
    +            }
    +
    +            if (!match) {  // make sure that we make progress
    +              style = PR_PLAIN;
    +            }
    +          }
    +
    +          isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
    +          if (isEmbedded && !(match && typeof match[1] === 'string')) {
    +            isEmbedded = false;
    +            style = PR_SOURCE;
    +          }
    +
    +          if (!isEmbedded) { styleCache[token] = style; }
    +        }
    +
    +        var tokenStart = pos;
    +        pos += token.length;
    +
    +        if (!isEmbedded) {
    +          decorations.push(basePos + tokenStart, style);
    +        } else {  // Treat group 1 as an embedded block of source code.
    +          var embeddedSource = match[1];
    +          var embeddedSourceStart = token.indexOf(embeddedSource);
    +          var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
    +          if (match[2]) {
    +            // If embeddedSource can be blank, then it would match at the
    +            // beginning which would cause us to infinitely recurse on the
    +            // entire token, so we catch the right context in match[2].
    +            embeddedSourceEnd = token.length - match[2].length;
    +            embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
    +          }
    +          var lang = style.substring(5);
    +          // Decorate the left of the embedded source
    +          appendDecorations(
    +              basePos + tokenStart,
    +              token.substring(0, embeddedSourceStart),
    +              decorate, decorations);
    +          // Decorate the embedded source
    +          appendDecorations(
    +              basePos + tokenStart + embeddedSourceStart,
    +              embeddedSource,
    +              langHandlerForExtension(lang, embeddedSource),
    +              decorations);
    +          // Decorate the right of the embedded section
    +          appendDecorations(
    +              basePos + tokenStart + embeddedSourceEnd,
    +              token.substring(embeddedSourceEnd),
    +              decorate, decorations);
    +        }
    +      }
    +      job.decorations = decorations;
    +    };
    +    return decorate;
    +  }
    +
    +  /** returns a function that produces a list of decorations from source text.
    +    *
    +    * This code treats ", ', and ` as string delimiters, and \ as a string
    +    * escape.  It does not recognize perl's qq() style strings.
    +    * It has no special handling for double delimiter escapes as in basic, or
    +    * the tripled delimiters used in python, but should work on those regardless
    +    * although in those cases a single string literal may be broken up into
    +    * multiple adjacent string literals.
    +    *
    +    * It recognizes C, C++, and shell style comments.
    +    *
    +    * @param {Object} options a set of optional parameters.
    +    * @return {function (Object)} a function that examines the source code
    +    *     in the input job and builds the decoration list.
    +    */
    +  function sourceDecorator(options) {
    +    var shortcutStylePatterns = [], fallthroughStylePatterns = [];
    +    if (options['tripleQuotedStrings']) {
    +      // '''multi-line-string''', 'single-line-string', and double-quoted
    +      shortcutStylePatterns.push(
    +          [PR_STRING,  /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
    +           null, '\'"']);
    +    } else if (options['multiLineStrings']) {
    +      // 'multi-line-string', "multi-line-string"
    +      shortcutStylePatterns.push(
    +          [PR_STRING,  /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
    +           null, '\'"`']);
    +    } else {
    +      // 'single-line-string', "single-line-string"
    +      shortcutStylePatterns.push(
    +          [PR_STRING,
    +           /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
    +           null, '"\'']);
    +    }
    +    if (options['verbatimStrings']) {
    +      // verbatim-string-literal production from the C# grammar.  See issue 93.
    +      fallthroughStylePatterns.push(
    +          [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
    +    }
    +    if (options['hashComments']) {
    +      if (options['cStyleComments']) {
    +        // Stop C preprocessor declarations at an unclosed open comment
    +        shortcutStylePatterns.push(
    +            [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
    +             null, '#']);
    +        fallthroughStylePatterns.push(
    +            [PR_STRING,
    +             /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,
    +             null]);
    +      } else {
    +        shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
    +      }
    +    }
    +    if (options['cStyleComments']) {
    +      fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
    +      fallthroughStylePatterns.push(
    +          [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
    +    }
    +    if (options['regexLiterals']) {
    +      var REGEX_LITERAL = (
    +          // A regular expression literal starts with a slash that is
    +          // not followed by * or / so that it is not confused with
    +          // comments.
    +          '/(?=[^/*])'
    +          // and then contains any number of raw characters,
    +          + '(?:[^/\\x5B\\x5C]'
    +          // escape sequences (\x5C),
    +          +    '|\\x5C[\\s\\S]'
    +          // or non-nesting character sets (\x5B\x5D);
    +          +    '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
    +          // finally closed by a /.
    +          + '/');
    +      fallthroughStylePatterns.push(
    +          ['lang-regex',
    +           new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
    +           ]);
    +    }
    +
    +    var keywords = options['keywords'].replace(/^\s+|\s+$/g, '');
    +    if (keywords.length) {
    +      fallthroughStylePatterns.push(
    +          [PR_KEYWORD,
    +           new RegExp('^(?:' + keywords.replace(/\s+/g, '|') + ')\\b'), null]);
    +    }
    +
    +    shortcutStylePatterns.push([PR_PLAIN,       /^\s+/, null, ' \r\n\t\xA0']);
    +    fallthroughStylePatterns.push(
    +        // TODO(mikesamuel): recognize non-latin letters and numerals in idents
    +        [PR_LITERAL,     /^@[a-z_$][a-z_$@0-9]*/i, null],
    +        [PR_TYPE,        /^@?[A-Z]+[a-z][A-Za-z_$@0-9]*/, null],
    +        [PR_PLAIN,       /^[a-z_$][a-z_$@0-9]*/i, null],
    +        [PR_LITERAL,
    +         new RegExp(
    +             '^(?:'
    +             // A hex number
    +             + '0x[a-f0-9]+'
    +             // or an octal or decimal number,
    +             + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
    +             // possibly in scientific notation
    +             + '(?:e[+\\-]?\\d+)?'
    +             + ')'
    +             // with an optional modifier like UL for unsigned long
    +             + '[a-z]*', 'i'),
    +         null, '0123456789'],
    +        [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#]*/, null]);
    +
    +    return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
    +  }
    +
    +  var decorateSource = sourceDecorator({
    +        'keywords': ALL_KEYWORDS,
    +        'hashComments': true,
    +        'cStyleComments': true,
    +        'multiLineStrings': true,
    +        'regexLiterals': true
    +      });
    +
    +  /** Breaks {@code job.source} around style boundaries in
    +    * {@code job.decorations} while re-interleaving {@code job.extractedTags},
    +    * and leaves the result in {@code job.prettyPrintedHtml}.
    +    * @param {Object} job like {
    +    *    source: {string} source as plain text,
    +    *    extractedTags: {Array.<number|string>} extractedTags chunks of raw
    +    *                   html preceded by their position in {@code job.source}
    +    *                   in order
    +    *    decorations: {Array.<number|string} an array of style classes preceded
    +    *                 by the position at which they start in job.source in order
    +    * }
    +    * @private
    +    */
    +  function recombineTagsAndDecorations(job) {
    +    var sourceText = job.source;
    +    var extractedTags = job.extractedTags;
    +    var decorations = job.decorations;
    +
    +    var html = [];
    +    // index past the last char in sourceText written to html
    +    var outputIdx = 0;
    +
    +    var openDecoration = null;
    +    var currentDecoration = null;
    +    var tagPos = 0;  // index into extractedTags
    +    var decPos = 0;  // index into decorations
    +    var tabExpander = makeTabExpander(window['PR_TAB_WIDTH']);
    +
    +    var adjacentSpaceRe = /([\r\n ]) /g;
    +    var startOrSpaceRe = /(^| ) /gm;
    +    var newlineRe = /\r\n?|\n/g;
    +    var trailingSpaceRe = /[ \r\n]$/;
    +    var lastWasSpace = true;  // the last text chunk emitted ended with a space.
    +
    +    // See bug 71 and http://stackoverflow.com/questions/136443/why-doesnt-ie7-
    +    var isIE678 = window['_pr_isIE6']();
    +    var lineBreakHtml = (
    +        isIE678
    +        ? (job.sourceNode.tagName === 'PRE'
    +           // Use line feeds instead of <br>s so that copying and pasting works
    +           // on IE.
    +           // Doing this on other browsers breaks lots of stuff since \r\n is
    +           // treated as two newlines on Firefox.
    +           ? (isIE678 === 6 ? '&#160;\r\n' :
    +              isIE678 === 7 ? '&#160;<br>\r' : '&#160;\r')
    +           // IE collapses multiple adjacent <br>s into 1 line break.
    +           // Prefix every newline with '&#160;' to prevent such behavior.
    +           // &nbsp; is the same as &#160; but works in XML as well as HTML.
    +           : '&#160;<br />')
    +        : '<br />');
    +
    +    // Look for a class like linenums or linenums:<n> where <n> is the 1-indexed
    +    // number of the first line.
    +    var numberLines = job.sourceNode.className.match(/\blinenums\b(?::(\d+))?/);
    +    var lineBreaker;
    +    if (numberLines) {
    +      var lineBreaks = [];
    +      for (var i = 0; i < 10; ++i) {
    +        lineBreaks[i] = lineBreakHtml + '</li><li class="L' + i + '">';
    +      }
    +      var lineNum = numberLines[1] && numberLines[1].length 
    +          ? numberLines[1] - 1 : 0;  // Lines are 1-indexed
    +      html.push('<ol class="linenums"><li class="L', (lineNum) % 10, '"');
    +      if (lineNum) {
    +        html.push(' value="', lineNum + 1, '"');
    +      }
    +      html.push('>');
    +      lineBreaker = function () {
    +        var lb = lineBreaks[++lineNum % 10];
    +        // If a decoration is open, we need to close it before closing a list-item
    +        // and reopen it on the other side of the list item.
    +        return openDecoration
    +            ? ('</span>' + lb + '<span class="' + openDecoration + '">') : lb;
    +      };
    +    } else {
    +      lineBreaker = lineBreakHtml;
    +    }
    +
    +    // A helper function that is responsible for opening sections of decoration
    +    // and outputing properly escaped chunks of source
    +    function emitTextUpTo(sourceIdx) {
    +      if (sourceIdx > outputIdx) {
    +        if (openDecoration && openDecoration !== currentDecoration) {
    +          // Close the current decoration
    +          html.push('</span>');
    +          openDecoration = null;
    +        }
    +        if (!openDecoration && currentDecoration) {
    +          openDecoration = currentDecoration;
    +          html.push('<span class="', openDecoration, '">');
    +        }
    +        // This interacts badly with some wikis which introduces paragraph tags
    +        // into pre blocks for some strange reason.
    +        // It's necessary for IE though which seems to lose the preformattedness
    +        // of <pre> tags when their innerHTML is assigned.
    +        // http://stud3.tuwien.ac.at/~e0226430/innerHtmlQuirk.html
    +        // and it serves to undo the conversion of <br>s to newlines done in
    +        // chunkify.
    +        var htmlChunk = textToHtml(
    +            tabExpander(sourceText.substring(outputIdx, sourceIdx)))
    +            .replace(lastWasSpace
    +                     ? startOrSpaceRe
    +                     : adjacentSpaceRe, '$1&#160;');
    +        // Keep track of whether we need to escape space at the beginning of the
    +        // next chunk.
    +        lastWasSpace = trailingSpaceRe.test(htmlChunk);
    +        html.push(htmlChunk.replace(newlineRe, lineBreaker));
    +        outputIdx = sourceIdx;
    +      }
    +    }
    +
    +    while (true) {
    +      // Determine if we're going to consume a tag this time around.  Otherwise
    +      // we consume a decoration or exit.
    +      var outputTag;
    +      if (tagPos < extractedTags.length) {
    +        if (decPos < decorations.length) {
    +          // Pick one giving preference to extractedTags since we shouldn't open
    +          // a new style that we're going to have to immediately close in order
    +          // to output a tag.
    +          outputTag = extractedTags[tagPos] <= decorations[decPos];
    +        } else {
    +          outputTag = true;
    +        }
    +      } else {
    +        outputTag = false;
    +      }
    +      // Consume either a decoration or a tag or exit.
    +      if (outputTag) {
    +        emitTextUpTo(extractedTags[tagPos]);
    +        if (openDecoration) {
    +          // Close the current decoration
    +          html.push('</span>');
    +          openDecoration = null;
    +        }
    +        html.push(extractedTags[tagPos + 1]);
    +        tagPos += 2;
    +      } else if (decPos < decorations.length) {
    +        emitTextUpTo(decorations[decPos]);
    +        currentDecoration = decorations[decPos + 1];
    +        decPos += 2;
    +      } else {
    +        break;
    +      }
    +    }
    +    emitTextUpTo(sourceText.length);
    +    if (openDecoration) {
    +      html.push('</span>');
    +    }
    +    if (numberLines) { html.push('</li></ol>'); }
    +    job.prettyPrintedHtml = html.join('');
    +  }
    +
    +  /** Maps language-specific file extensions to handlers. */
    +  var langHandlerRegistry = {};
    +  /** Register a language handler for the given file extensions.
    +    * @param {function (Object)} handler a function from source code to a list
    +    *      of decorations.  Takes a single argument job which describes the
    +    *      state of the computation.   The single parameter has the form
    +    *      {@code {
    +    *        source: {string} as plain text.
    +    *        decorations: {Array.<number|string>} an array of style classes
    +    *                     preceded by the position at which they start in
    +    *                     job.source in order.
    +    *                     The language handler should assigned this field.
    +    *        basePos: {int} the position of source in the larger source chunk.
    +    *                 All positions in the output decorations array are relative
    +    *                 to the larger source chunk.
    +    *      } }
    +    * @param {Array.<string>} fileExtensions
    +    */
    +  function registerLangHandler(handler, fileExtensions) {
    +    for (var i = fileExtensions.length; --i >= 0;) {
    +      var ext = fileExtensions[i];
    +      if (!langHandlerRegistry.hasOwnProperty(ext)) {
    +        langHandlerRegistry[ext] = handler;
    +      } else if ('console' in window) {
    +        console['warn']('cannot override language handler %s', ext);
    +      }
    +    }
    +  }
    +  function langHandlerForExtension(extension, source) {
    +    if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
    +      // Treat it as markup if the first non whitespace character is a < and
    +      // the last non-whitespace character is a >.
    +      extension = /^\s*</.test(source)
    +          ? 'default-markup'
    +          : 'default-code';
    +    }
    +    return langHandlerRegistry[extension];
    +  }
    +  registerLangHandler(decorateSource, ['default-code']);
    +  registerLangHandler(
    +      createSimpleLexer(
    +          [],
    +          [
    +           [PR_PLAIN,       /^[^<?]+/],
    +           [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
    +           [PR_COMMENT,     /^<\!--[\s\S]*?(?:-\->|$)/],
    +           // Unescaped content in an unknown language
    +           ['lang-',        /^<\?([\s\S]+?)(?:\?>|$)/],
    +           ['lang-',        /^<%([\s\S]+?)(?:%>|$)/],
    +           [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
    +           ['lang-',        /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
    +           // Unescaped content in javascript.  (Or possibly vbscript).
    +           ['lang-js',      /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
    +           // Contains unescaped stylesheet content
    +           ['lang-css',     /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
    +           ['lang-in.tag',  /^(<\/?[a-z][^<>]*>)/i]
    +          ]),
    +      ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
    +  registerLangHandler(
    +      createSimpleLexer(
    +          [
    +           [PR_PLAIN,        /^[\s]+/, null, ' \t\r\n'],
    +           [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
    +           ],
    +          [
    +           [PR_TAG,          /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
    +           [PR_ATTRIB_NAME,  /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
    +           ['lang-uq.val',   /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
    +           [PR_PUNCTUATION,  /^[=<>\/]+/],
    +           ['lang-js',       /^on\w+\s*=\s*\"([^\"]+)\"/i],
    +           ['lang-js',       /^on\w+\s*=\s*\'([^\']+)\'/i],
    +           ['lang-js',       /^on\w+\s*=\s*([^\"\'>\s]+)/i],
    +           ['lang-css',      /^style\s*=\s*\"([^\"]+)\"/i],
    +           ['lang-css',      /^style\s*=\s*\'([^\']+)\'/i],
    +           ['lang-css',      /^style\s*=\s*([^\"\'>\s]+)/i]
    +           ]),
    +      ['in.tag']);
    +  registerLangHandler(
    +      createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': CPP_KEYWORDS,
    +          'hashComments': true,
    +          'cStyleComments': true
    +        }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': 'null true false'
    +        }), ['json']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': CSHARP_KEYWORDS,
    +          'hashComments': true,
    +          'cStyleComments': true,
    +          'verbatimStrings': true
    +        }), ['cs']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': JAVA_KEYWORDS,
    +          'cStyleComments': true
    +        }), ['java']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': SH_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true
    +        }), ['bsh', 'csh', 'sh']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': PYTHON_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'tripleQuotedStrings': true
    +        }), ['cv', 'py']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': PERL_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'regexLiterals': true
    +        }), ['perl', 'pl', 'pm']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': RUBY_KEYWORDS,
    +          'hashComments': true,
    +          'multiLineStrings': true,
    +          'regexLiterals': true
    +        }), ['rb']);
    +  registerLangHandler(sourceDecorator({
    +          'keywords': JSCRIPT_KEYWORDS,
    +          'cStyleComments': true,
    +          'regexLiterals': true
    +        }), ['js']);
    +  registerLangHandler(
    +      createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
    +
    +  function applyDecorator(job) {
    +    var sourceCodeHtml = job.sourceCodeHtml;
    +    var opt_langExtension = job.langExtension;
    +
    +    // Prepopulate output in case processing fails with an exception.
    +    job.prettyPrintedHtml = sourceCodeHtml;
    +
    +    try {
    +      // Extract tags, and convert the source code to plain text.
    +      var sourceAndExtractedTags = extractTags(sourceCodeHtml);
    +      /** Plain text. @type {string} */
    +      var source = sourceAndExtractedTags.source;
    +      job.source = source;
    +      job.basePos = 0;
    +
    +      /** Even entries are positions in source in ascending order.  Odd entries
    +        * are tags that were extracted at that position.
    +        * @type {Array.<number|string>}
    +        */
    +      job.extractedTags = sourceAndExtractedTags.tags;
    +
    +      // Apply the appropriate language handler
    +      langHandlerForExtension(opt_langExtension, source)(job);
    +      // Integrate the decorations and tags back into the source code to produce
    +      // a decorated html string which is left in job.prettyPrintedHtml.
    +      recombineTagsAndDecorations(job);
    +    } catch (e) {
    +      if ('console' in window) {
    +        console['log'](e && e['stack'] ? e['stack'] : e);
    +      }
    +    }
    +  }
    +
    +  function prettyPrintOne(sourceCodeHtml, opt_langExtension) {
    +    var job = {
    +      sourceCodeHtml: sourceCodeHtml,
    +      langExtension: opt_langExtension
    +    };
    +    applyDecorator(job);
    +    return job.prettyPrintedHtml;
    +  }
    +
    +  function prettyPrint(opt_whenDone) {
    +    function byTagName(tn) { return document.getElementsByTagName(tn); }
    +    // fetch a list of nodes to rewrite
    +    var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
    +    var elements = [];
    +    for (var i = 0; i < codeSegments.length; ++i) {
    +      for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
    +        elements.push(codeSegments[i][j]);
    +      }
    +    }
    +    codeSegments = null;
    +
    +    var clock = Date;
    +    if (!clock['now']) {
    +      clock = { 'now': function () { return (new Date).getTime(); } };
    +    }
    +
    +    // The loop is broken into a series of continuations to make sure that we
    +    // don't make the browser unresponsive when rewriting a large page.
    +    var k = 0;
    +    var prettyPrintingJob;
    +
    +    function doWork() {
    +      var endTime = (window['PR_SHOULD_USE_CONTINUATION'] ?
    +                     clock.now() + 250 /* ms */ :
    +                     Infinity);
    +      for (; k < elements.length && clock.now() < endTime; k++) {
    +        var cs = elements[k];
    +        // [JACOCO] 'prettyprint' -> 'source' 
    +        if (cs.className && cs.className.indexOf('source') >= 0) {
    +          // If the classes includes a language extensions, use it.
    +          // Language extensions can be specified like
    +          //     <pre class="prettyprint lang-cpp">
    +          // the language extension "cpp" is used to find a language handler as
    +          // passed to PR_registerLangHandler.
    +          var langExtension = cs.className.match(/\blang-(\w+)\b/);
    +          if (langExtension) { langExtension = langExtension[1]; }
    +
    +          // make sure this is not nested in an already prettified element
    +          var nested = false;
    +          for (var p = cs.parentNode; p; p = p.parentNode) {
    +            if ((p.tagName === 'pre' || p.tagName === 'code' ||
    +                 p.tagName === 'xmp') &&
    +                // [JACOCO] 'prettyprint' -> 'source' 
    +                p.className && p.className.indexOf('source') >= 0) {
    +              nested = true;
    +              break;
    +            }
    +          }
    +          if (!nested) {
    +            // fetch the content as a snippet of properly escaped HTML.
    +            // Firefox adds newlines at the end.
    +            var content = getInnerHtml(cs);
    +            content = content.replace(/(?:\r\n?|\n)$/, '');
    +
    +            // do the pretty printing
    +            prettyPrintingJob = {
    +              sourceCodeHtml: content,
    +              langExtension: langExtension,
    +              sourceNode: cs
    +            };
    +            applyDecorator(prettyPrintingJob);
    +            replaceWithPrettyPrintedHtml();
    +          }
    +        }
    +      }
    +      if (k < elements.length) {
    +        // finish up in a continuation
    +        setTimeout(doWork, 250);
    +      } else if (opt_whenDone) {
    +        opt_whenDone();
    +      }
    +    }
    +
    +    function replaceWithPrettyPrintedHtml() {
    +      var newContent = prettyPrintingJob.prettyPrintedHtml;
    +      if (!newContent) { return; }
    +      var cs = prettyPrintingJob.sourceNode;
    +
    +      // push the prettified html back into the tag.
    +      if (!isRawContent(cs)) {
    +        // just replace the old html with the new
    +        cs.innerHTML = newContent;
    +      } else {
    +        // we need to change the tag to a <pre> since <xmp>s do not allow
    +        // embedded tags such as the span tags used to attach styles to
    +        // sections of source code.
    +        var pre = document.createElement('PRE');
    +        for (var i = 0; i < cs.attributes.length; ++i) {
    +          var a = cs.attributes[i];
    +          if (a.specified) {
    +            var aname = a.name.toLowerCase();
    +            if (aname === 'class') {
    +              pre.className = a.value;  // For IE 6
    +            } else {
    +              pre.setAttribute(a.name, a.value);
    +            }
    +          }
    +        }
    +        pre.innerHTML = newContent;
    +
    +        // remove the old
    +        cs.parentNode.replaceChild(pre, cs);
    +        cs = pre;
    +      }
    +    }
    +
    +    doWork();
    +  }
    +
    +  window['PR_normalizedHtml'] = normalizedHtml;
    +  window['prettyPrintOne'] = prettyPrintOne;
    +  window['prettyPrint'] = prettyPrint;
    +  window['PR'] = {
    +        'combinePrefixPatterns': combinePrefixPatterns,
    +        'createSimpleLexer': createSimpleLexer,
    +        'registerLangHandler': registerLangHandler,
    +        'sourceDecorator': sourceDecorator,
    +        'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
    +        'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
    +        'PR_COMMENT': PR_COMMENT,
    +        'PR_DECLARATION': PR_DECLARATION,
    +        'PR_KEYWORD': PR_KEYWORD,
    +        'PR_LITERAL': PR_LITERAL,
    +        'PR_NOCODE': PR_NOCODE,
    +        'PR_PLAIN': PR_PLAIN,
    +        'PR_PUNCTUATION': PR_PUNCTUATION,
    +        'PR_SOURCE': PR_SOURCE,
    +        'PR_STRING': PR_STRING,
    +        'PR_TAG': PR_TAG,
    +        'PR_TYPE': PR_TYPE
    +      };
    +})();
    diff --git a/build/reports/jacoco/test/html/jacoco-resources/redbar.gif b/build/reports/jacoco/test/html/jacoco-resources/redbar.gif
    new file mode 100644
    index 00000000..c2f71469
    Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/redbar.gif differ
    diff --git a/build/reports/jacoco/test/html/jacoco-resources/report.css b/build/reports/jacoco/test/html/jacoco-resources/report.css
    new file mode 100644
    index 00000000..08eba792
    --- /dev/null
    +++ b/build/reports/jacoco/test/html/jacoco-resources/report.css
    @@ -0,0 +1,243 @@
    +body, td {
    +  font-family:sans-serif;
    +  font-size:10pt;
    +}
    +
    +h1 {
    +  font-weight:bold;
    +  font-size:18pt;
    +}
    +
    +.breadcrumb {
    +  border:#d6d3ce 1px solid;
    +  padding:2px 4px 2px 4px;
    +}
    +
    +.breadcrumb .info {
    +  float:right;
    +}
    +
    +.breadcrumb .info a {
    +  margin-left:8px;
    +}
    +
    +.el_report {
    +  padding-left:18px;
    +  background-image:url(report.gif);
    +  background-position:left center;
    +  background-repeat:no-repeat;
    +}
    +
    +.el_group {
    +  padding-left:18px;
    +  background-image:url(group.gif);
    +  background-position:left center;
    +  background-repeat:no-repeat;
    +}
    +
    +.el_bundle {
    +  padding-left:18px;
    +  background-image:url(bundle.gif);
    +  background-position:left center;
    +  background-repeat:no-repeat;
    +}
    +
    +.el_package {
    +  padding-left:18px;
    +  background-image:url(package.gif);
    +  background-position:left center;
    +  background-repeat:no-repeat;
    +}
    +
    +.el_class {
    +  padding-left:18px;
    +  background-image:url(class.gif);
    +  background-position:left center;
    +  background-repeat:no-repeat;
    +}
    +
    +.el_source {
    +  padding-left:18px;
    +  background-image:url(source.gif);
    +  background-position:left center;
    +  background-repeat:no-repeat;
    +}
    +
    +.el_method {
    +  padding-left:18px;
    +  background-image:url(method.gif);
    +  background-position:left center;
    +  background-repeat:no-repeat;
    +}
    +
    +.el_session {
    +  padding-left:18px;
    +  background-image:url(session.gif);
    +  background-position:left center;
    +  background-repeat:no-repeat;
    +}
    +
    +pre.source {
    +  border:#d6d3ce 1px solid;
    +  font-family:monospace;
    +}
    +
    +pre.source ol {
    +  margin-bottom: 0px;
    +  margin-top: 0px;
    +}
    +
    +pre.source li {
    +  border-left: 1px solid #D6D3CE;
    +  color: #A0A0A0;
    +  padding-left: 0px;
    +}
    +
    +pre.source span.fc {
    +  background-color:#ccffcc;
    +}
    +
    +pre.source span.nc {
    +  background-color:#ffaaaa;
    +}
    +
    +pre.source span.pc {
    +  background-color:#ffffcc;
    +}
    +
    +pre.source span.bfc {
    +  background-image: url(branchfc.gif);
    +  background-repeat: no-repeat;
    +  background-position: 2px center;
    +}
    +
    +pre.source span.bfc:hover {
    +  background-color:#80ff80;
    +}
    +
    +pre.source span.bnc {
    +  background-image: url(branchnc.gif);
    +  background-repeat: no-repeat;
    +  background-position: 2px center;
    +}
    +
    +pre.source span.bnc:hover {
    +  background-color:#ff8080;
    +}
    +
    +pre.source span.bpc {
    +  background-image: url(branchpc.gif);
    +  background-repeat: no-repeat;
    +  background-position: 2px center;
    +}
    +
    +pre.source span.bpc:hover {
    +  background-color:#ffff80;
    +}
    +
    +table.coverage {
    +  empty-cells:show;
    +  border-collapse:collapse; 
    +}
    +
    +table.coverage thead {
    +  background-color:#e0e0e0;
    +}
    +
    +table.coverage thead td {
    +  white-space:nowrap;
    +  padding:2px 14px 0px 6px;
    +  border-bottom:#b0b0b0 1px solid;
    +}
    +
    +table.coverage thead td.bar {
    +  border-left:#cccccc 1px solid;
    +}
    +
    +table.coverage thead td.ctr1 {
    +  text-align:right;
    +  border-left:#cccccc 1px solid;
    +}
    +
    +table.coverage thead td.ctr2 {
    +  text-align:right;
    +  padding-left:2px;
    +}
    +
    +table.coverage thead td.sortable {
    +  cursor:pointer;
    +  background-image:url(sort.gif);
    +  background-position:right center;
    +  background-repeat:no-repeat;
    +}
    +
    +table.coverage thead td.up {
    +  background-image:url(up.gif);
    +}
    +
    +table.coverage thead td.down {
    +  background-image:url(down.gif);
    +}
    +
    +table.coverage tbody td {
    +  white-space:nowrap;
    +  padding:2px 6px 2px 6px;
    +  border-bottom:#d6d3ce 1px solid;
    +}
    +
    +table.coverage tbody tr:hover { 
    +  background: #f0f0d0 !important;
    +}
    +
    +table.coverage tbody td.bar {
    +  border-left:#e8e8e8 1px solid;
    +}
    +
    +table.coverage tbody td.ctr1 {
    +  text-align:right;
    +  padding-right:14px;
    +  border-left:#e8e8e8 1px solid;
    +}
    +
    +table.coverage tbody td.ctr2 {
    +  text-align:right;
    +  padding-right:14px;
    +  padding-left:2px;
    +}
    +
    +table.coverage tfoot td {
    +  white-space:nowrap;
    +  padding:2px 6px 2px 6px;
    +}
    +
    +table.coverage tfoot td.bar {
    +  border-left:#e8e8e8 1px solid;
    +}
    +
    +table.coverage tfoot td.ctr1 {
    +  text-align:right;
    +  padding-right:14px;
    +  border-left:#e8e8e8 1px solid;
    +}
    +
    +table.coverage tfoot td.ctr2 {
    +  text-align:right;
    +  padding-right:14px;
    +  padding-left:2px;
    +}
    +
    +.footer {
    +  margin-top:20px;
    +  border-top:#d6d3ce 1px solid;
    +  padding-top:2px;
    +  font-size:8pt;
    +  color:#a0a0a0;
    +}
    +
    +.footer a {
    +  color:#a0a0a0;
    +}
    +
    +.right {
    +  float:right;
    +}
    diff --git a/build/reports/jacoco/test/html/jacoco-resources/report.gif b/build/reports/jacoco/test/html/jacoco-resources/report.gif
    new file mode 100644
    index 00000000..8547be50
    Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/report.gif differ
    diff --git a/build/reports/jacoco/test/html/jacoco-resources/session.gif b/build/reports/jacoco/test/html/jacoco-resources/session.gif
    new file mode 100644
    index 00000000..0151bad8
    Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/session.gif differ
    diff --git a/build/reports/jacoco/test/html/jacoco-resources/sort.gif b/build/reports/jacoco/test/html/jacoco-resources/sort.gif
    new file mode 100644
    index 00000000..6757c2c3
    Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/sort.gif differ
    diff --git a/build/reports/jacoco/test/html/jacoco-resources/sort.js b/build/reports/jacoco/test/html/jacoco-resources/sort.js
    new file mode 100644
    index 00000000..da41c0b7
    --- /dev/null
    +++ b/build/reports/jacoco/test/html/jacoco-resources/sort.js
    @@ -0,0 +1,147 @@
    +/*******************************************************************************
    + * Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors
    + * All rights reserved. This program and the accompanying materials
    + * are made available under the terms of the Eclipse Public License v1.0
    + * which accompanies this distribution, and is available at
    + * http://www.eclipse.org/legal/epl-v10.html
    + *
    + * Contributors:
    + *    Marc R. Hoffmann - initial API and implementation
    + *    
    + *******************************************************************************/
    +
    +(function () {
    +
    +  /**
    +   * Sets the initial sorting derived from the hash.
    +   *
    +   * @param linkelementids
    +   *          list of element ids to search for links to add sort inidcator
    +   *          hash links   
    +   */  
    +  function initialSort(linkelementids) {
    +    window.linkelementids = linkelementids;
    +    var hash = window.location.hash;
    +    if (hash) {
    +      var m = hash.match(/up-./);
    +      if (m) {
    +        var header = window.document.getElementById(m[0].charAt(3));
    +        if (header) {
    +          sortColumn(header, true);
    +        }
    +        return;
    +      }
    +      var m = hash.match(/dn-./);
    +      if (m) {
    +        var header = window.document.getElementById(m[0].charAt(3));
    +        if (header) {
    +          sortColumn(header, false);
    +        }
    +        return
    +      }
    +    }
    +  }
    +
    +  /**
    +   * Sorts the columns with the given header dependening on the current sort state.
    +   */  
    +  function toggleSort(header) {
    +    var sortup = header.className.indexOf('down ') == 0;
    +    sortColumn(header, sortup);
    +  }
    +
    +  /**
    +   * Sorts the columns with the given header in the given direction.
    +   */  
    +  function sortColumn(header, sortup) {
    +    var table = header.parentNode.parentNode.parentNode;
    +    var body = table.tBodies[0];
    +    var colidx = getNodePosition(header);
    +    
    +    resetSortedStyle(table);
    +    
    +    var rows = body.rows;
    +    var sortedrows = [];
    +    for (var i = 0; i < rows.length; i++) {
    +      r = rows[i];
    +      sortedrows[parseInt(r.childNodes[colidx].id.slice(1))] = r;
    +    }
    +    
    +    var hash;
    +    
    +    if (sortup) {
    +      for (var i = sortedrows.length - 1; i >= 0; i--) {
    +        body.appendChild(sortedrows[i]);
    +      }
    +      header.className = 'up ' + header.className;
    +      hash = 'up-' + header.id;
    +    } else {
    +      for (var i = 0; i < sortedrows.length; i++) {
    +        body.appendChild(sortedrows[i]);
    +      }
    +      header.className = 'down ' + header.className;
    +      hash = 'dn-' + header.id;
    +    }
    +    
    +    setHash(hash);
    +  }
    +
    +  /**
    +   * Adds the sort indicator as a hash to the document URL and all links.
    +   */
    +  function setHash(hash) {
    +    window.document.location.hash = hash;
    +    ids = window.linkelementids;
    +    for (var i = 0; i < ids.length; i++) {
    +        setHashOnAllLinks(document.getElementById(ids[i]), hash);
    +    }
    +  }
    +
    +  /**
    +   * Extend all links within the given tag with the given hash.
    +   */
    +  function setHashOnAllLinks(tag, hash) {
    +    links = tag.getElementsByTagName("a");
    +    for (var i = 0; i < links.length; i++) {
    +        var a = links[i];
    +        var href = a.href;
    +        var hashpos = href.indexOf("#");
    +        if (hashpos != -1) {
    +            href = href.substring(0, hashpos);
    +        } 
    +        a.href = href + "#" + hash;
    +    }
    +  }
    +
    +  /**
    +   * Calculates the position of a element within its parent.
    +   */  
    +  function getNodePosition(element) {
    +    var pos = -1;
    +    while (element) {
    +      element = element.previousSibling;
    +      pos++;
    +    }
    +    return pos;
    +  }
    +
    +  /**
    +   * Remove the sorting indicator style from all headers.
    +   */
    +  function resetSortedStyle(table) {
    +    for (var c = table.tHead.firstChild.firstChild; c; c = c.nextSibling) {
    +      if (c.className) {
    +        if (c.className.indexOf('down ') == 0) {
    +          c.className = c.className.slice(5);
    +        }
    +        if (c.className.indexOf('up ') == 0) {
    +          c.className = c.className.slice(3);
    +        }
    +      }
    +    }
    +  }
    +  
    +  window['initialSort'] = initialSort;
    +  window['toggleSort'] = toggleSort;
    +
    +})();
    \ No newline at end of file
    diff --git a/build/reports/jacoco/test/html/jacoco-resources/source.gif b/build/reports/jacoco/test/html/jacoco-resources/source.gif
    new file mode 100644
    index 00000000..b226e41c
    Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/source.gif differ
    diff --git a/build/reports/jacoco/test/html/jacoco-resources/up.gif b/build/reports/jacoco/test/html/jacoco-resources/up.gif
    new file mode 100644
    index 00000000..58ed2166
    Binary files /dev/null and b/build/reports/jacoco/test/html/jacoco-resources/up.gif differ
    diff --git a/build/reports/jacoco/test/html/jacoco-sessions.html b/build/reports/jacoco/test/html/jacoco-sessions.html
    new file mode 100644
    index 00000000..b22f1eac
    --- /dev/null
    +++ b/build/reports/jacoco/test/html/jacoco-sessions.html
    @@ -0,0 +1 @@
    +<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" lang="en"><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/><link rel="stylesheet" href="jacoco-resources/report.css" type="text/css"/><link rel="shortcut icon" href="jacoco-resources/report.gif" type="image/gif"/><title>Sessions</title></head><body><div class="breadcrumb" id="breadcrumb"><span class="info"><a href="jacoco-sessions.html" class="el_session">Sessions</a></span><a href="index.html" class="el_report">terraform-pipeline</a> &gt; <span class="el_session">Sessions</span></div><h1>Sessions</h1><p>This coverage report is based on execution data from the following sessions:</p><table class="coverage" cellspacing="0"><thead><tr><td>Session</td><td>Start Time</td><td>Dump Time</td></tr></thead><tbody><tr><td><span class="el_session">kmanning-laptop-1a7223e3</span></td><td>Mar 4, 2019 3:18:01 PM</td><td>Mar 4, 2019 3:18:04 PM</td></tr></tbody></table><p>Execution data for the following classes is considered in this report:</p><table class="coverage" cellspacing="0"><thead><tr><td>Class</td><td>Id</td></tr></thead><tbody><tr><td><a href="default/AnsiColorPlugin.html" class="el_class">AnsiColorPlugin</a></td><td><code>871f96e3e86b7e79</code></td></tr><tr><td><span class="el_class">AnsiColorPlugin.init</span></td><td><code>24ef7047d04aafcb</code></td></tr><tr><td><span class="el_class">AnsiColorPluginTest</span></td><td><code>b4a719c7e6b6052b</code></td></tr><tr><td><span class="el_class">AnsiColorPluginTest.Init</span></td><td><code>99709d8211def00b</code></td></tr><tr><td><a href="default/AwssumePlugin.html" class="el_class">AwssumePlugin</a></td><td><code>569f10d85ebca43f</code></td></tr><tr><td><span class="el_class">AwssumePlugin.init</span></td><td><code>500f50d634c39f79</code></td></tr><tr><td><span class="el_class">AwssumePluginTest</span></td><td><code>543fdcaf45d6b5ed</code></td></tr><tr><td><span class="el_class">AwssumePluginTest.Apply</span></td><td><code>3dbefd75c2e34ddf</code></td></tr><tr><td><span class="el_class">AwssumePluginTest.Init</span></td><td><code>a80d785ab437185b</code></td></tr><tr><td><span class="el_class">ConditionApplyPluginTest</span></td><td><code>83dd3e00ffdc18f0</code></td></tr><tr><td><a href="default/ConditionalApplyPlugin.html" class="el_class">ConditionalApplyPlugin</a></td><td><code>124d5887dc4ff0bc</code></td></tr><tr><td><a href="default/ConditionalApplyPlugin$_onlyOnBranch_closure1.html" class="el_class">ConditionalApplyPlugin._onlyOnBranch_closure1</a></td><td><code>92f16c40a424d4e5</code></td></tr><tr><td><a href="default/ConfirmApplyPlugin.html" class="el_class">ConfirmApplyPlugin</a></td><td><code>ec80e4f80885f645</code></td></tr><tr><td><a href="default/ConfirmApplyPlugin$_addConfirmation_closure1.html" class="el_class">ConfirmApplyPlugin._addConfirmation_closure1</a></td><td><code>566ed61908c1dbf9</code></td></tr><tr><td><span class="el_class">ConfirmApplyPluginTest</span></td><td><code>5d8157b8c2cf74cf</code></td></tr><tr><td><a href="default/ConsulBackendPlugin.html" class="el_class">ConsulBackendPlugin</a></td><td><code>9ab0e0eeececd490</code></td></tr><tr><td><a href="default/ConsulBackendPlugin$_getBackendPath_closure1.html" class="el_class">ConsulBackendPlugin._getBackendPath_closure1</a></td><td><code>fa11b01ea4cf0b89</code></td></tr><tr><td><span class="el_class">ConsulBackendPlugin.init</span></td><td><code>6f4e453830f52c78</code></td></tr><tr><td><span class="el_class">ConsulBackendPluginTest</span></td><td><code>5c9bd3923fc1468f</code></td></tr><tr><td><span class="el_class">ConsulBackendPluginTest.Apply</span></td><td><code>b533e7511dc25f73</code></td></tr><tr><td><span class="el_class">ConsulBackendPluginTest.Apply.AddressBackendParameter</span></td><td><code>55d465fa2fea0127</code></td></tr><tr><td><span class="el_class">ConsulBackendPluginTest.Apply.PathBackendParameter</span></td><td><code>5ce21ff9dedd5b0b</code></td></tr><tr><td><span class="el_class">ConsulBackendPluginTest.Apply.PathBackendParameter._isAddedAndUsesCustomizablePattern_closure1</span></td><td><code>7f95c1ba79d34af6</code></td></tr><tr><td><span class="el_class">ConsulBackendPluginTest.Init</span></td><td><code>f3e42548a55a8293</code></td></tr><tr><td><a href="default/CrqPlugin.html" class="el_class">CrqPlugin</a></td><td><code>5aed3f0fe35900b5</code></td></tr><tr><td><span class="el_class">CrqPlugin.init</span></td><td><code>9563197bfbf7832b</code></td></tr><tr><td><span class="el_class">CrqPluginTest</span></td><td><code>2c55b2ec4d818c5f</code></td></tr><tr><td><span class="el_class">CrqPluginTest.Init</span></td><td><code>019e8dd307e1f227</code></td></tr><tr><td><a href="default/DefaultEnvironmentPlugin.html" class="el_class">DefaultEnvironmentPlugin</a></td><td><code>b22bcdbc21ccc067</code></td></tr><tr><td><a href="default/DefaultEnvironmentPlugin$_addEnvironmentTerraformVariable_closure1.html" class="el_class">DefaultEnvironmentPlugin._addEnvironmentTerraformVariable_closure1</a></td><td><code>8a4d42b64b9b8f96</code></td></tr><tr><td><span class="el_class">DefaultEnvironmentPluginTest</span></td><td><code>f7ebdb4e94551977</code></td></tr><tr><td><span class="el_class">DefaultEnvironmentPluginTest.Init</span></td><td><code>6dcd5f55bf264fa8</code></td></tr><tr><td><a href="default/FileParametersPlugin.html" class="el_class">FileParametersPlugin</a></td><td><code>71850f60393577a7</code></td></tr><tr><td><a href="default/FileParametersPlugin$_getVariables_closure2.html" class="el_class">FileParametersPlugin._getVariables_closure2</a></td><td><code>d767c74cb959e1b4</code></td></tr><tr><td><span class="el_class">FileParametersPlugin.getVariables.0</span></td><td><code>1c319f3144a8be9d</code></td></tr><tr><td><span class="el_class">FileParametersPlugin.init</span></td><td><code>740498760ee26c7f</code></td></tr><tr><td><span class="el_class">FileParametersPluginTest</span></td><td><code>3e6cc0926152ef78</code></td></tr><tr><td><span class="el_class">FileParametersPluginTest.GetVariables</span></td><td><code>7c2bb3f471030075</code></td></tr><tr><td><span class="el_class">FileParametersPluginTest.Init</span></td><td><code>ff8c813611d33bfb</code></td></tr><tr><td><span class="el_class">JenkinsFileTest</span></td><td><code>7db263628b6de5d9</code></td></tr><tr><td><span class="el_class">JenkinsFileTest.GetNodeName</span></td><td><code>8548166d98a9d55b</code></td></tr><tr><td><span class="el_class">JenkinsFileTest.ParseScmUrl</span></td><td><code>d11efcea432abc98</code></td></tr><tr><td><span class="el_class">JenkinsFileTest.ParseScmUrl.WithHttpUrl</span></td><td><code>00b5bec607522dd5</code></td></tr><tr><td><span class="el_class">JenkinsFileTest.ParseScmUrl.WithHttpUrl.WithHttp</span></td><td><code>4393b66650e3a321</code></td></tr><tr><td><span class="el_class">JenkinsFileTest.ParseScmUrl.WithHttpUrl.WithHttps</span></td><td><code>beb410725b639e36</code></td></tr><tr><td><span class="el_class">JenkinsFileTest.ParseScmUrl.WithSshUrl</span></td><td><code>0fd0a561c6620df2</code></td></tr><tr><td><a href="default/Jenkinsfile.html" class="el_class">Jenkinsfile</a></td><td><code>cbe2a0df78799636</code></td></tr><tr><td><span class="el_class">Jenkinsfile..EnhancerByMockitoWithCGLIB..e71b9567</span></td><td><code>112b078d20d88700</code></td></tr><tr><td><span class="el_class">Jenkinsfile.getNodeName.2</span></td><td><code>0a3ae4853c63e2b4</code></td></tr><tr><td><span class="el_class">Jenkinsfile.getOrganization.0</span></td><td><code>12802295e8dfc8a4</code></td></tr><tr><td><span class="el_class">Jenkinsfile.getRepoName.1</span></td><td><code>3cb2f821ee98db06</code></td></tr><tr><td><span class="el_class">Jenkinsfile.getStandardizedRepoSlug</span></td><td><code>d8970146297e1bf1</code></td></tr><tr><td><a href="default/ParameterStoreBuildWrapperPlugin.html" class="el_class">ParameterStoreBuildWrapperPlugin</a></td><td><code>81a5cd2bd7e9f41b</code></td></tr><tr><td><span class="el_class">ParameterStoreBuildWrapperPlugin.init</span></td><td><code>254dd1218c41e770</code></td></tr><tr><td><span class="el_class">ParameterStoreBuildWrapperPlugin.pathForEnvironment.0</span></td><td><code>a77b941c2c965324</code></td></tr><tr><td><span class="el_class">ParameterStoreBuildWrapperPluginTest</span></td><td><code>4a35fdf46133be70</code></td></tr><tr><td><span class="el_class">ParameterStoreBuildWrapperPluginTest.Init</span></td><td><code>b37fe3bffa372b2e</code></td></tr><tr><td><span class="el_class">ParameterStoreBuildWrapperPluginTest.PathForEnvironment</span></td><td><code>b33de2e9d3d4411c</code></td></tr><tr><td><a href="default/ParameterStoreExecPlugin.html" class="el_class">ParameterStoreExecPlugin</a></td><td><code>119325c1801dfc2b</code></td></tr><tr><td><span class="el_class">ParameterStoreExecPlugin.init</span></td><td><code>7d17e676df7e9d1d</code></td></tr><tr><td><span class="el_class">ParameterStoreExecPlugin.pathForEnvironment.0</span></td><td><code>9eb23917e8cf210b</code></td></tr><tr><td><span class="el_class">ParameterStoreExecPluginTest</span></td><td><code>7dd4f699485f1273</code></td></tr><tr><td><span class="el_class">ParameterStoreExecPluginTest.Apply</span></td><td><code>9bb8c1f79cf5adde</code></td></tr><tr><td><span class="el_class">ParameterStoreExecPluginTest.Init</span></td><td><code>7d755b0e17cde772</code></td></tr><tr><td><span class="el_class">ParameterStoreExecPluginTest.PathForEnvironment</span></td><td><code>0b25e5972cdaf272</code></td></tr><tr><td><a href="default/S3BackendPlugin.html" class="el_class">S3BackendPlugin</a></td><td><code>cca7833bd40c0d74</code></td></tr><tr><td><span class="el_class">S3BackendPlugin.init</span></td><td><code>ffdbc561929fa365</code></td></tr><tr><td><span class="el_class">S3BackendPluginTest</span></td><td><code>5142f9ff17f13ca9</code></td></tr><tr><td><span class="el_class">S3BackendPluginTest.Apply</span></td><td><code>e188fb3bf891fc16</code></td></tr><tr><td><span class="el_class">S3BackendPluginTest.Init</span></td><td><code>b3c29ce1641a9758</code></td></tr><tr><td><a href="default/TerraformApplyCommand.html" class="el_class">TerraformApplyCommand</a></td><td><code>c6e5faeeb00bfe52</code></td></tr><tr><td><span class="el_class">TerraformApplyCommand.addPlugin</span></td><td><code>2792240c0baa9c65</code></td></tr><tr><td><span class="el_class">TerraformApplyCommand.getEnvironment.2</span></td><td><code>1d840e750f3ffcc2</code></td></tr><tr><td><span class="el_class">TerraformApplyCommand.getPlugins.1</span></td><td><code>0bcd73f415fbea80</code></td></tr><tr><td><span class="el_class">TerraformApplyCommand.resetPlugins.0</span></td><td><code>5907a40c6660a07c</code></td></tr><tr><td><span class="el_class">TerraformApplyCommand.toString.3</span></td><td><code>faf90d16ae9e4bad</code></td></tr><tr><td><span class="el_class">TerraformApplyCommand.withPrefix.4</span></td><td><code>ee76ef3cce00029b</code></td></tr><tr><td><span class="el_class">TerraformApplyCommandPlugin.apply</span></td><td><code>0d9cdac6dceb54da</code></td></tr><tr><td><a href="default/TerraformEnvironmentStage.html" class="el_class">TerraformEnvironmentStage</a></td><td><code>4b93f9edd25d9db6</code></td></tr><tr><td><a href="default/TerraformEnvironmentStage$_decorate_closure4.html" class="el_class">TerraformEnvironmentStage._decorate_closure4</a></td><td><code>378bbee4c2b4177d</code></td></tr><tr><td><a href="default/TerraformEnvironmentStage$_decorate_closure5.html" class="el_class">TerraformEnvironmentStage._decorate_closure5</a></td><td><code>51d7f93c660b96e2</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStage.addPlugin.0</span></td><td><code>b2a132e32fb7af7e</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStage.applyPlugins.2</span></td><td><code>46c94a93f5628bb6</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStage.decorate.4</span></td><td><code>21f557c5cb71d196</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStage.decorateAround.3</span></td><td><code>9a5e5353a5dce1ba</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStage.getEnvironment.5</span></td><td><code>ff4eac7af07c4d6c</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStage.getPlugins</span></td><td><code>8201a206490a2e3a</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStage.resetPlugins.1</span></td><td><code>b422b2c2d5fc38c9</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStagePlugin..EnhancerByMockitoWithCGLIB..7a4e183d</span></td><td><code>abf63007c9791523</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStagePlugin.apply</span></td><td><code>d71652ad0ffb4bc6</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStagePlugin.apply.0</span></td><td><code>ba3ec966f7a2a222</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStageTest</span></td><td><code>2c01ee00539d5304</code></td></tr><tr><td><span class="el_class">TerraformEnvironmentStageTest.AddedPlugins</span></td><td><code>aaba61f81bc4afb0</code></td></tr><tr><td><a href="default/TerraformInitCommand.html" class="el_class">TerraformInitCommand</a></td><td><code>7e111151c3358125</code></td></tr><tr><td><a href="default/TerraformInitCommand$_toString_closure1.html" class="el_class">TerraformInitCommand._toString_closure1</a></td><td><code>c6c177b9eefc35fc</code></td></tr><tr><td><span class="el_class">TerraformInitCommand.addPlugin</span></td><td><code>d6549bc7f02839c0</code></td></tr><tr><td><span class="el_class">TerraformInitCommand.getEnvironment.2</span></td><td><code>d9ff50e4071e8da5</code></td></tr><tr><td><span class="el_class">TerraformInitCommand.getPlugins.0</span></td><td><code>53d1eaad3d966716</code></td></tr><tr><td><span class="el_class">TerraformInitCommand.resetPlugins.1</span></td><td><code>e2206498db163937</code></td></tr><tr><td><span class="el_class">TerraformInitCommand.toString.3</span></td><td><code>dc0cdf1b9e0c375b</code></td></tr><tr><td><span class="el_class">TerraformInitCommandPlugin.apply</span></td><td><code>7bb9b7d7d3fcbdf6</code></td></tr><tr><td><a href="default/TerraformPlanCommand.html" class="el_class">TerraformPlanCommand</a></td><td><code>d4b6e371467faa39</code></td></tr><tr><td><span class="el_class">TerraformPlanCommand.addPlugin</span></td><td><code>c23fdb8203a1fe50</code></td></tr><tr><td><span class="el_class">TerraformPlanCommand.getEnvironment.2</span></td><td><code>f293deadd385163e</code></td></tr><tr><td><span class="el_class">TerraformPlanCommand.getPlugins.1</span></td><td><code>2ec72080407f0938</code></td></tr><tr><td><span class="el_class">TerraformPlanCommand.resetPlugins.0</span></td><td><code>eee0324890c38263</code></td></tr><tr><td><span class="el_class">TerraformPlanCommand.toString.3</span></td><td><code>17da87acb9247d2e</code></td></tr><tr><td><span class="el_class">TerraformPlanCommand.withPrefix.4</span></td><td><code>da750f6bfc69be39</code></td></tr><tr><td><span class="el_class">TerraformPlanCommandPlugin.apply</span></td><td><code>7c386711ec606265</code></td></tr><tr><td><span class="el_class">com.cyrusinnovation.mockitogroovysupport.GroovyCglibMockMaker</span></td><td><code>7b2ee12ddefde28f</code></td></tr><tr><td><span class="el_class">com.cyrusinnovation.mockitogroovysupport.MethodInterceptorForGroovyFilter</span></td><td><code>9a48a503277de4f5</code></td></tr><tr><td><span class="el_class">com.cyrusinnovation.mockitogroovysupport.ObjectMethodsGroovyGuru</span></td><td><code>df0ac4caa612b344</code></td></tr><tr><td><span class="el_class">com.esotericsoftware.kryo.io.Input</span></td><td><code>82caa4ac8d2c9ad6</code></td></tr><tr><td><span class="el_class">com.esotericsoftware.kryo.io.Output</span></td><td><code>2e152e7951e62ecf</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.HierarchicalContextRunner</span></td><td><code>01855b0dab69a9ef</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.description.ContextDescriber</span></td><td><code>002135e867b80cf0</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.description.MethodDescriber</span></td><td><code>5d3845ef7716f86c</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.description.SuiteDescriber</span></td><td><code>45ad8fe05b18d07c</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.processing.ContextExecutor</span></td><td><code>948e5c90826e480c</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.processing.ContextResolver</span></td><td><code>121f5524091d60cf</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.processing.MethodExecutor</span></td><td><code>2624c3d4938cadcc</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.processing.MethodResolver</span></td><td><code>81e3a6cd38469772</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.statements.RunAll</span></td><td><code>de293072da869400</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.statements.RunChildren</span></td><td><code>7bd7b68a872a2680</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.statements.StatementExecutor</span></td><td><code>355bedc325fca209</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.context.statements.TestStatementExecutor</span></td><td><code>16b84e18e05e98b1</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.model.TestClassPool</span></td><td><code>4e233ef3fab87984</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.validation.BooleanValidator</span></td><td><code>025a62017bb1b393</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.validation.BooleanValidator.AndValidator</span></td><td><code>45d14a84c416defd</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.validation.BooleanValidator.OrValidator</span></td><td><code>3c3bfe8e83c57b97</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.validation.ChildrenCountValidator</span></td><td><code>f165c83dac218488</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.validation.ConstructorValidator</span></td><td><code>7a0f8ed24856ff8f</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.validation.FixtureValidator</span></td><td><code>156f40b4a67d257b</code></td></tr><tr><td><span class="el_class">de.bechte.junit.runners.validation.RuleValidator</span></td><td><code>93f1591d81b68b9e</code></td></tr><tr><td><span class="el_class">groovy.grape.GrabAnnotationTransformation</span></td><td><code>49221cf686baaf0b</code></td></tr><tr><td><span class="el_class">groovy.lang.Binding</span></td><td><code>d6f13b13d4f1ae9c</code></td></tr><tr><td><span class="el_class">groovy.lang.Closure</span></td><td><code>d5a81c3bd97eef3a</code></td></tr><tr><td><span class="el_class">groovy.lang.Closure.1</span></td><td><code>73886556e8cf9ad7</code></td></tr><tr><td><span class="el_class">groovy.lang.Closure.WritableClosure</span></td><td><code>727a9f36eafb0f96</code></td></tr><tr><td><span class="el_class">groovy.lang.GString</span></td><td><code>ea0febc3a4adce93</code></td></tr><tr><td><span class="el_class">groovy.lang.GString.1</span></td><td><code>9250337279a021f0</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyClassLoader</span></td><td><code>3b4cff6a65552321</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyClassLoader.1</span></td><td><code>7d8ab21497f4d11d</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyClassLoader.1.1</span></td><td><code>9760a1b7f489b2cb</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyClassLoader.4</span></td><td><code>05bae297f617f9ca</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyClassLoader.5</span></td><td><code>6d457278ddc13f14</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyClassLoader.ClassCollector</span></td><td><code>24d7b23e64de4cb6</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyClassLoader.InnerLoader</span></td><td><code>ccb837b508638080</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyCodeSource</span></td><td><code>f3557b0d03f9f84d</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyObjectSupport</span></td><td><code>b152f70aec12bf4e</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovyRuntimeException</span></td><td><code>5a4c590ddc11a589</code></td></tr><tr><td><span class="el_class">groovy.lang.GroovySystem</span></td><td><code>bec3534da9e1c7c4</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaArrayLengthProperty</span></td><td><code>79fba590cecd3406</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaBeanProperty</span></td><td><code>93116a27a4949ca0</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl</span></td><td><code>79af39d56085663a</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.1</span></td><td><code>6924608db0d76d44</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.12</span></td><td><code>d25b27a5a28662bc</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.15</span></td><td><code>eb0fa66615c45b6e</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.16</span></td><td><code>a65d4ab1de764ef7</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.17</span></td><td><code>a5ff21f550d5ea05</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.1MOPIter</span></td><td><code>efb9eafab3e4943e</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.2</span></td><td><code>9755341f402195a4</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.6</span></td><td><code>9a8607ce685ec445</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.DummyMetaMethod</span></td><td><code>a5968731b82a1176</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.Index</span></td><td><code>502d48cd85ad6c9d</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.MethodIndex</span></td><td><code>93989c27a19d82f0</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassImpl.MethodIndexAction</span></td><td><code>470320aab7c037ef</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaClassRegistry.MetaClassCreationHandle</span></td><td><code>f8531c9d4b28ba8a</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaMethod</span></td><td><code>827289301fcb1dc4</code></td></tr><tr><td><span class="el_class">groovy.lang.MetaProperty</span></td><td><code>52faf21238838205</code></td></tr><tr><td><span class="el_class">groovy.lang.MissingPropertyException</span></td><td><code>e149eb0cb0bc3a19</code></td></tr><tr><td><span class="el_class">groovy.lang.Reference</span></td><td><code>049e14e4f4c00818</code></td></tr><tr><td><span class="el_class">groovy.lang.Script</span></td><td><code>93195e607ed48141</code></td></tr><tr><td><span class="el_class">groovy.text.StreamingTemplateEngine</span></td><td><code>85648ca78da8291e</code></td></tr><tr><td><span class="el_class">groovy.text.StreamingTemplateEngine.StreamingTemplate</span></td><td><code>6959424914d22049</code></td></tr><tr><td><span class="el_class">groovy.text.StreamingTemplateEngine.StreamingTemplate.1</span></td><td><code>f3943a1db1067d1c</code></td></tr><tr><td><span class="el_class">groovy.text.StreamingTemplateEngine.StreamingTemplate.FinishedReadingException</span></td><td><code>45837f12ccca71ec</code></td></tr><tr><td><span class="el_class">groovy.text.StreamingTemplateEngine.StreamingTemplate.Position</span></td><td><code>c7d6c1afecf4e4c6</code></td></tr><tr><td><span class="el_class">groovy.text.StreamingTemplateEngine.StreamingTemplate.StringSection</span></td><td><code>2446e94537924605</code></td></tr><tr><td><span class="el_class">groovy.text.Template.make</span></td><td><code>19cfbcafeccd23d3</code></td></tr><tr><td><span class="el_class">groovy.text.TemplateEngine</span></td><td><code>7bd2a60af22c6816</code></td></tr><tr><td><span class="el_class">groovy.text.TemplateEngine.createTemplate</span></td><td><code>4a714e78efd13685</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript1</span></td><td><code>74337f691011d64d</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript1._getTemplate_closure1</span></td><td><code>fac70b02edabb1be</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript2</span></td><td><code>b5f7f8141b04658c</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript2._getTemplate_closure1</span></td><td><code>0b73d9cd38491676</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript3</span></td><td><code>f54b853f1df70b33</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript3._getTemplate_closure1</span></td><td><code>5be068778b1774ce</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript4</span></td><td><code>867ef6ee0d2f020f</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript4._getTemplate_closure1</span></td><td><code>581a7c52938c59e7</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript5</span></td><td><code>c6c28bc50bdc6cb0</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript5._getTemplate_closure1</span></td><td><code>0889cde820d23b5f</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript6</span></td><td><code>07060cb800c9df71</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript6._getTemplate_closure1</span></td><td><code>f93d1f27f5309c97</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript7</span></td><td><code>47ba7193063ab1ce</code></td></tr><tr><td><span class="el_class">groovy.tmp.templates.StreamingTemplateScript7._getTemplate_closure1</span></td><td><code>bc7afc2d9be74ba7</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.ANTLRException</span></td><td><code>a51edf06bde19225</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.ANTLRHashString</span></td><td><code>1412a48f82edfb7d</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.ANTLRStringBuffer</span></td><td><code>329947117fbe91be</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.ASTFactory</span></td><td><code>f2aa8c9b867ba79d</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.ASTPair</span></td><td><code>e18b895a4a382824</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.BaseAST</span></td><td><code>e3322e37e72f5d97</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.CharBuffer</span></td><td><code>86cd39478f431d42</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.CharQueue</span></td><td><code>73b5d12d6df09706</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.CharScanner</span></td><td><code>9a13dc582f1f093d</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.CommonAST</span></td><td><code>e4bdf5748d356afa</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.CommonToken</span></td><td><code>066cf4b418d8dfd6</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.InputBuffer</span></td><td><code>7c67b9e312c4c983</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.LLkParser</span></td><td><code>6bbe6cecf55878a8</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.LexerSharedInputState</span></td><td><code>1592d29f2c01cff7</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.MismatchedCharException</span></td><td><code>5447ab532a5590f8</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.MismatchedTokenException</span></td><td><code>a7d5efd21ff8251c</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.NoViableAltException</span></td><td><code>50813a860469e4f9</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.Parser</span></td><td><code>8933089dad346c11</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.ParserSharedInputState</span></td><td><code>ec40015946c7c665</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.RecognitionException</span></td><td><code>2eea52a7fb9a1ee3</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.SemanticException</span></td><td><code>07d5cbd15485fdbe</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.Token</span></td><td><code>435cd9c6fe653884</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.TokenBuffer</span></td><td><code>e9b670413aefe18d</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.TokenQueue</span></td><td><code>259b51a4f3a41229</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.Utils</span></td><td><code>1b823c7e1e49b51a</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.collections.impl.ASTArray</span></td><td><code>038f1cf34ba644c4</code></td></tr><tr><td><span class="el_class">groovyjarjarantlr.collections.impl.BitSet</span></td><td><code>984fefb0767c8494</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.ByteVector</span></td><td><code>c08173292fa23375</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.ClassVisitor</span></td><td><code>e12cf50f8525ad52</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.ClassWriter</span></td><td><code>a647b18133b85719</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.Edge</span></td><td><code>b729073112db2d6d</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.FieldVisitor</span></td><td><code>ec9e5a6068b55cf3</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.FieldWriter</span></td><td><code>7eea4de7289a9039</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.Frame</span></td><td><code>2b7a2ffca4ef8df0</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.Handler</span></td><td><code>fd3caa71d4c46704</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.Item</span></td><td><code>f374d04cf13143f7</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.Label</span></td><td><code>be8f5d3ebb1192ae</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.MethodVisitor</span></td><td><code>c481ebfea924f98f</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.MethodWriter</span></td><td><code>30dc2e9c651bd3d5</code></td></tr><tr><td><span class="el_class">groovyjarjarasm.asm.Type</span></td><td><code>ef500b1e0aa9349a</code></td></tr><tr><td><span class="el_class">org.apache.commons.lang.StringUtils</span></td><td><code>9dd94cc65aafa7e1</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.AntlrASTProcessSnippets</span></td><td><code>d8be1a46f90e3675</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.AntlrParserPlugin</span></td><td><code>a70d88dae33d7092</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.AntlrParserPlugin.1</span></td><td><code>45e9b45a1c9db790</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.AntlrParserPluginFactory</span></td><td><code>e663489cf89df68d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.GroovySourceAST</span></td><td><code>0ca9f7af1e3db546</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.GroovySourceToken</span></td><td><code>84ae87b3edd3b52b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.LineColumn</span></td><td><code>b4558aab1aad64d3</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.SourceBuffer</span></td><td><code>2b1ce7fb6b9efb40</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.UnicodeEscapingReader</span></td><td><code>1a49cbdc127ed1b7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.UnicodeEscapingReader.DummyLexer</span></td><td><code>7d7498458e859aee</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.UnicodeLexerSharedInputState</span></td><td><code>bb504c72ae02123a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.parser.GroovyLexer</span></td><td><code>5958aec6621db3e6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.parser.GroovyLexer.1</span></td><td><code>31e57cf47450fe2a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.antlr.parser.GroovyRecognizer</span></td><td><code>666144f99b53aa0d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.ASTNode</span></td><td><code>3a9589f748d974c0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.AnnotatedNode</span></td><td><code>11ef6d92b027f9db</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.AnnotationNode</span></td><td><code>4e5b4be66a3614bb</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.ClassCodeExpressionTransformer</span></td><td><code>1165b243a106d4de</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.ClassCodeVisitorSupport</span></td><td><code>914fcf3235b0fd3e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.ClassHelper</span></td><td><code>df47b41109897fa4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.ClassHelper.ClassHelperCache</span></td><td><code>16e29424d21b4b24</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.ClassNode</span></td><td><code>dea79bba615ff948</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.ClassNode.MapOfLists</span></td><td><code>a99d3ef0ff4ca585</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.CodeVisitorSupport</span></td><td><code>9b3d3bd44b2945bd</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.CompileUnit</span></td><td><code>1998b3560fe2129a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.ConstructorNode</span></td><td><code>3d8e5061361e3240</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.DynamicVariable</span></td><td><code>7f7ab2a62958105a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.FieldNode</span></td><td><code>8243eede9556e3b5</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.GenericsType</span></td><td><code>3b210ff8df24b1f2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.InnerClassNode</span></td><td><code>d2f7594db7ab1dc8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.MethodNode</span></td><td><code>02aa6103104c9707</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.MixinNode</span></td><td><code>5c2244558ba8fee2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.ModuleNode</span></td><td><code>08b18ef7b0945200</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.PackageNode</span></td><td><code>9f7c9c391ace6063</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.Parameter</span></td><td><code>cd48f37d683749fe</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.VariableScope</span></td><td><code>f2d40d16b170d89f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.builder.AstBuilderTransformation</span></td><td><code>44a75bc97a066f8d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.builder.AstBuilderTransformation.AstBuilderInvocationTrap</span></td><td><code>d641cf6158750c5e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.ArgumentListExpression</span></td><td><code>e45eeacbd530427e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.BinaryExpression</span></td><td><code>1840a1c60f9d1de0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.CastExpression</span></td><td><code>2a682410b52740be</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.ClassExpression</span></td><td><code>840387ef74589a77</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.ClosureExpression</span></td><td><code>c2f148c18bdb7379</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.ConstantExpression</span></td><td><code>08c4c312e7f88a9b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.ConstructorCallExpression</span></td><td><code>ab026f6db4bb1980</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.DeclarationExpression</span></td><td><code>c35d6f8a54f5d21c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.EmptyExpression</span></td><td><code>a4ba1f488c66c979</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.Expression</span></td><td><code>3e1f500e0b761d3c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.GStringExpression</span></td><td><code>0c3251ab9920db64</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.MethodCallExpression</span></td><td><code>d1c275cc74354f1a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.PropertyExpression</span></td><td><code>ab4b6979e725b08d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.TupleExpression</span></td><td><code>f5047687cd16114d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.expr.VariableExpression</span></td><td><code>b7bea1e9b09e7d5b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.stmt.BlockStatement</span></td><td><code>6d3462d01f0c73d7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.stmt.CatchStatement</span></td><td><code>fa299059bff36475</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.stmt.EmptyStatement</span></td><td><code>d322b87be9df44c5</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.stmt.ExpressionStatement</span></td><td><code>7c4f32d9a3255dc7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.stmt.ReturnStatement</span></td><td><code>0aea4eebc80b289d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.stmt.Statement</span></td><td><code>1cff5e8911814bf3</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.stmt.TryCatchStatement</span></td><td><code>00ea0a4067b3e58f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.tools.ClassNodeUtils</span></td><td><code>e5675f82fec775fb</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.tools.GeneralUtils</span></td><td><code>6c8b7230164d90e6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.tools.GenericsUtils</span></td><td><code>e7239f14d5f0ca1e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.tools.ParameterUtils</span></td><td><code>2d0a558387965cee</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.tools.WideningCategories</span></td><td><code>71f379602a92afe8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.tools.WideningCategories.1</span></td><td><code>531362172f2cc6da</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.ast.tools.WideningCategories.2</span></td><td><code>d0d14aa07ed37058</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.AsmClassGenerator</span></td><td><code>099dd8a2fbb25ea2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.BytecodeExpression</span></td><td><code>3148cce363cb683d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.BytecodeExpression.1</span></td><td><code>2f9a2d38db7c2b4d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.BytecodeInstruction</span></td><td><code>07051767cd1853b4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.BytecodeSequence</span></td><td><code>af10989ff01c684f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.ClassCompletionVerifier</span></td><td><code>ed98bc83e37439a2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.ClassGenerator</span></td><td><code>1a3e22dff1589211</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.EnumCompletionVisitor</span></td><td><code>b7a993ace84f42b6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.EnumVisitor</span></td><td><code>d0a48d7c880795aa</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.ExtendedVerifier</span></td><td><code>f154d2a1961773e7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.GeneratorContext</span></td><td><code>358769c53f48096e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.InnerClassCompletionVisitor</span></td><td><code>96d61bbfea6c8e2f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.InnerClassVisitor</span></td><td><code>8bca4346871a4182</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.InnerClassVisitorHelper</span></td><td><code>bc67c46cb8007c23</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.ReturnAdder</span></td><td><code>cab55fbe847c924c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.ReturnAdder.1</span></td><td><code>8a85a80aa771809c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.ReturnAdder.2</span></td><td><code>92ce51737fffa255</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.VariableScopeVisitor</span></td><td><code>7b37eede4b09bf0b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.VariableScopeVisitor.StateStackElement</span></td><td><code>cecb8f2e78c6c5ba</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.Verifier</span></td><td><code>3bcd89e7d12ae26e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.Verifier.10</span></td><td><code>d3ed16158f88b419</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.Verifier.11</span></td><td><code>4fb176fb221a7593</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.Verifier.2</span></td><td><code>6bb9773bb900f926</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.Verifier.8</span></td><td><code>17e47ded94550f8d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.Verifier.9</span></td><td><code>b19e72ad58ba6cf2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.Verifier.SwapInitStatement</span></td><td><code>83bc8eb5347dfd81</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.Verifier.SwapInitStatement.SwapInitInstruction</span></td><td><code>cc93ab33deb90906</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.VerifierCodeVisitor</span></td><td><code>05f7558f4f125485</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.AssertionWriter</span></td><td><code>919520a3135111c0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryBooleanExpressionHelper</span></td><td><code>24d00acf6c19f006</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryDoubleExpressionHelper</span></td><td><code>8ec258a912387e21</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryExpressionHelper</span></td><td><code>6c0c4ecbaaa6fc4a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryExpressionMultiTypeDispatcher</span></td><td><code>8044df369dbfc383</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryExpressionMultiTypeDispatcher.BinaryByteExpressionHelper</span></td><td><code>faf1a010299e6c36</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryExpressionMultiTypeDispatcher.BinaryCharExpressionHelper</span></td><td><code>a94266f0b5143079</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryExpressionMultiTypeDispatcher.BinaryShortExpressionHelper</span></td><td><code>c5f5f4e2e444223f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryExpressionWriter</span></td><td><code>c60d78d8f097f149</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryFloatExpressionHelper</span></td><td><code>bc4b102bcd777303</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryIntExpressionHelper</span></td><td><code>2dca890505695b25</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryLongExpressionHelper</span></td><td><code>490ba012a11534cb</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BinaryObjectExpressionHelper</span></td><td><code>09db9300d9f89ecf</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BytecodeHelper</span></td><td><code>fdeec5416d6dfcc2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.BytecodeVariable</span></td><td><code>bb052867b5a73e9d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.CallSiteWriter</span></td><td><code>f718ca9c178be12a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.ClosureWriter</span></td><td><code>441f7604e6def0ef</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.ClosureWriter.1</span></td><td><code>07747470faf9db7a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.ClosureWriter.2</span></td><td><code>1a9bd84797dcacc2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.CompileStack</span></td><td><code>555befa9d0d2fca8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.CompileStack.BlockRecorder</span></td><td><code>2875c5d19454e327</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.CompileStack.LabelRange</span></td><td><code>4a025c690a3ba8f0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.CompileStack.StateStackElement</span></td><td><code>e46f9017d62d56b4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.InvocationWriter</span></td><td><code>ee4b49829b27a098</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.InvocationWriter.1</span></td><td><code>db1437694559ef44</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.MethodCaller</span></td><td><code>96783df0cb42c930</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.MethodCallerMultiAdapter</span></td><td><code>3cd7324cf72ba2d6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.MopWriter</span></td><td><code>35569d43358a152b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.MopWriter.1</span></td><td><code>21221a07ca429045</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.MopWriter.MopKey</span></td><td><code>2aea4c9f87746edd</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.OperandStack</span></td><td><code>2b39990f2a4a1629</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.OptimizingStatementWriter</span></td><td><code>6a11b55a6ef05ae0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.OptVisitor</span></td><td><code>f280f4ab4860aad5</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.OptimizeFlagsCollector</span></td><td><code>b4d3c4c098df5fec</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.OptimizeFlagsCollector.OptimizeFlagsEntry</span></td><td><code>44776644dba3bb51</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.OptimizingStatementWriter.StatementMeta</span></td><td><code>89c79131d4e208ba</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.StatementMetaTypeChooser</span></td><td><code>1eb150305ba40578</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.StatementWriter</span></td><td><code>4d903b0e5618d1b0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.StatementWriter.1</span></td><td><code>e801cb4d10fb73d0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.UnaryExpressionHelper</span></td><td><code>42acb280d0211afa</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.VariableSlotLoader</span></td><td><code>c1877d18fe64f264</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.classgen.asm.WriterController</span></td><td><code>e369a6b01b35e162</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ASTTransformationsContext</span></td><td><code>fa3a8e362715f048</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.AnnotationConstantsVisitor</span></td><td><code>daa06292a7528043</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ClassNodeResolver</span></td><td><code>d3133122dbf0d91e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ClassNodeResolver.1</span></td><td><code>e33ca45deb24e27d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ClassNodeResolver.LookupResult</span></td><td><code>de0a252a5081308d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit</span></td><td><code>5b44c7e11d27438b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.1</span></td><td><code>c7990c1fb8f7f88b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.12</span></td><td><code>9fb563aa1505e291</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.13</span></td><td><code>4b2406ddf3142f84</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.14</span></td><td><code>3b5b846a8aaac64f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.15</span></td><td><code>1a9e4d3c04c2a999</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.16</span></td><td><code>4a1aac2dacf2a6c6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.17</span></td><td><code>29369c0b50c82aac</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.18</span></td><td><code>a2ab26ca2e400623</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.19</span></td><td><code>1177d463cd113f9a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.2</span></td><td><code>50fb8b40f5d22a79</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.3</span></td><td><code>4ac8f51828af15ba</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.4</span></td><td><code>316e019705476a3f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.5</span></td><td><code>3e9920d71ba9c969</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.6</span></td><td><code>e6dadcf098a4c9de</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.7</span></td><td><code>328d4c6de8fbb62f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.8</span></td><td><code>8b36c9858987b14f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.9</span></td><td><code>63a7ac8b5a585c8e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.ClassgenCallback</span></td><td><code>0e44548c9f1a68f4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.GroovyClassOperation</span></td><td><code>f87728807aede837</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.PrimaryClassNodeOperation</span></td><td><code>078b21b2a68cae18</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilationUnit.SourceUnitOperation</span></td><td><code>2c2c82ffe278e0d1</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilePhase</span></td><td><code>af4e05dee876cb94</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.CompilerConfiguration</span></td><td><code>4cb8641fefb7a07e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ErrorCollector</span></td><td><code>bd59d49cffbd0c72</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.GenericsVisitor</span></td><td><code>3ded6a661bc78a74</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.LabelVerifier</span></td><td><code>1ac4e5bf3a0f4d77</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.OptimizerVisitor</span></td><td><code>90dda224c6b486f2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ParserPluginFactory</span></td><td><code>01db91b8a7842083</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ProcessingUnit</span></td><td><code>96beb1f8350ba82a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ResolveVisitor</span></td><td><code>a6dd530ed3387521</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ResolveVisitor.ConstructedClassWithPackage</span></td><td><code>478fc84abce69317</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ResolveVisitor.ConstructedNestedClass</span></td><td><code>c6bf15c4319c7a39</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.ResolveVisitor.LowerCaseClass</span></td><td><code>9c73f88d018edfa2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.SourceExtensionHandler</span></td><td><code>18d0ed9570915162</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.SourceUnit</span></td><td><code>b0050edcbcfbaa6f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.SourceUnit.1</span></td><td><code>0b3a44ad202661e8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.StaticImportVisitor</span></td><td><code>9e74efb8dcd7f1d3</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.StaticVerifier</span></td><td><code>96e188fbcfcccd48</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.io.AbstractReaderSource</span></td><td><code>255ab107a1fe0b2e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.io.NullWriter</span></td><td><code>e7765765c380c0cc</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.control.io.StringReaderSource</span></td><td><code>e0659d19ac836b2a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass</span></td><td><code>f26c225f9843b7c7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.1</span></td><td><code>68b7172c0c861680</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.1.1</span></td><td><code>d07ae24aae8634b1</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.2</span></td><td><code>42c0a45de8b237fc</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.2.1</span></td><td><code>937a23ea158764a6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.3</span></td><td><code>571d3be8195117d6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.3.1</span></td><td><code>7e08b272bec797fd</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.4</span></td><td><code>bfd8c88bacb3d51b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.5</span></td><td><code>378f488c43b28f8a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.5.1</span></td><td><code>7be73f0ce5a3e34c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.6</span></td><td><code>f42b0fb39e5e17ee</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.7</span></td><td><code>ed5012ef301ff4d0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.8</span></td><td><code>d7765c4da3616f54</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.CachedMethodComparatorByName</span></td><td><code>ce2a7e45bd981339</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedClass.CachedMethodComparatorWithString</span></td><td><code>26fe0b316e6396ba</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedConstructor</span></td><td><code>2e8648a2b15c73fc</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedConstructor.1</span></td><td><code>e578688e60464808</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedField</span></td><td><code>ef88aaeff198346c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedMethod</span></td><td><code>c3de108b2ffbbfba</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.CachedMethod.MyComparator</span></td><td><code>d5fe1f5f35149d99</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.ClassInfo</span></td><td><code>e0720cc815b2169f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.ClassInfo.1</span></td><td><code>8647519d878910c9</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.ClassInfo.GlobalClassSet</span></td><td><code>564b032ae9f9e272</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.ClassInfo.LazyCachedClassRef</span></td><td><code>5c3f885feb3d5dc7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.ClassInfo.LazyClassLoaderRef</span></td><td><code>a137daa02669b98c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts</span></td><td><code>0397a93507b3b6c8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.ClassLoaderForClassArtifacts.1</span></td><td><code>38fa88207c65cd0f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.GeneratedMetaMethod</span></td><td><code>4cb34f6b1e251408</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.GeneratedMetaMethod.DgmMethodRecord</span></td><td><code>f73105a5374a2e43</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.GeneratedMetaMethod.Proxy</span></td><td><code>57565d93ee8860af</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.GroovyClassValueFactory</span></td><td><code>ead031b722a93d90</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.GroovyClassValuePreJava7</span></td><td><code>f0f85f4e9ce7b1e5</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.GroovyClassValuePreJava7.EntryWithValue</span></td><td><code>826ef2c70721be3c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.GroovyClassValuePreJava7.GroovyClassValuePreJava7Map</span></td><td><code>168aa895e0334abd</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.GroovyClassValuePreJava7.GroovyClassValuePreJava7Segment</span></td><td><code>fe240354cc3d2b1f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.ParameterTypes</span></td><td><code>29cad560d1824c2d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.ReflectionCache</span></td><td><code>ab3e0ac77029a775</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.SunClassLoader</span></td><td><code>91dd60966256ca61</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.SunClassLoader.1</span></td><td><code>ac0d3dcac7cb6304</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.android.AndroidSupport</span></td><td><code>4be759c7540e7e38</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.ArrayCachedClass</span></td><td><code>9ec3fbeba3a45252</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.BigDecimalCachedClass</span></td><td><code>82625bf09c159572</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.BigIntegerCachedClass</span></td><td><code>fa0b08fc2dcc4f89</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.BooleanCachedClass</span></td><td><code>d2f7290fe6002787</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.ByteCachedClass</span></td><td><code>44bd97d40f2d7e24</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.CachedClosureClass</span></td><td><code>1c1ddf26e0a92830</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.CachedSAMClass</span></td><td><code>3c70cc39058e25dd</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.CachedSAMClass.1</span></td><td><code>502b45273c8c1ca8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.CharacterCachedClass</span></td><td><code>06335163813c3ee4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.DoubleCachedClass</span></td><td><code>ec5ecdfa04ee63dc</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.FloatCachedClass</span></td><td><code>e49eeffa24d72792</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.IntegerCachedClass</span></td><td><code>e60058d6c47867ce</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.LongCachedClass</span></td><td><code>7a72b3215d495d65</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.NumberCachedClass</span></td><td><code>cc86f27683634902</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.ObjectCachedClass</span></td><td><code>61bb8b896bf9b487</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.ShortCachedClass</span></td><td><code>bc5780ad503c3c8a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.reflection.stdclasses.StringCachedClass</span></td><td><code>529b8864fd8aa902</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.ArrayUtil</span></td><td><code>d65b75af626da4a0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.BytecodeInterface8</span></td><td><code>e68ca5f7d6803e15</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.CurriedClosure</span></td><td><code>c211372f63e64e19</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.DefaultGroovyMethods</span></td><td><code>5387372f7c63c4c5</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.DefaultGroovyMethodsSupport</span></td><td><code>0c01edcf32e01fe8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.GStringImpl</span></td><td><code>71e5cd61bcbcd7ca</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.GroovyCategorySupport</span></td><td><code>eafbbf24ad849e7b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.GroovyCategorySupport.MyThreadLocal</span></td><td><code>e0e57eaf3c584a5a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.IOGroovyMethods</span></td><td><code>f70031ec9cc5a4c6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.InvokerHelper</span></td><td><code>aa3d82bbd674026a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.MetaClassHelper</span></td><td><code>5f69374119277875</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.NullObject</span></td><td><code>fa879d8219f49ab2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.NumberAwareComparator</span></td><td><code>7697d7c1656229c2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.ScriptBytecodeAdapter</span></td><td><code>f07a308aa6646b9e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.StringGroovyMethods</span></td><td><code>7be6fca81ca2ca93</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.StringGroovyMethods.1</span></td><td><code>acb204d766d2f0a0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.AbstractCallSite</span></td><td><code>77c9799ef82f8ab4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.CallSiteArray</span></td><td><code>b2bb7977a0d7ef3c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.CallSiteArray.1</span></td><td><code>48373824859527e0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.CallSiteAwareMetaMethod</span></td><td><code>166f7f5fae88a2e5</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.CallSiteClassLoader</span></td><td><code>21204fc61dde4a48</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.CallSiteGenerator</span></td><td><code>45d763cfc544116b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.ClassMetaClassGetPropertySite</span></td><td><code>c3afd59aa13dfbee</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.ConstructorSite</span></td><td><code>35cdc8a74073cb15</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.ConstructorSite.ConstructorSiteNoUnwrapNoCoerce</span></td><td><code>a506cb62470ab351</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.GetEffectivePogoPropertySite</span></td><td><code>c3c466586e759f81</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.GetEffectivePojoPropertySite</span></td><td><code>8f9d39cf2157443d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.GroovySunClassLoader</span></td><td><code>088164658bde0fe1</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.GroovySunClassLoader.1</span></td><td><code>5b7220eec4074aeb</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.MetaClassSite</span></td><td><code>8e2b675632406d31</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.MetaMethodSite</span></td><td><code>d5251e834ae5d7e8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.PogoGetPropertySite</span></td><td><code>f54d6ef3f151ef70</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.PogoMetaClassSite</span></td><td><code>08bb789a1cd4a7b8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite</span></td><td><code>bdf69b74066fa10c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.PogoCachedMethodSite</span></td><td><code>c2b1911672f16a94</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.PogoCachedMethodSiteNoUnwrap</span></td><td><code>34a281dc48dc6eac</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.PogoMetaMethodSite.PogoCachedMethodSiteNoUnwrapNoCoerce</span></td><td><code>ec0147cfa42bdf0f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite</span></td><td><code>964b8dec7bb0d96a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.PojoMetaMethodSiteNoUnwrapNoCoerce</span></td><td><code>f8cfa462792b4553</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite</span></td><td><code>071a4bcf02708b9e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.callsite.StaticMetaMethodSite.StaticMetaMethodSiteNoUnwrap</span></td><td><code>aa724be507e2dec8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.1043</span></td><td><code>b4c204a08e4593b4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.1080</span></td><td><code>0b892c5225d56482</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.1089</span></td><td><code>fc26f47f70ebf56a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.1119</span></td><td><code>3384e7b6cba56794</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.1121</span></td><td><code>b3899c147b6fe94e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.1141</span></td><td><code>abc419fc679c1f55</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.162</span></td><td><code>53a4379045a5b436</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.238</span></td><td><code>aec49d8301d34e65</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.241</span></td><td><code>52de29d5b83adb09</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.243</span></td><td><code>4c4a1dfb9a916188</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.244</span></td><td><code>22e6aa9c9d13b234</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.286</span></td><td><code>c686af9fd82281e6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.287</span></td><td><code>e3e1080984411016</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.288</span></td><td><code>230673e30e51a381</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.289</span></td><td><code>893b4caee8550f81</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.33</span></td><td><code>66fc4ce5013c6b33</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.365</span></td><td><code>1f7a5599c7ef92a4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.378</span></td><td><code>e35391362e45676a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.385</span></td><td><code>ed327a9b46250557</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.468</span></td><td><code>ae05efa21e0be8c9</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.469</span></td><td><code>0c0d87d13ca5dca4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.470</span></td><td><code>2ee4f12a96e39350</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.471</span></td><td><code>589a81b9886cf24b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.472</span></td><td><code>19755a869b0c1b97</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.473</span></td><td><code>844cfd02df35eaf1</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.574</span></td><td><code>c5ca556167c74385</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.60</span></td><td><code>d6899074e28d4d34</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.61</span></td><td><code>eef8b59e43195949</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.65</span></td><td><code>fb66a25eb09383a2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgm.842</span></td><td><code>c7f96a620311c4b7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.NumberNumberDiv</span></td><td><code>d64e251b976fc5ee</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.NumberNumberMetaMethod</span></td><td><code>5bb4ee1514e30efa</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.NumberNumberMinus</span></td><td><code>c209d8705ce2e472</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.NumberNumberMultiply</span></td><td><code>6befeab20e81d152</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.NumberNumberPlus</span></td><td><code>d74945f8ae290f68</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.ArrayGetAtMetaMethod</span></td><td><code>f5b2e5a3d903b758</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.ArrayMetaMethod</span></td><td><code>b0cfa65c5bf3fde2</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.ArrayPutAtMetaMethod</span></td><td><code>7594f9544707cf0b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.BooleanArrayGetAtMetaMethod</span></td><td><code>c77d814d9c938fe7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.BooleanArrayPutAtMetaMethod</span></td><td><code>4d8640003e9673c4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.ByteArrayGetAtMetaMethod</span></td><td><code>e4b47160f2b2a3d6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.ByteArrayPutAtMetaMethod</span></td><td><code>f89483ace22c0ca6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.CharacterArrayGetAtMetaMethod</span></td><td><code>d5f0c691a90ca6a3</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.CharacterArrayPutAtMetaMethod</span></td><td><code>58366cda6a7513de</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.DoubleArrayGetAtMetaMethod</span></td><td><code>9037f0fb31f03575</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.DoubleArrayPutAtMetaMethod</span></td><td><code>08ab52ca9179ee2b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.FloatArrayGetAtMetaMethod</span></td><td><code>66983f1be7c3f0b5</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.FloatArrayPutAtMetaMethod</span></td><td><code>b90f665e94592b44</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayGetAtMetaMethod</span></td><td><code>fbec2e9aae301c45</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.IntegerArrayPutAtMetaMethod</span></td><td><code>17fced924b628614</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.LongArrayGetAtMetaMethod</span></td><td><code>07c673e8278a1356</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.LongArrayPutAtMetaMethod</span></td><td><code>6f0b002c8bbcc12a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.ObjectArrayGetAtMetaMethod</span></td><td><code>19929c45dc852615</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.ObjectArrayPutAtMetaMethod</span></td><td><code>b3075507836d0b5b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.ShortArrayGetAtMetaMethod</span></td><td><code>f028dd1a8af63b7e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.dgmimpl.arrays.ShortArrayPutAtMetaMethod</span></td><td><code>42863ac7d22b9b2d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.m12n.ExtensionModule</span></td><td><code>0ba4d0627fad0767</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.m12n.ExtensionModuleRegistry</span></td><td><code>7450d5b0974fd3d8</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner</span></td><td><code>8fb33a065e5c621f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.m12n.MetaInfExtensionModule</span></td><td><code>a309198ac15c6b1b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.m12n.PropertiesModuleFactory</span></td><td><code>c0500fe3d1f8720c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.m12n.SimpleExtensionModule</span></td><td><code>25db291976ff413f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.m12n.StandardPropertiesModuleFactory</span></td><td><code>477c9bf38f0570b1</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.ClosureMetaClass</span></td><td><code>62e55da1f22e24fb</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.3</span></td><td><code>d6186f846afdeedc</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.4</span></td><td><code>bc3425ff6e321f68</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.6</span></td><td><code>e35b0d9e515176ec</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.DefaultMetaClassInfo</span></td><td><code>8d7bd827fd714a78</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.DefaultMetaClassInfo.ConstantMetaClassVersioning</span></td><td><code>0a6a7d3ef54c7894</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl</span></td><td><code>1dceb705e3566ac7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.1</span></td><td><code>d9dcecf0bb416d07</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl.DefaultModuleListener</span></td><td><code>fc9a9b7b3dcb5cb0</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.MetaMethodIndex</span></td><td><code>aedba5ed580bf3c9</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.MetaMethodIndex.CacheEntry</span></td><td><code>00b4664ea748ed2c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.MetaMethodIndex.Entry</span></td><td><code>d1955921d1d1997c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.MetaMethodIndex.Header</span></td><td><code>0ed03602960b04fd</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.MethodHelper</span></td><td><code>4d4cef1f4f3c0ec6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.MissingPropertyExceptionNoStack</span></td><td><code>a6b935ad6fdcecd6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.NewInstanceMetaMethod</span></td><td><code>6b365c39ca1266c9</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.NewMetaMethod</span></td><td><code>c62c41b2c95ebbab</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.NewStaticMetaMethod</span></td><td><code>7d1930f6c25fd654</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.metaclass.ReflectionMetaMethod</span></td><td><code>a5552213be7b114d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation</span></td><td><code>ada6c3049665a190</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.runtime.typehandling.ShortTypeHandling</span></td><td><code>d7801545b03c2f0b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.syntax.ASTHelper</span></td><td><code>ad604c607c5553e4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.syntax.CSTNode</span></td><td><code>084ba66657be5159</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.syntax.Numbers</span></td><td><code>a4e933a48f0bac90</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.syntax.Token</span></td><td><code>73b685fb3407174e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.syntax.Types</span></td><td><code>63ce98f8b8211b8e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.tools.GroovyClass</span></td><td><code>e27885fa1ec3da08</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.ASTTransformationCollectorCodeVisitor</span></td><td><code>8c6efbcb4b19ce2f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.ASTTransformationVisitor</span></td><td><code>538effe0f5960ead</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.ASTTransformationVisitor.1</span></td><td><code>201dcbb22e85a97d</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.ASTTransformationVisitor.2</span></td><td><code>8d2003f75b50f9ae</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.ASTTransformationVisitor.3</span></td><td><code>20d628a85de91873</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.ASTTransformationVisitor.4</span></td><td><code>4c207d6f340ed0d1</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.AnnotationCollectorTransform.ClassChanger</span></td><td><code>10cb7ac14ff1f363</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.sc.StaticCompilationMetadataKeys</span></td><td><code>33d0716286a06f86</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.trait.SuperCallTraitTransformer</span></td><td><code>3fc53239d816755f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.trait.TraitComposer</span></td><td><code>1b9e31d8a23bad4c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.transform.trait.Traits</span></td><td><code>eca104438cccf56b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.AbstractConcurrentMap</span></td><td><code>35f12350372d1d7b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.AbstractConcurrentMap.Segment</span></td><td><code>cee0d191c849ef42</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.AbstractConcurrentMapBase</span></td><td><code>e97b7eee5d0c04f6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.AbstractConcurrentMapBase.Segment</span></td><td><code>28dd9945d327e459</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ComplexKeyHashMap</span></td><td><code>a8580f5ba3ec2bc6</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ComplexKeyHashMap.1</span></td><td><code>c638e829ad475609</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ComplexKeyHashMap.Entry</span></td><td><code>556237b5a19cb7e3</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.FastArray</span></td><td><code>86d54a8fb475ddb5</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.LazyReference</span></td><td><code>4452550dc2cc6cbd</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.LazyReference.1</span></td><td><code>42acf5a11c8536d5</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.LazyReference.2</span></td><td><code>793d3692ffce4719</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ListHashMap</span></td><td><code>d3ac98ab90b7e080</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.LockableObject</span></td><td><code>cb25f02f98d92475</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ManagedConcurrentLinkedQueue</span></td><td><code>374139f9056e5cc7</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ManagedConcurrentLinkedQueue.Element</span></td><td><code>58d68ed9289e1474</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ManagedConcurrentMap</span></td><td><code>cf5320af47d5be7a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ManagedConcurrentMap.Entry</span></td><td><code>fcb859c4f4410207</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ManagedConcurrentMap.EntryWithValue</span></td><td><code>2468da58fbc3df41</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ManagedConcurrentMap.Segment</span></td><td><code>4dd01f367891c72f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ManagedReference</span></td><td><code>8733ef279c80eb3c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ManagedReference.1</span></td><td><code>8bb50de847f9db33</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceBundle</span></td><td><code>96f60e7ec95c456b</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceManager</span></td><td><code>1a7c8145aa94cd72</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceManager.1</span></td><td><code>9f1ad3abbda5ce44</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceManager.CallBackedManager</span></td><td><code>e67c6755ed66fddf</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceType</span></td><td><code>e3106e1c8c2a576c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceType.1</span></td><td><code>71f8c14e1a0c835a</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceType.2</span></td><td><code>b16b48ddbf1348ce</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceType.3</span></td><td><code>bacfb665bdfdda60</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceType.4</span></td><td><code>f31b91334a723a6e</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceType.HardRef</span></td><td><code>85d4a08b56270b56</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceType.SoftRef</span></td><td><code>ce6df7be9ebc1e3c</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.ReferenceType.WeakRef</span></td><td><code>cdfb9e26342557b4</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.SingleKeyHashMap</span></td><td><code>fdd1b3344ad0659f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.SingleKeyHashMap.Entry</span></td><td><code>70bd68c46a61d8a3</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.util.TripleKeyHashMap</span></td><td><code>ff397ff0604a6405</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.vmplugin.VMPluginFactory</span></td><td><code>90aa4abca8fbcb02</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.vmplugin.v5.Java5</span></td><td><code>9fdefcafe8079ebb</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.vmplugin.v6.Java6</span></td><td><code>2155f60ea7159b3f</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.vmplugin.v7.Java7</span></td><td><code>f1228dcb3a5535fb</code></td></tr><tr><td><span class="el_class">org.codehaus.groovy.vmplugin.v7.Java7.1</span></td><td><code>177cc5e35452a9f6</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.AbstractTestDescriptor</span></td><td><code>d880a2718965e226</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.DefaultTestClassDescriptor</span></td><td><code>03acdabf64b200db</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.DefaultTestClassRunInfo</span></td><td><code>68a7e79b2914fd4d</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.DefaultTestDescriptor</span></td><td><code>7e7e6eac4736af30</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.DefaultTestSuiteDescriptor</span></td><td><code>be79fcb227663895</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.JULRedirector</span></td><td><code>bae8ac50b3f8106a</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor</span></td><td><code>158ebe78860abda7</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.TestCompleteEvent</span></td><td><code>78275883c6a433ab</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.TestStartEvent</span></td><td><code>76ea24315a90ce0d</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor</span></td><td><code>4f2d24b271e058f0</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.junit.GenericJUnitTestEventAdapter</span></td><td><code>2246125f518fe8ed</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.junit.JUnitSpec</span></td><td><code>885144db12382fe7</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor</span></td><td><code>e47480b2eb2b01b1</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.junit.JUnitTestClassProcessor</span></td><td><code>ebf38d1471866dad</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.junit.JUnitTestEventAdapter</span></td><td><code>57d3a3d68d141974</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.junit.JUnitTestFramework.TestClassProcessorFactoryImpl</span></td><td><code>9b281f7cc335448c</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.junit.TestClassExecutionEventGenerator</span></td><td><code>cd120d5a7fd50179</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.processors.CaptureTestOutputTestResultProcessor</span></td><td><code>bd5bedd8ad4a5787</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.processors.DefaultStandardOutputRedirector</span></td><td><code>4ac63080dde11dd0</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.processors.DefaultStandardOutputRedirector.DiscardAction</span></td><td><code>b1b2c3fe575a0572</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.processors.DefaultStandardOutputRedirector.WriteAction</span></td><td><code>313e54868cd6f7bf</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.processors.TestOutputRedirector</span></td><td><code>3b6a0392c9e3dd02</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.processors.TestOutputRedirector.Forwarder</span></td><td><code>2f0a51434c23293a</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.results.AttachParentTestResultProcessor</span></td><td><code>c8b750f17dedd908</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer</span></td><td><code>b8b51deda2c6be68</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.DefaultTestClassDescriptorSerializer</span></td><td><code>981dc7082ca42d03</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.DefaultTestClassRunInfoSerializer</span></td><td><code>0e558f5d21676b42</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.DefaultTestDescriptorSerializer</span></td><td><code>24069b8bfe2ef353</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.DefaultTestMethodDescriptorSerializer</span></td><td><code>b435e9c5c8434370</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.DefaultTestOutputEventSerializer</span></td><td><code>994231ecd10fc8f7</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.DefaultTestSuiteDescriptorSerializer</span></td><td><code>67e6b11b94fbb882</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.IdSerializer</span></td><td><code>bfa2929e25b2057e</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.NullableSerializer</span></td><td><code>e351abc12fabcf84</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.TestCompleteEventSerializer</span></td><td><code>138e940183983474</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.TestStartEventSerializer</span></td><td><code>ac260cd90d1906f0</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestEventSerializer.WorkerTestSuiteDescriptorSerializer</span></td><td><code>8dc5f3cdad071782</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestWorker</span></td><td><code>f765b8dd1c5f0ba6</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.TestWorker.TestFrameworkServiceRegistry</span></td><td><code>0f4232129f60251b</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.WorkerTestClassProcessor</span></td><td><code>0f6525b02f2bb3d2</code></td></tr><tr><td><span class="el_class">org.gradle.api.internal.tasks.testing.worker.WorkerTestClassProcessor.WorkerTestSuiteDescriptor</span></td><td><code>b3807e9b92351840</code></td></tr><tr><td><span class="el_class">org.gradle.api.logging.LogLevel</span></td><td><code>236e938e30516638</code></td></tr><tr><td><span class="el_class">org.gradle.api.tasks.testing.TestOutputEvent.Destination</span></td><td><code>a16caef1c278a81f</code></td></tr><tr><td><span class="el_class">org.gradle.internal.SystemProperties</span></td><td><code>a463322dc2649d5c</code></td></tr><tr><td><span class="el_class">org.gradle.internal.actor.internal.DefaultActorFactory</span></td><td><code>a827afe119988eaa</code></td></tr><tr><td><span class="el_class">org.gradle.internal.actor.internal.DefaultActorFactory.BlockingActor</span></td><td><code>f8dc5b72f100bddb</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.AbstractDelegatingExecutorService</span></td><td><code>23206bedfd21e59c</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.CompositeStoppable</span></td><td><code>1461f8402c410907</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.CompositeStoppable.1</span></td><td><code>37a5a1e348c323fe</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.CompositeStoppable.2</span></td><td><code>c166124b41f2f689</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.DefaultExecutorFactory</span></td><td><code>e74e630a43bcfae6</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.DefaultExecutorFactory.TrackedManagedExecutor</span></td><td><code>7a0b92f548f75470</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.ExecutorPolicy.CatchAndRecordFailures</span></td><td><code>0848615ebf83b29a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.GradleThread</span></td><td><code>b8ae9796558406bb</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.GradleThread.1</span></td><td><code>a6792d792089eaab</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.ManagedExecutorImpl</span></td><td><code>283150dd314e1580</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.ManagedExecutorImpl.1</span></td><td><code>5b4d018a9a2569b2</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.ThreadFactoryImpl</span></td><td><code>6ae4ccac0bd595ef</code></td></tr><tr><td><span class="el_class">org.gradle.internal.concurrent.ThreadFactoryImpl.ManagedThreadRunnable</span></td><td><code>7ae0293da921f218</code></td></tr><tr><td><span class="el_class">org.gradle.internal.dispatch.ContextClassLoaderDispatch</span></td><td><code>b5a7e39bd4056940</code></td></tr><tr><td><span class="el_class">org.gradle.internal.dispatch.ContextClassLoaderProxy</span></td><td><code>4295807baa6fbb83</code></td></tr><tr><td><span class="el_class">org.gradle.internal.dispatch.MethodInvocation</span></td><td><code>42dad96b41c6ee94</code></td></tr><tr><td><span class="el_class">org.gradle.internal.dispatch.ProxyDispatchAdapter</span></td><td><code>56827e7cbc177632</code></td></tr><tr><td><span class="el_class">org.gradle.internal.dispatch.ProxyDispatchAdapter.DispatchingInvocationHandler</span></td><td><code>4d2ec2f0d621dbc5</code></td></tr><tr><td><span class="el_class">org.gradle.internal.dispatch.ReflectionDispatch</span></td><td><code>c398bad85d693f81</code></td></tr><tr><td><span class="el_class">org.gradle.internal.event.AbstractBroadcastDispatch</span></td><td><code>b41ea3e0d113345a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.event.BroadcastDispatch</span></td><td><code>aa3185d462680709</code></td></tr><tr><td><span class="el_class">org.gradle.internal.event.BroadcastDispatch.CompositeDispatch</span></td><td><code>239b373442eb89ca</code></td></tr><tr><td><span class="el_class">org.gradle.internal.event.BroadcastDispatch.EmptyDispatch</span></td><td><code>912a28f83ab0abda</code></td></tr><tr><td><span class="el_class">org.gradle.internal.event.BroadcastDispatch.SingletonDispatch</span></td><td><code>06d35ac36d0cbd3f</code></td></tr><tr><td><span class="el_class">org.gradle.internal.event.ListenerBroadcast</span></td><td><code>2fd809b78abb04a6</code></td></tr><tr><td><span class="el_class">org.gradle.internal.id.CompositeIdGenerator</span></td><td><code>5ec607aa701cdb85</code></td></tr><tr><td><span class="el_class">org.gradle.internal.id.CompositeIdGenerator.CompositeId</span></td><td><code>88f5896d7aba16ca</code></td></tr><tr><td><span class="el_class">org.gradle.internal.id.LongIdGenerator</span></td><td><code>c083976db54584f2</code></td></tr><tr><td><span class="el_class">org.gradle.internal.id.UUIDGenerator</span></td><td><code>f17be91a3fc5de50</code></td></tr><tr><td><span class="el_class">org.gradle.internal.io.BufferCaster</span></td><td><code>88afa8829d9f289a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.io.ClassLoaderObjectInputStream</span></td><td><code>393405e0e488b876</code></td></tr><tr><td><span class="el_class">org.gradle.internal.io.LinePerThreadBufferingOutputStream</span></td><td><code>4c22c5bdec2766ce</code></td></tr><tr><td><span class="el_class">org.gradle.internal.io.NullOutputStream</span></td><td><code>eefcfe0665bbfe4c</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.config.LoggingSystemAdapter</span></td><td><code>8f0b6fd77322290e</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.config.LoggingSystemAdapter.SnapshotImpl</span></td><td><code>e590383c86b5704f</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.CategorisedOutputEvent</span></td><td><code>18131b848c0c2cb6</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.EndOutputEvent</span></td><td><code>0d8edd2a5ce274ee</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.LogEvent</span></td><td><code>b4496e250fe31428</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.LogLevelChangeEvent</span></td><td><code>33b762c6d5852de7</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.OutputEvent</span></td><td><code>85bce87f1bcda18d</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.OutputEventListener</span></td><td><code>e7d50563f9531b49</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.OutputEventListener.1</span></td><td><code>5b11f4d785770608</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.RenderableOutputEvent</span></td><td><code>077bf3e337ccf01b</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.StyledTextOutputEvent</span></td><td><code>2d56b64ee1813bb2</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.events.StyledTextOutputEvent.Span</span></td><td><code>149016b236c727da</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.serializer.LogEventSerializer</span></td><td><code>b6d88af223db296a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.serializer.LogLevelChangeEventSerializer</span></td><td><code>f77a59533dde75ec</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.serializer.SpanSerializer</span></td><td><code>5f773b7d1ad07c9f</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.serializer.StyledTextOutputEventSerializer</span></td><td><code>faebed27ac3e65ba</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.services.DefaultLoggingManager</span></td><td><code>dd2054ad3066eb69</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.services.DefaultLoggingManager.StartableLoggingRouter</span></td><td><code>7eec82f71ca9dce8</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.services.DefaultLoggingManager.StartableLoggingSystem</span></td><td><code>95a3e74f0db03c31</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.services.DefaultLoggingManagerFactory</span></td><td><code>338467d213a0628e</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.services.LoggingServiceRegistry</span></td><td><code>e66c394bc507a36a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.services.LoggingServiceRegistry.1</span></td><td><code>8675ebc9856c9d1a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.services.LoggingServiceRegistry.CommandLineLogging</span></td><td><code>ab0f1ed36e5c4740</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.services.TextStreamOutputEventListener</span></td><td><code>b5a89fba7b872db9</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.sink.OutputEventListenerManager</span></td><td><code>d6dee3d6fea49020</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.sink.OutputEventListenerManager.1</span></td><td><code>1e218a705ff0ee7e</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.sink.OutputEventRenderer</span></td><td><code>bbea46be3e8b8977</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.sink.OutputEventRenderer.1</span></td><td><code>72270b4f6eaf1285</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.sink.OutputEventRenderer.2</span></td><td><code>099b7330ed4703b0</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.sink.OutputEventRenderer.LazyListener</span></td><td><code>a1deee1c4fac99af</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.sink.OutputEventRenderer.SnapshotImpl</span></td><td><code>f688bffd9443d32e</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.sink.OutputEventTransformer</span></td><td><code>482601cb582af6ff</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.slf4j.OutputEventListenerBackedLogger</span></td><td><code>ea2cc98bd59913ee</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.slf4j.OutputEventListenerBackedLoggerContext</span></td><td><code>c72214ba58203c79</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.slf4j.OutputEventListenerBackedLoggerContext.NoOpLogger</span></td><td><code>7b0a84c8aba8f307</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.slf4j.Slf4jLoggingConfigurer</span></td><td><code>c981e07959eeafd5</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.source.DefaultStdErrLoggingSystem</span></td><td><code>fd3dd0caab2f1d95</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.source.DefaultStdOutLoggingSystem</span></td><td><code>528bb39bfb67c3ae</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.source.JavaUtilLoggingSystem</span></td><td><code>b5a4117fb3de08f9</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.source.JavaUtilLoggingSystem.SnapshotImpl</span></td><td><code>1a132d0704da9300</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.source.PrintStreamLoggingSystem</span></td><td><code>f2900e765597c411</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.source.PrintStreamLoggingSystem.1</span></td><td><code>e58cca24f8655058</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.source.PrintStreamLoggingSystem.OutputEventDestination</span></td><td><code>7da88d262b3d264e</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.source.PrintStreamLoggingSystem.PrintStreamDestination</span></td><td><code>5abb2428225cfcc7</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.source.PrintStreamLoggingSystem.SnapshotImpl</span></td><td><code>3383a293021bc6f5</code></td></tr><tr><td><span class="el_class">org.gradle.internal.logging.text.StyledTextOutput.Style</span></td><td><code>55495f1c332662ef</code></td></tr><tr><td><span class="el_class">org.gradle.internal.nativeintegration.filesystem.services.FileSystemServices</span></td><td><code>1e213eb8fbaf37c6</code></td></tr><tr><td><span class="el_class">org.gradle.internal.nativeintegration.jansi.DefaultJansiRuntimeResolver</span></td><td><code>1aa17f25c9c1cad4</code></td></tr><tr><td><span class="el_class">org.gradle.internal.nativeintegration.jansi.JansiBootPathConfigurer</span></td><td><code>edceba04f62f871b</code></td></tr><tr><td><span class="el_class">org.gradle.internal.nativeintegration.jansi.JansiLibraryFactory</span></td><td><code>0cbaac430d6656c4</code></td></tr><tr><td><span class="el_class">org.gradle.internal.nativeintegration.jansi.JansiStorageLocator</span></td><td><code>c8bff1ccb071f9b6</code></td></tr><tr><td><span class="el_class">org.gradle.internal.nativeintegration.services.NativeServices</span></td><td><code>42e5aaddc7376319</code></td></tr><tr><td><span class="el_class">org.gradle.internal.operations.CurrentBuildOperationRef</span></td><td><code>8ab145c17efc4209</code></td></tr><tr><td><span class="el_class">org.gradle.internal.reflect.JavaMethod</span></td><td><code>7b8c3252a7f187d3</code></td></tr><tr><td><span class="el_class">org.gradle.internal.reflect.JavaReflectionUtil</span></td><td><code>42549b462b1ace1f</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.KryoBackedMessageSerializer</span></td><td><code>0028157720ec1f27</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.ConnectionSet</span></td><td><code>323708d9214e34e4</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.ConnectionState</span></td><td><code>250fb1b274991d9a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.DefaultMethodArgsSerializer</span></td><td><code>d5e6f5d023b38220</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.DefaultMethodArgsSerializer.ArraySerializer</span></td><td><code>5e0ee8a76757a209</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.DefaultMethodArgsSerializer.EmptyArraySerializer</span></td><td><code>57c888e08bc55b59</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.IncomingQueue</span></td><td><code>0e8ecdb8f31efe51</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.InterHubMessageSerializer</span></td><td><code>7d84d4aa85858c73</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.InterHubMessageSerializer.MessageReader</span></td><td><code>589fb24b6bfaa4f2</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.InterHubMessageSerializer.MessageWriter</span></td><td><code>ffd06dede1ec12e1</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.JavaSerializationBackedMethodArgsSerializer</span></td><td><code>d5930526762bdcd0</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHub</span></td><td><code>9f96032b3a5a9716</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHub.ChannelDispatch</span></td><td><code>6caf804119d14597</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHub.ConnectionDispatch</span></td><td><code>c7e7f1a18e3bc26a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHub.ConnectionReceive</span></td><td><code>f62650e3b4dcb6fa</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHub.Discard</span></td><td><code>2f8747e821e907ad</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHub.Handler</span></td><td><code>e792ac3d94c0ab79</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHub.State</span></td><td><code>408ebc3d87fb0a1d</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHubBackedClient</span></td><td><code>1ca9124c3c43dc63</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection</span></td><td><code>273486b97722d800</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection.1</span></td><td><code>d800458b929f7046</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection.2</span></td><td><code>268f1d73ad4569ea</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection.DispatchWrapper</span></td><td><code>6145e9bfae7fadf2</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MethodInvocationSerializer</span></td><td><code>79d8ac22fa084107</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MethodInvocationSerializer.MethodDetails</span></td><td><code>97c08e229cf2f706</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MethodInvocationSerializer.MethodInvocationReader</span></td><td><code>2dcccca3f736353e</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.MethodInvocationSerializer.MethodInvocationWriter</span></td><td><code>32d6d78f7688cf73</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.OutgoingQueue</span></td><td><code>fbcc05506ad40c68</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.protocol.ChannelIdentifier</span></td><td><code>7697ff6a7c712869</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.protocol.ChannelMessage</span></td><td><code>2d2377595ca09c59</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.protocol.EndOfStream</span></td><td><code>f29ffed85365f7db</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.protocol.InterHubMessage</span></td><td><code>0c6e49b6ec077e16</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.protocol.InterHubMessage.Delivery</span></td><td><code>0652d09c2a7fd1ac</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.queue.EndPointQueue</span></td><td><code>1ba76930e322768a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.queue.MultiChannelQueue</span></td><td><code>bcaac9c224068764</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.queue.MultiEndPointQueue</span></td><td><code>877e450fa1a4929c</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.queue.MultiEndPointQueue.1</span></td><td><code>c2149b37328f20ba</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.hub.queue.QueueInitializer</span></td><td><code>ad18361c23e679b1</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.MultiChoiceAddress</span></td><td><code>baed07b5f914c9cf</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.MultiChoiceAddressSerializer</span></td><td><code>7ffc395650705aaa</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.SocketConnectCompletion</span></td><td><code>043dfacd5541c9ce</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.SocketConnection</span></td><td><code>6522837d6bb59d9c</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.SocketConnection.1</span></td><td><code>fa4eb14400906674</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.SocketConnection.SocketInputStream</span></td><td><code>74c3122e675b233a</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.SocketConnection.SocketOutputStream</span></td><td><code>d59cae8197783746</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.SocketInetAddress</span></td><td><code>0865a3bf370371aa</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.SocketInetAddress.Serializer</span></td><td><code>8b015ba9d4fce663</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.internal.inet.TcpOutgoingConnector</span></td><td><code>0be7a610727e4e51</code></td></tr><tr><td><span class="el_class">org.gradle.internal.remote.services.MessagingServices</span></td><td><code>5e0d29677347fb87</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.AbstractCollectionSerializer</span></td><td><code>c675610254ba4631</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.AbstractDecoder</span></td><td><code>f8ea003b737fe452</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.AbstractEncoder</span></td><td><code>7d071221f309c0c2</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.AbstractEncoder.EncoderStream</span></td><td><code>46761e38ddadc6b2</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.AbstractSerializer</span></td><td><code>d5cd8744f99ef12d</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory</span></td><td><code>54b85995dd5907e5</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.BooleanSerializer</span></td><td><code>96aea5b417f5173c</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.ByteArraySerializer</span></td><td><code>93037a866c9218fe</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.ByteSerializer</span></td><td><code>3215f41b31678d04</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.DoubleSerializer</span></td><td><code>5ea52dca4538b9cf</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.EnumSerializer</span></td><td><code>a445886143f48aa5</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.FileSerializer</span></td><td><code>7b1d73b42bd5a087</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.FloatSerializer</span></td><td><code>6f9a4c4094fe4673</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.IntegerSerializer</span></td><td><code>9544b8f39fefe511</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.LongSerializer</span></td><td><code>77a58e2bd08fb16b</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.ShortSerializer</span></td><td><code>b2809f34ec613bcc</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.StringMapSerializer</span></td><td><code>17b1fb614d438e50</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.StringSerializer</span></td><td><code>ff94c6bd23d919d8</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.BaseSerializerFactory.ThrowableSerializer</span></td><td><code>3df7463631dbc8d6</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.DefaultSerializer</span></td><td><code>8fd764763e0a695c</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.DefaultSerializerRegistry</span></td><td><code>592024db2f308bed</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.DefaultSerializerRegistry.1</span></td><td><code>e28269caa27b24ce</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.DefaultSerializerRegistry.HierarchySerializerMatcher</span></td><td><code>f996899af834fd07</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.DefaultSerializerRegistry.SerializerClassMatcherStrategy</span></td><td><code>ea41ce56597ac713</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.DefaultSerializerRegistry.StrictSerializerMatcher</span></td><td><code>938217b27a52b622</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.DefaultSerializerRegistry.TaggedTypeSerializer</span></td><td><code>3646b4567aef9ae8</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.DefaultSerializerRegistry.TypeInfo</span></td><td><code>83a7b42f0ba07a48</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.ExceptionReplacingObjectOutputStream</span></td><td><code>301297d483978ba8</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.ExceptionReplacingObjectOutputStream.1</span></td><td><code>54c2c469d202cd08</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.HashCodeSerializer</span></td><td><code>4cc78fc15c246fbf</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.InputStreamBackedDecoder</span></td><td><code>dbf1a08967db76b8</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.ListSerializer</span></td><td><code>fe472a367fb15381</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.Message</span></td><td><code>f2adda77589b5da2</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.kryo.KryoBackedDecoder</span></td><td><code>0d63a47171163895</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.kryo.KryoBackedEncoder</span></td><td><code>12bb6b4cf246b81f</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.kryo.TypeSafeSerializer</span></td><td><code>ddb7ea8c69eb42c3</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.kryo.TypeSafeSerializer.1</span></td><td><code>e499d9412090c635</code></td></tr><tr><td><span class="el_class">org.gradle.internal.serialize.kryo.TypeSafeSerializer.2</span></td><td><code>b13e89e003f61d82</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.AbstractServiceMethod</span></td><td><code>d8f9bf72435aa0d5</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceMethodFactory</span></td><td><code>5486c577115efd3c</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry</span></td><td><code>30d28b8aa5d5e340</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.CompositeServiceProvider</span></td><td><code>eee53455dd345f97</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.FactoryMethodService</span></td><td><code>cc88e307443d45b2</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.FactoryService</span></td><td><code>af29e849040847fb</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.ManagedObjectServiceProvider</span></td><td><code>3910f2743acb72eb</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.OwnServices</span></td><td><code>4f44709519dc0d22</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.OwnServices.ProviderAnalyser</span></td><td><code>d13e77394851e636</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.ParentServices</span></td><td><code>7ed451cbc338071c</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.SingletonService</span></td><td><code>be023fd870baaa97</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.SingletonService.BindState</span></td><td><code>744d46dc71eea96f</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.DefaultServiceRegistry.State</span></td><td><code>0f77f7d7d4cf8e36</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.MethodHandleBasedServiceMethod</span></td><td><code>b2fda0561994a9ab</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.MethodHandleBasedServiceMethodFactory</span></td><td><code>47e87df4713e4ce5</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.ReflectionBasedServiceMethod</span></td><td><code>8e916b1f0894f32f</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.RelevantMethods</span></td><td><code>542516b051995f02</code></td></tr><tr><td><span class="el_class">org.gradle.internal.service.RelevantMethodsBuilder</span></td><td><code>1f2519d9e4a71ffa</code></td></tr><tr><td><span class="el_class">org.gradle.internal.time.MonotonicClock</span></td><td><code>f8848f7856b21ef8</code></td></tr><tr><td><span class="el_class">org.gradle.internal.time.Time</span></td><td><code>118854647ab7eed4</code></td></tr><tr><td><span class="el_class">org.gradle.internal.time.TimeSource</span></td><td><code>a96871955c3b895e</code></td></tr><tr><td><span class="el_class">org.gradle.internal.time.TimeSource.1</span></td><td><code>6de78f6b0e44a7b2</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.WorkerLoggingSerializer</span></td><td><code>adae78bad8b0e727</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.ActionExecutionWorker</span></td><td><code>c2df19d0c0a518cd</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.ActionExecutionWorker.1</span></td><td><code>9a5ec84813a9aae2</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.ActionExecutionWorker.2</span></td><td><code>68c0a6b96a6d9eed</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.DefaultWorkerDirectoryProvider</span></td><td><code>0ad8aeb16d1a73f5</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker</span></td><td><code>6fe393320a272a2f</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.1</span></td><td><code>09df809a5740d16d</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.PrintUnrecoverableErrorToFileHandler</span></td><td><code>83f17f1650125a84</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.WorkerServices</span></td><td><code>cc95b274f6146aa2</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.WorkerServices.1</span></td><td><code>aa3fdc473aab03f0</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.SystemApplicationClassLoaderWorker.WorkerServices.1.1</span></td><td><code>7922b36356a5ac14</code></td></tr><tr><td><span class="el_class">org.gradle.process.internal.worker.child.WorkerLogEventListener</span></td><td><code>cad93c6bed97bc06</code></td></tr><tr><td><span class="el_class">org.hamcrest.BaseMatcher</span></td><td><code>7faa14942a96e4b2</code></td></tr><tr><td><span class="el_class">org.hamcrest.Description</span></td><td><code>81ff3b4d8f937bd9</code></td></tr><tr><td><span class="el_class">org.hamcrest.Description.NullDescription</span></td><td><code>5a43dc37728d10be</code></td></tr><tr><td><span class="el_class">org.hamcrest.DiagnosingMatcher</span></td><td><code>bf044bf378c4d091</code></td></tr><tr><td><span class="el_class">org.hamcrest.MatcherAssert</span></td><td><code>c15b1369a67a24c4</code></td></tr><tr><td><span class="el_class">org.hamcrest.Matchers</span></td><td><code>8c63218948b9cffd</code></td></tr><tr><td><span class="el_class">org.hamcrest.Matchers.contains.1</span></td><td><code>22becce296084e01</code></td></tr><tr><td><span class="el_class">org.hamcrest.Matchers.containsString.2</span></td><td><code>c6393be37accd989</code></td></tr><tr><td><span class="el_class">org.hamcrest.Matchers.hasItem.0</span></td><td><code>d41b0a3f572d1d93</code></td></tr><tr><td><span class="el_class">org.hamcrest.Matchers.instanceOf</span></td><td><code>d0ac406ad7fad0b8</code></td></tr><tr><td><span class="el_class">org.hamcrest.Matchers.not.3</span></td><td><code>95ce27c6f539c976</code></td></tr><tr><td><span class="el_class">org.hamcrest.TypeSafeDiagnosingMatcher</span></td><td><code>1a081671af395978</code></td></tr><tr><td><span class="el_class">org.hamcrest.TypeSafeMatcher</span></td><td><code>74c291abe57e8c0d</code></td></tr><tr><td><span class="el_class">org.hamcrest.collection.IsIterableContainingInOrder</span></td><td><code>8397a7b9fa743bf1</code></td></tr><tr><td><span class="el_class">org.hamcrest.collection.IsIterableContainingInOrder.MatchSeries</span></td><td><code>6e6b5e79ece2a828</code></td></tr><tr><td><span class="el_class">org.hamcrest.core.IsCollectionContaining</span></td><td><code>0966007e39a1e078</code></td></tr><tr><td><span class="el_class">org.hamcrest.core.IsInstanceOf</span></td><td><code>005c81b9f8d5a66d</code></td></tr><tr><td><span class="el_class">org.hamcrest.core.IsNot</span></td><td><code>881c8bcc9837f289</code></td></tr><tr><td><span class="el_class">org.hamcrest.core.StringContains</span></td><td><code>bedae5a2afe9c1ed</code></td></tr><tr><td><span class="el_class">org.hamcrest.core.SubstringMatcher</span></td><td><code>8809d380c24f9943</code></td></tr><tr><td><span class="el_class">org.hamcrest.internal.ReflectiveTypeFinder</span></td><td><code>aba3c47e262d4b21</code></td></tr><tr><td><span class="el_class">org.junit.Assert</span></td><td><code>78fc7dec7d95195c</code></td></tr><tr><td><span class="el_class">org.junit.Assert.assertEquals.0</span></td><td><code>30379a769185614c</code></td></tr><tr><td><span class="el_class">org.junit.Assert.assertThat</span></td><td><code>c48336a93da4860b</code></td></tr><tr><td><span class="el_class">org.junit.internal.MethodSorter</span></td><td><code>ae094a8ce1747b79</code></td></tr><tr><td><span class="el_class">org.junit.internal.MethodSorter.1</span></td><td><code>d3997b4bdb7889c1</code></td></tr><tr><td><span class="el_class">org.junit.internal.MethodSorter.2</span></td><td><code>c8e6351cbf098013</code></td></tr><tr><td><span class="el_class">org.junit.internal.builders.AllDefaultPossibilitiesBuilder</span></td><td><code>2d26b5eadd1a8c2a</code></td></tr><tr><td><span class="el_class">org.junit.internal.builders.AnnotatedBuilder</span></td><td><code>b6759f9e68d937a7</code></td></tr><tr><td><span class="el_class">org.junit.internal.builders.IgnoredBuilder</span></td><td><code>e152f333c53967a6</code></td></tr><tr><td><span class="el_class">org.junit.internal.builders.JUnit3Builder</span></td><td><code>4a2cc8e608e1275e</code></td></tr><tr><td><span class="el_class">org.junit.internal.builders.JUnit4Builder</span></td><td><code>5902b7da0403f55c</code></td></tr><tr><td><span class="el_class">org.junit.internal.builders.SuiteMethodBuilder</span></td><td><code>1df136431e07e393</code></td></tr><tr><td><span class="el_class">org.junit.internal.requests.ClassRequest</span></td><td><code>cbba192d9af40c26</code></td></tr><tr><td><span class="el_class">org.junit.internal.runners.model.EachTestNotifier</span></td><td><code>ff8c3fbb105e71ef</code></td></tr><tr><td><span class="el_class">org.junit.internal.runners.model.ReflectiveCallable</span></td><td><code>d591724635588bcb</code></td></tr><tr><td><span class="el_class">org.junit.internal.runners.rules.RuleFieldValidator</span></td><td><code>fbc09f9fcb2f9c1a</code></td></tr><tr><td><span class="el_class">org.junit.internal.runners.statements.InvokeMethod</span></td><td><code>fa03219f4a4eb968</code></td></tr><tr><td><span class="el_class">org.junit.internal.runners.statements.RunAfters</span></td><td><code>fe6de60738f75318</code></td></tr><tr><td><span class="el_class">org.junit.internal.runners.statements.RunBefores</span></td><td><code>d209dd5542986723</code></td></tr><tr><td><span class="el_class">org.junit.runner.Description</span></td><td><code>c3b4a36e785ee4be</code></td></tr><tr><td><span class="el_class">org.junit.runner.Request</span></td><td><code>2501a2515fbe4d86</code></td></tr><tr><td><span class="el_class">org.junit.runner.Runner</span></td><td><code>f5abacc70e2e08a4</code></td></tr><tr><td><span class="el_class">org.junit.runner.notification.RunListener</span></td><td><code>3350f142e74350a4</code></td></tr><tr><td><span class="el_class">org.junit.runner.notification.RunNotifier</span></td><td><code>b34e922304507f84</code></td></tr><tr><td><span class="el_class">org.junit.runner.notification.RunNotifier.3</span></td><td><code>4b1a15148beab121</code></td></tr><tr><td><span class="el_class">org.junit.runner.notification.RunNotifier.7</span></td><td><code>c8d33a2e217dded2</code></td></tr><tr><td><span class="el_class">org.junit.runner.notification.RunNotifier.SafeNotifier</span></td><td><code>19d584cef25f3ec4</code></td></tr><tr><td><span class="el_class">org.junit.runners.model.FrameworkField</span></td><td><code>483e074f630c2720</code></td></tr><tr><td><span class="el_class">org.junit.runners.model.FrameworkMember</span></td><td><code>6b9f1505fe4f5d84</code></td></tr><tr><td><span class="el_class">org.junit.runners.model.FrameworkMethod</span></td><td><code>78c84f58af3747e6</code></td></tr><tr><td><span class="el_class">org.junit.runners.model.FrameworkMethod.1</span></td><td><code>52edf435461bec2b</code></td></tr><tr><td><span class="el_class">org.junit.runners.model.MultipleFailureException</span></td><td><code>60322beb1d5c649b</code></td></tr><tr><td><span class="el_class">org.junit.runners.model.RunnerBuilder</span></td><td><code>0281d51b4f8328d4</code></td></tr><tr><td><span class="el_class">org.junit.runners.model.Statement</span></td><td><code>9a75aa5de27bf4d5</code></td></tr><tr><td><span class="el_class">org.junit.runners.model.TestClass</span></td><td><code>2bf85bd14e16d25e</code></td></tr><tr><td><span class="el_class">org.mockito.Answers</span></td><td><code>b6b56a6ae7d3f4c7</code></td></tr><tr><td><span class="el_class">org.mockito.ArgumentMatcher</span></td><td><code>911ac4e9a3ecb2d4</code></td></tr><tr><td><span class="el_class">org.mockito.Matchers</span></td><td><code>973c6c2aa8045a6b</code></td></tr><tr><td><span class="el_class">org.mockito.Mockito</span></td><td><code>b8b5489470d2b214</code></td></tr><tr><td><span class="el_class">org.mockito.Mockito.mock</span></td><td><code>e823a71128ca2f01</code></td></tr><tr><td><span class="el_class">org.mockito.Mockito.verify.1</span></td><td><code>1417b058eb58eb53</code></td></tr><tr><td><span class="el_class">org.mockito.Mockito.when.0</span></td><td><code>630e6d9a051e81c9</code></td></tr><tr><td><span class="el_class">org.mockito.asm.ByteVector</span></td><td><code>af7389b07c822cd3</code></td></tr><tr><td><span class="el_class">org.mockito.asm.ClassAdapter</span></td><td><code>b5f5397645f66f87</code></td></tr><tr><td><span class="el_class">org.mockito.asm.ClassReader</span></td><td><code>6a413261201b619b</code></td></tr><tr><td><span class="el_class">org.mockito.asm.ClassWriter</span></td><td><code>87d3a03013256d90</code></td></tr><tr><td><span class="el_class">org.mockito.asm.Edge</span></td><td><code>056395b1c879cd7b</code></td></tr><tr><td><span class="el_class">org.mockito.asm.FieldWriter</span></td><td><code>2d3fdb7ca946f51e</code></td></tr><tr><td><span class="el_class">org.mockito.asm.Frame</span></td><td><code>337d1349eb7e7c25</code></td></tr><tr><td><span class="el_class">org.mockito.asm.Item</span></td><td><code>d1a7b92d3edf071e</code></td></tr><tr><td><span class="el_class">org.mockito.asm.Label</span></td><td><code>0f9bf902363aa21f</code></td></tr><tr><td><span class="el_class">org.mockito.asm.MethodAdapter</span></td><td><code>e7418f5974a8ea3a</code></td></tr><tr><td><span class="el_class">org.mockito.asm.MethodWriter</span></td><td><code>0db3c162134fa834</code></td></tr><tr><td><span class="el_class">org.mockito.asm.Type</span></td><td><code>a2bf3411c45e9eee</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.AbstractClassGenerator</span></td><td><code>ace4e3c36c81f198</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.AbstractClassGenerator.1</span></td><td><code>ce68601944a7b7f9</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.AbstractClassGenerator.Source</span></td><td><code>7cafb260c94e7fa2</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ClassEmitter</span></td><td><code>23efd2e2d7157421</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ClassEmitter.1</span></td><td><code>3dd19c9d7c55adab</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ClassEmitter.2</span></td><td><code>612117e23f18de45</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ClassEmitter.3</span></td><td><code>b60915cc74eb0be1</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ClassEmitter.FieldInfo</span></td><td><code>6f64c83801e1c395</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ClassInfo</span></td><td><code>3f61d574d41a7695</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ClassNameReader</span></td><td><code>fd90fea5ad0a7832</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ClassNameReader.1</span></td><td><code>beb986eef1c45333</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ClassNameReader.EarlyExitException</span></td><td><code>5ab82af553fbb340</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.CodeEmitter</span></td><td><code>8f9ef8d6cadc341c</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.CodeEmitter.State</span></td><td><code>bb664069bce6e44f</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.CollectionUtils</span></td><td><code>a285e36e53004a03</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.Constants</span></td><td><code>37b5dedc3009ca46</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.DebuggingClassWriter</span></td><td><code>cbc92c9f33b07ef5</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.DebuggingClassWriter.1</span></td><td><code>91614bff8ac4edc1</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.DefaultGeneratorStrategy</span></td><td><code>72dcc49c123821cf</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.DefaultNamingPolicy</span></td><td><code>4761fc9cd5e28f3f</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.DuplicatesPredicate</span></td><td><code>5062040a6a7dd0b4</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils</span></td><td><code>687f5f945cc9f376</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils.10</span></td><td><code>b85e0f7ce587f90c</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils.13</span></td><td><code>15d976ed88964ff5</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils.14</span></td><td><code>6297b8128611fdbe</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils.5</span></td><td><code>fca83ea194bc281c</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils.6</span></td><td><code>58a44c7a1851e83b</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils.7</span></td><td><code>efa17aebae616ad3</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils.8</span></td><td><code>8ee54f4ec05ca249</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils.9</span></td><td><code>d83a1aac4b3979ee</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.EmitUtils.ArrayDelimiters</span></td><td><code>add6ad787725cb2c</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.KeyFactory</span></td><td><code>b76b1c12f093cd56</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.KeyFactory.1</span></td><td><code>79e3651761ef6a60</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.KeyFactory.2</span></td><td><code>2440b90f1f0b74bd</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.KeyFactory.Generator</span></td><td><code>4f3dda1042a4a43a</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.Local</span></td><td><code>ed0af2b3692b8cea</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.LocalVariablesSorter</span></td><td><code>7cac4c682184acc6</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.LocalVariablesSorter.State</span></td><td><code>27fffbe668cff303</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.MethodInfo</span></td><td><code>17004cea4031d801</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.MethodInfoTransformer</span></td><td><code>d3febd4a80c64091</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.MethodWrapper</span></td><td><code>f40a43bf40c98ccf</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.MethodWrapper.MethodWrapperKey..KeyFactoryByCGLIB..2139e083</span></td><td><code>2ad7400ac7e37d0f</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ReflectUtils</span></td><td><code>348d7b6340721078</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ReflectUtils.1</span></td><td><code>a9ed939840ab85d8</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ReflectUtils.2</span></td><td><code>3e5145c87be03cc6</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ReflectUtils.3</span></td><td><code>42df6d7e8630c40d</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.ReflectUtils.4</span></td><td><code>8a083652a85864ab</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.RejectModifierPredicate</span></td><td><code>2abe513eec7bf30c</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.Signature</span></td><td><code>a1f6b7ac5e613e32</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.TypeUtils</span></td><td><code>fccd7e1e9df147e2</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.core.VisibilityPredicate</span></td><td><code>e5d44b3e6fda7d23</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.CallbackInfo</span></td><td><code>b999f468e5bbf33d</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.DispatcherGenerator</span></td><td><code>e604e230e0bd2b75</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.Enhancer</span></td><td><code>3943df8641bd17c9</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.Enhancer.1</span></td><td><code>febc5c834b6e4df8</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.Enhancer.2</span></td><td><code>808e450d0a867446</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.Enhancer.3</span></td><td><code>3c1e17f24a2cc3c7</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.Enhancer.4</span></td><td><code>a3c81105dbd8c1b1</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.Enhancer.5</span></td><td><code>f9d03e299c1dc542</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.Enhancer.6</span></td><td><code>b45914f02e4f54f8</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.Enhancer.EnhancerKey..KeyFactoryByCGLIB..1e94e966</span></td><td><code>127fd78c465cae86</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.FixedValueGenerator</span></td><td><code>933178e3d119cb46</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.InvocationHandlerGenerator</span></td><td><code>56366f9f4bb81c98</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.LazyLoaderGenerator</span></td><td><code>3e71ca28a8daef04</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.MethodInterceptorGenerator</span></td><td><code>b2baa1baf92a3634</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.MethodInterceptorGenerator.1</span></td><td><code>982b42920fc54fd2</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.MethodInterceptorGenerator.2</span></td><td><code>d26ba50a4349f949</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.MethodProxy</span></td><td><code>6f9b285ba40f121c</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.MethodProxy.CreateInfo</span></td><td><code>3e9c996f3ee27ba8</code></td></tr><tr><td><span class="el_class">org.mockito.cglib.proxy.NoOpGenerator</span></td><td><code>1671f820fa859fc6</code></td></tr><tr><td><span class="el_class">org.mockito.configuration.DefaultMockitoConfiguration</span></td><td><code>0bb93d7375ae688a</code></td></tr><tr><td><span class="el_class">org.mockito.exceptions.Reporter</span></td><td><code>b00047b57b7f82eb</code></td></tr><tr><td><span class="el_class">org.mockito.internal.MockitoCore</span></td><td><code>4fcf9157d4c5653c</code></td></tr><tr><td><span class="el_class">org.mockito.internal.configuration.ClassPathLoader</span></td><td><code>79270ef69d3af05a</code></td></tr><tr><td><span class="el_class">org.mockito.internal.configuration.GlobalConfiguration</span></td><td><code>f6c2dce90a76e19b</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.AbstractMockitoMethodProxy</span></td><td><code>f2a2ad832150e927</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.CglibMockMaker</span></td><td><code>d11f06dd6d4f441b</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.DelegatingMethod</span></td><td><code>2a5a7ab111ec6fc5</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.DelegatingMockitoMethodProxy</span></td><td><code>754d5c59127a0923</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.MethodInterceptorFilter</span></td><td><code>e4358559543ce141</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.MockSettingsImpl</span></td><td><code>e481f61ec70d04da</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.cglib.CGLIBHacker</span></td><td><code>f56a296de9dd5e34</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.cglib.MockitoNamingPolicy</span></td><td><code>354095949ea7a167</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.jmock.ClassImposterizer</span></td><td><code>06f52780a3af7370</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.jmock.ClassImposterizer.1</span></td><td><code>53ad42272c2f7199</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.jmock.ClassImposterizer.2</span></td><td><code>f484390017e9caad</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.jmock.ClassImposterizer.3</span></td><td><code>0a899f3a35d77893</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.jmock.SearchingClassLoader</span></td><td><code>fb888ab8114e0445</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.jmock.SerializableNoOp</span></td><td><code>5193e1ba6764b479</code></td></tr><tr><td><span class="el_class">org.mockito.internal.creation.settings.CreationSettings</span></td><td><code>66ef7cf25a522701</code></td></tr><tr><td><span class="el_class">org.mockito.internal.debugging.Localized</span></td><td><code>11a71c625753d7ed</code></td></tr><tr><td><span class="el_class">org.mockito.internal.debugging.LocationImpl</span></td><td><code>6d049b80c5d947fa</code></td></tr><tr><td><span class="el_class">org.mockito.internal.exceptions.stacktrace.DefaultStackTraceCleaner</span></td><td><code>c2d87eaacdb06959</code></td></tr><tr><td><span class="el_class">org.mockito.internal.exceptions.stacktrace.DefaultStackTraceCleanerProvider</span></td><td><code>8ca8fa4e2edda277</code></td></tr><tr><td><span class="el_class">org.mockito.internal.exceptions.stacktrace.StackTraceFilter</span></td><td><code>4f33437a9c542d4a</code></td></tr><tr><td><span class="el_class">org.mockito.internal.handler.InvocationNotifierHandler</span></td><td><code>ae03b3a3b475b8ba</code></td></tr><tr><td><span class="el_class">org.mockito.internal.handler.MockHandlerFactory</span></td><td><code>58c8cdb23d341e06</code></td></tr><tr><td><span class="el_class">org.mockito.internal.handler.MockHandlerImpl</span></td><td><code>0f161a86e2101250</code></td></tr><tr><td><span class="el_class">org.mockito.internal.handler.NullResultGuardian</span></td><td><code>7f9c7950d6d323cc</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.ArgumentsComparator</span></td><td><code>8321c1e9e4a87617</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.ArgumentsProcessor</span></td><td><code>f5663cd205f9d333</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.InvocationImpl</span></td><td><code>34891f4fcb84d76c</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.InvocationMarker</span></td><td><code>a3b5a4befa9054bf</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.InvocationMatcher</span></td><td><code>de5a0377b68a2985</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.InvocationsFinder</span></td><td><code>36866ce3c13f8a68</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.InvocationsFinder.RemoveNotMatching</span></td><td><code>6eea6374f1a0241a</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.MatchersBinder</span></td><td><code>24972441f47f2e18</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.StubInfoImpl</span></td><td><code>c564d67c0d8dd389</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.realmethod.CGLIBProxyRealMethod</span></td><td><code>b0c2bf57b415435e</code></td></tr><tr><td><span class="el_class">org.mockito.internal.invocation.realmethod.FilteredCGLIBProxyRealMethod</span></td><td><code>542fabaa718897c5</code></td></tr><tr><td><span class="el_class">org.mockito.internal.matchers.Equality</span></td><td><code>c1810a5237a1985a</code></td></tr><tr><td><span class="el_class">org.mockito.internal.matchers.Equals</span></td><td><code>d40f3c463089720d</code></td></tr><tr><td><span class="el_class">org.mockito.internal.progress.ArgumentMatcherStorageImpl</span></td><td><code>a331f23d12cfeaf6</code></td></tr><tr><td><span class="el_class">org.mockito.internal.progress.HandyReturnValues</span></td><td><code>4654a6455a90f052</code></td></tr><tr><td><span class="el_class">org.mockito.internal.progress.MockingProgressImpl</span></td><td><code>e1bb3ffb1d35be74</code></td></tr><tr><td><span class="el_class">org.mockito.internal.progress.SequenceNumber</span></td><td><code>53d4faf3dd2bbe5f</code></td></tr><tr><td><span class="el_class">org.mockito.internal.progress.ThreadSafeMockingProgress</span></td><td><code>e9bedd52cff1a9fe</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.BaseStubbing</span></td><td><code>a318815af5384399</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.ConsecutiveStubbing</span></td><td><code>059100f430725e9e</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.InvocationContainerImpl</span></td><td><code>b0b3f35073df35a8</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.OngoingStubbingImpl</span></td><td><code>9cb9def61ff5a10a</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.StubbedInvocationMatcher</span></td><td><code>b295d52b44056288</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.answers.AnswersValidator</span></td><td><code>234c4fb3c4440c9d</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.answers.CallsRealMethods</span></td><td><code>f5f749f40ca12284</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.answers.MethodInfo</span></td><td><code>00dd9bfe0674299c</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.answers.Returns</span></td><td><code>b6dc2cb0c94090b8</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.defaultanswers.GloballyConfiguredAnswer</span></td><td><code>f0a7c0c1e379bbb6</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.defaultanswers.ReturnsDeepStubs</span></td><td><code>4a651c86803271fa</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.defaultanswers.ReturnsEmptyValues</span></td><td><code>41ba8c8b5e7ac127</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.defaultanswers.ReturnsMocks</span></td><td><code>f067bba50b339409</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.defaultanswers.ReturnsMoreEmptyValues</span></td><td><code>6c23413492f72c2e</code></td></tr><tr><td><span class="el_class">org.mockito.internal.stubbing.defaultanswers.ReturnsSmartNulls</span></td><td><code>70dad87977d1c198</code></td></tr><tr><td><span class="el_class">org.mockito.internal.util.MockCreationValidator</span></td><td><code>dc0a1047f97b1a76</code></td></tr><tr><td><span class="el_class">org.mockito.internal.util.MockNameImpl</span></td><td><code>60248fff1ef2e059</code></td></tr><tr><td><span class="el_class">org.mockito.internal.util.MockUtil</span></td><td><code>bd0c61966cf26cb1</code></td></tr><tr><td><span class="el_class">org.mockito.internal.util.ObjectMethodsGuru</span></td><td><code>297eb656d589bd1c</code></td></tr><tr><td><span class="el_class">org.mockito.internal.util.Primitives</span></td><td><code>fea08f06209492b6</code></td></tr><tr><td><span class="el_class">org.mockito.internal.util.collections.ListUtil</span></td><td><code>d72e29cbdec0390f</code></td></tr><tr><td><span class="el_class">org.mockito.internal.verification.MockAwareVerificationMode</span></td><td><code>cd0ec11d56b6b71f</code></td></tr><tr><td><span class="el_class">org.mockito.internal.verification.RegisteredInvocations</span></td><td><code>a0f5fa92553b069c</code></td></tr><tr><td><span class="el_class">org.mockito.internal.verification.RegisteredInvocations.RemoveToString</span></td><td><code>353b434b82799924</code></td></tr><tr><td><span class="el_class">org.mockito.internal.verification.Times</span></td><td><code>e71236e58ec6e05b</code></td></tr><tr><td><span class="el_class">org.mockito.internal.verification.VerificationDataImpl</span></td><td><code>383eb89e3411f4df</code></td></tr><tr><td><span class="el_class">org.mockito.internal.verification.VerificationModeFactory</span></td><td><code>f1919c7efd354abf</code></td></tr><tr><td><span class="el_class">org.mockito.internal.verification.checkers.MissingInvocationChecker</span></td><td><code>5fda2c19a4d9a139</code></td></tr><tr><td><span class="el_class">org.mockito.internal.verification.checkers.NumberOfInvocationsChecker</span></td><td><code>f43054000771cf2b</code></td></tr><tr><td><span class="el_class">org.mockito.stubbing.OngoingStubbing.thenReturn</span></td><td><code>98946de1fe6fe048</code></td></tr><tr><td><span class="el_class">org.objenesis.ObjenesisBase</span></td><td><code>643787ab18fae89d</code></td></tr><tr><td><span class="el_class">org.objenesis.ObjenesisStd</span></td><td><code>55e576f502a6be35</code></td></tr><tr><td><span class="el_class">org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator</span></td><td><code>e02ec16f20414b27</code></td></tr><tr><td><span class="el_class">org.objenesis.strategy.BaseInstantiatorStrategy</span></td><td><code>b5a921c62a6344a3</code></td></tr><tr><td><span class="el_class">org.objenesis.strategy.StdInstantiatorStrategy</span></td><td><code>80b3862ae4e1c7a0</code></td></tr><tr><td><span class="el_class">org.slf4j.LoggerFactory</span></td><td><code>598211aa39fec1c9</code></td></tr><tr><td><span class="el_class">org.slf4j.bridge.SLF4JBridgeHandler</span></td><td><code>fd4e303cf6395e0d</code></td></tr><tr><td><span class="el_class">org.slf4j.helpers.FormattingTuple</span></td><td><code>46e388b1eb4cb5c1</code></td></tr><tr><td><span class="el_class">org.slf4j.helpers.MessageFormatter</span></td><td><code>b83248c490b9cf5e</code></td></tr><tr><td><span class="el_class">org.slf4j.helpers.NOPLoggerFactory</span></td><td><code>54f5632bfcb8d8d5</code></td></tr><tr><td><span class="el_class">org.slf4j.helpers.SubstituteLoggerFactory</span></td><td><code>dc7efc0107a4a62d</code></td></tr><tr><td><span class="el_class">org.slf4j.helpers.Util</span></td><td><code>b8e4b71a37dbf76f</code></td></tr><tr><td><span class="el_class">org.slf4j.impl.StaticLoggerBinder</span></td><td><code>8e4301508466da37</code></td></tr><tr><td><span class="el_class">worker.org.gradle.api.JavaVersion</span></td><td><code>84f3766952252fce</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.classloader.ClassLoaderSpec</span></td><td><code>cb374b01ccbebc0b</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.classloader.ClassLoaderUtils</span></td><td><code>7accf2b5fc911a1f</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.classloader.ClassLoaderUtils.ReflectionClassDefiner</span></td><td><code>3178a93c2f60d1e7</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.classloader.ClassLoaderUtils.ReflectionPackagesFetcher</span></td><td><code>9858f77e59f4f060</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.classloader.FilteringClassLoader</span></td><td><code>cd58288ad3a6bafc</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.classloader.FilteringClassLoader.RetrieveSystemPackagesClassLoader</span></td><td><code>130153a9bfa0a897</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.classloader.FilteringClassLoader.Spec</span></td><td><code>50e7b6c3bb848c0a</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.classloader.FilteringClassLoader.TrieSet</span></td><td><code>4d1ffd46cbfd7403</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.reflect.JavaMethod</span></td><td><code>0d7ccf9ff87df542</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.reflect.JavaReflectionUtil</span></td><td><code>e97fec3084b0b1b6</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.util.Trie</span></td><td><code>19fbee069a29feb3</code></td></tr><tr><td><span class="el_class">worker.org.gradle.internal.util.Trie.Builder</span></td><td><code>3ff89b3303eddda1</code></td></tr><tr><td><span class="el_class">worker.org.gradle.process.internal.worker.GradleWorkerMain</span></td><td><code>227c91d50a73b80f</code></td></tr></tbody></table><div class="footer"><span class="right">Created with <a href="http://www.jacoco.org/jacoco">JaCoCo</a> 0.8.2.201808211720</span></div></body></html>
    \ No newline at end of file
    diff --git a/build/reports/tests/test/classes/AnsiColorPluginTest$Init.html b/build/reports/tests/test/classes/AnsiColorPluginTest$Init.html
    new file mode 100644
    index 00000000..eec54421
    --- /dev/null
    +++ b/build/reports/tests/test/classes/AnsiColorPluginTest$Init.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class AnsiColorPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class AnsiColorPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; AnsiColorPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformEnvironmentStage</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/AwssumePluginTest$Apply$WithRoleProvided.html b/build/reports/tests/test/classes/AwssumePluginTest$Apply$WithRoleProvided.html
    new file mode 100644
    index 00000000..46f19063
    --- /dev/null
    +++ b/build/reports/tests/test/classes/AwssumePluginTest$Apply$WithRoleProvided.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class AwssumePluginTest$Apply$WithRoleProvided</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class AwssumePluginTest$Apply$WithRoleProvided</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; AwssumePluginTest$Apply$WithRoleProvided</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.007s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsEnvironmentSpecificRoleArnAsPrefixToTerraformApply</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsEnvironmentSpecificRoleArnAsPrefixToTerraformInit</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsEnvironmentSpecificRoleArnAsPrefixToTerraformPlan</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/AwssumePluginTest$Apply$WithoutRoleProvided.html b/build/reports/tests/test/classes/AwssumePluginTest$Apply$WithoutRoleProvided.html
    new file mode 100644
    index 00000000..c1f381da
    --- /dev/null
    +++ b/build/reports/tests/test/classes/AwssumePluginTest$Apply$WithoutRoleProvided.html
    @@ -0,0 +1,118 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class AwssumePluginTest$Apply$WithoutRoleProvided</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class AwssumePluginTest$Apply$WithoutRoleProvided</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; AwssumePluginTest$Apply$WithoutRoleProvided</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.004s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +<li>
    +<a href="#tab1">Standard output</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">skipsAwssumeForTerraformApply</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">skipsAwssumeForTerraformInit</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">skipsAwssumeForTerraformPlan</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tab1" class="tab">
    +<h2>Standard output</h2>
    +<span class="code">
    +<pre>No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the myEnv environment.
    +No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the myEnv environment.
    +No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the myEnv environment.
    +</pre>
    +</span>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/AwssumePluginTest$GetAwsRoleArn.html b/build/reports/tests/test/classes/AwssumePluginTest$GetAwsRoleArn.html
    new file mode 100644
    index 00000000..1cf0e406
    --- /dev/null
    +++ b/build/reports/tests/test/classes/AwssumePluginTest$GetAwsRoleArn.html
    @@ -0,0 +1,111 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class AwssumePluginTest$GetAwsRoleArn</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class AwssumePluginTest$GetAwsRoleArn</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; AwssumePluginTest$GetAwsRoleArn</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.004s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">prefersAwsArnRoleOverEnvironmentSpecificRole</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsAwsRoleArnIfPresent</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsEnvironmentSpecificAwsRoleArnIfPresent</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsEnvironmentSpecifiedAwsRoleArnIfPresentCaseInsensitive</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/AwssumePluginTest$GetRegion.html b/build/reports/tests/test/classes/AwssumePluginTest$GetRegion.html
    new file mode 100644
    index 00000000..3f75ac98
    --- /dev/null
    +++ b/build/reports/tests/test/classes/AwssumePluginTest$GetRegion.html
    @@ -0,0 +1,116 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class AwssumePluginTest$GetRegion</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class AwssumePluginTest$GetRegion</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; AwssumePluginTest$GetRegion</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">5</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.005s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">prefersEnvironmentSpecificRegionOverDefaultRegion</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">prefersRegionOverEnvironmentSpecificRegion</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsAwsDefaultRegionIfPresent</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsAwsRegionIfPresent</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsEnvironmentSpecificRegionIfPresent</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/AwssumePluginTest$Init.html b/build/reports/tests/test/classes/AwssumePluginTest$Init.html
    new file mode 100644
    index 00000000..2bbe2901
    --- /dev/null
    +++ b/build/reports/tests/test/classes/AwssumePluginTest$Init.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class AwssumePluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class AwssumePluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; AwssumePluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformApplyCommand</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">modifiesTerraformInitCommand</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">modifiesTerraformPlanCommand</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/BuildGraphTest$WithASingleStage.html b/build/reports/tests/test/classes/BuildGraphTest$WithASingleStage.html
    new file mode 100644
    index 00000000..9c69c26e
    --- /dev/null
    +++ b/build/reports/tests/test/classes/BuildGraphTest$WithASingleStage.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class BuildGraphTest$WithASingleStage</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class BuildGraphTest$WithASingleStage</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; BuildGraphTest$WithASingleStage</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.008s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">buildsTheStageThatItWasCreatedWith</td>
    +<td class="success">0.008s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/BuildGraphTest$WithMultipleStages.html b/build/reports/tests/test/classes/BuildGraphTest$WithMultipleStages.html
    new file mode 100644
    index 00000000..99852959
    --- /dev/null
    +++ b/build/reports/tests/test/classes/BuildGraphTest$WithMultipleStages.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class BuildGraphTest$WithMultipleStages</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class BuildGraphTest$WithMultipleStages</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; BuildGraphTest$WithMultipleStages</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.008s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">buildsTheStagesInOrder</td>
    +<td class="success">0.008s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ConditionApplyPluginTest$ShouldApply.html b/build/reports/tests/test/classes/ConditionApplyPluginTest$ShouldApply.html
    new file mode 100644
    index 00000000..9ff18b2f
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ConditionApplyPluginTest$ShouldApply.html
    @@ -0,0 +1,117 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ConditionApplyPluginTest$ShouldApply</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ConditionApplyPluginTest$ShouldApply</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ConditionApplyPluginTest$ShouldApply</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +<li>
    +<a href="#tab1">Standard output</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">returnsFalseForNonMaster</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsTrueForMaster</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsTrueWhenBranchIsUnknown</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tab1" class="tab">
    +<h2>Standard output</h2>
    +<span class="code">
    +<pre>Current branch 'master' matches expected branch 'master', stage branch-condition is met and will run.
    +Current branch is null - you're probably using a single-branch job which doesn't make your branch name available.  Assume that apply should be enabled.
    +</pre>
    +</span>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ConditionApplyPluginTest.html b/build/reports/tests/test/classes/ConditionApplyPluginTest.html
    new file mode 100644
    index 00000000..bf169471
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ConditionApplyPluginTest.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ConditionApplyPluginTest</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ConditionApplyPluginTest</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ConditionApplyPluginTest</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformEnvironmentStageByDefault</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ConfirmApplyPluginTest.html b/build/reports/tests/test/classes/ConfirmApplyPluginTest.html
    new file mode 100644
    index 00000000..b64912d9
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ConfirmApplyPluginTest.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ConfirmApplyPluginTest</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ConfirmApplyPluginTest</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ConfirmApplyPluginTest</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.147s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">ConfirmApplyPluginDisabled</td>
    +<td class="success">0.108s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">ConfirmApplyPluginEnabled</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">modifiesTerraformEnvironmentStageByDefault</td>
    +<td class="success">0.037s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ConsulBackendPluginTest$Apply$AddressBackendParameter.html b/build/reports/tests/test/classes/ConsulBackendPluginTest$Apply$AddressBackendParameter.html
    new file mode 100644
    index 00000000..56071d4a
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ConsulBackendPluginTest$Apply$AddressBackendParameter.html
    @@ -0,0 +1,111 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ConsulBackendPluginTest$Apply$AddressBackendParameter</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ConsulBackendPluginTest$Apply$AddressBackendParameter</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ConsulBackendPluginTest$Apply$AddressBackendParameter</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">isAddedAndPrefersTheExplicitValueOverTheDefaultEnvironmentValue</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isAddedIfEnvironmentVariablePresent</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isAddedIfExplicitlySet</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isNotAddedByDefault</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ConsulBackendPluginTest$Apply$PathBackendParameter.html b/build/reports/tests/test/classes/ConsulBackendPluginTest$Apply$PathBackendParameter.html
    new file mode 100644
    index 00000000..e8be406e
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ConsulBackendPluginTest$Apply$PathBackendParameter.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ConsulBackendPluginTest$Apply$PathBackendParameter</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ConsulBackendPluginTest$Apply$PathBackendParameter</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ConsulBackendPluginTest$Apply$PathBackendParameter</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">isAddedAndIsEnvironmentSpecific</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isAddedAndUsesCustomizablePattern</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ConsulBackendPluginTest$Init.html b/build/reports/tests/test/classes/ConsulBackendPluginTest$Init.html
    new file mode 100644
    index 00000000..3462efd7
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ConsulBackendPluginTest$Init.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ConsulBackendPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ConsulBackendPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ConsulBackendPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformInitCommand</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/CredentialsPluginTest$Init.html b/build/reports/tests/test/classes/CredentialsPluginTest$Init.html
    new file mode 100644
    index 00000000..8e1b9699
    --- /dev/null
    +++ b/build/reports/tests/test/classes/CredentialsPluginTest$Init.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class CredentialsPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class CredentialsPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; CredentialsPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.009s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesBuildStage</td>
    +<td class="success">0.009s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/CredentialsPluginTest$PopulateDefaults.html b/build/reports/tests/test/classes/CredentialsPluginTest$PopulateDefaults.html
    new file mode 100644
    index 00000000..f6038ba6
    --- /dev/null
    +++ b/build/reports/tests/test/classes/CredentialsPluginTest$PopulateDefaults.html
    @@ -0,0 +1,116 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class CredentialsPluginTest$PopulateDefaults</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class CredentialsPluginTest$PopulateDefaults</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; CredentialsPluginTest$PopulateDefaults</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">5</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.002s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">allowsCustomPasswordVariable</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">allowsCustomUserVariable</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">defaultsPasswordVariableUsingCredentialsId</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">defaultsUserVariableUsingCredentialsId</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">populatesCredentialsId</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/CredentialsPluginTest$ToEnvironmentVariable.html b/build/reports/tests/test/classes/CredentialsPluginTest$ToEnvironmentVariable.html
    new file mode 100644
    index 00000000..539290ac
    --- /dev/null
    +++ b/build/reports/tests/test/classes/CredentialsPluginTest$ToEnvironmentVariable.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class CredentialsPluginTest$ToEnvironmentVariable</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class CredentialsPluginTest$ToEnvironmentVariable</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; CredentialsPluginTest$ToEnvironmentVariable</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">convertsAllTheThings</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">convertsDashesToUnderscore</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">convertsLowercaseToUppercase</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/CredentialsPluginTest$WithBuildCredentials.html b/build/reports/tests/test/classes/CredentialsPluginTest$WithBuildCredentials.html
    new file mode 100644
    index 00000000..7c147113
    --- /dev/null
    +++ b/build/reports/tests/test/classes/CredentialsPluginTest$WithBuildCredentials.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class CredentialsPluginTest$WithBuildCredentials</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class CredentialsPluginTest$WithBuildCredentials</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; CredentialsPluginTest$WithBuildCredentials</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.012s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsCredentialsForBuildStage</td>
    +<td class="success">0.010s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsMultipleCredentialsForBuildStage</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/CrqPluginTest$AddCrq$withCrqEnvironment.html b/build/reports/tests/test/classes/CrqPluginTest$AddCrq$withCrqEnvironment.html
    new file mode 100644
    index 00000000..9ccdcb68
    --- /dev/null
    +++ b/build/reports/tests/test/classes/CrqPluginTest$AddCrq$withCrqEnvironment.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class CrqPluginTest$AddCrq$withCrqEnvironment</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class CrqPluginTest$AddCrq$withCrqEnvironment</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; CrqPluginTest$AddCrq$withCrqEnvironment</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.015s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">shouldExecutePipeline</td>
    +<td class="success">0.015s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/CrqPluginTest$AddCrq$withoutCrqEnvironment.html b/build/reports/tests/test/classes/CrqPluginTest$AddCrq$withoutCrqEnvironment.html
    new file mode 100644
    index 00000000..88ffe68c
    --- /dev/null
    +++ b/build/reports/tests/test/classes/CrqPluginTest$AddCrq$withoutCrqEnvironment.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class CrqPluginTest$AddCrq$withoutCrqEnvironment</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class CrqPluginTest$AddCrq$withoutCrqEnvironment</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; CrqPluginTest$AddCrq$withoutCrqEnvironment</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">shouldExecutePipeline</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/CrqPluginTest$GetCrqEnviroment.html b/build/reports/tests/test/classes/CrqPluginTest$GetCrqEnviroment.html
    new file mode 100644
    index 00000000..ecadb861
    --- /dev/null
    +++ b/build/reports/tests/test/classes/CrqPluginTest$GetCrqEnviroment.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class CrqPluginTest$GetCrqEnviroment</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class CrqPluginTest$GetCrqEnviroment</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; CrqPluginTest$GetCrqEnviroment</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">prefersNonPrefixedCrqOverPrefixedCrq</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsCrqEnvirommentIfPresent</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsEnvironmentSpecificCrqEnvirommentIfPresent</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/CrqPluginTest$Init.html b/build/reports/tests/test/classes/CrqPluginTest$Init.html
    new file mode 100644
    index 00000000..d5feb5cb
    --- /dev/null
    +++ b/build/reports/tests/test/classes/CrqPluginTest$Init.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class CrqPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class CrqPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; CrqPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.004s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformEnvironmentStageCommand</td>
    +<td class="success">0.004s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/DefaultEnvironmentPluginTest$Init.html b/build/reports/tests/test/classes/DefaultEnvironmentPluginTest$Init.html
    new file mode 100644
    index 00000000..e674937c
    --- /dev/null
    +++ b/build/reports/tests/test/classes/DefaultEnvironmentPluginTest$Init.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class DefaultEnvironmentPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class DefaultEnvironmentPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; DefaultEnvironmentPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformEnvironmentStageByDefault</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/FileParametersPluginTest$GetVariables.html b/build/reports/tests/test/classes/FileParametersPluginTest$GetVariables.html
    new file mode 100644
    index 00000000..ea42ad4e
    --- /dev/null
    +++ b/build/reports/tests/test/classes/FileParametersPluginTest$GetVariables.html
    @@ -0,0 +1,111 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class FileParametersPluginTest$GetVariables</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class FileParametersPluginTest$GetVariables</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; FileParametersPluginTest$GetVariables</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.428s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">handlesCarriageReturnCharacters</td>
    +<td class="success">0.354s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">ignoresTrailingNewline</td>
    +<td class="success">0.028s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">interpolatesReferencesToOtherEnvironmentVariables</td>
    +<td class="success">0.020s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsAValueForEachLine</td>
    +<td class="success">0.026s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/FileParametersPluginTest$Init.html b/build/reports/tests/test/classes/FileParametersPluginTest$Init.html
    new file mode 100644
    index 00000000..42064f41
    --- /dev/null
    +++ b/build/reports/tests/test/classes/FileParametersPluginTest$Init.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class FileParametersPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class FileParametersPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; FileParametersPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.004s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformEnvironmentStage</td>
    +<td class="success">0.004s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/JenkinsfileTest$GetNodeName.html b/build/reports/tests/test/classes/JenkinsfileTest$GetNodeName.html
    new file mode 100644
    index 00000000..f3bb2959
    --- /dev/null
    +++ b/build/reports/tests/test/classes/JenkinsfileTest$GetNodeName.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class JenkinsfileTest$GetNodeName</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class JenkinsfileTest$GetNodeName</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; JenkinsfileTest$GetNodeName</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.002s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">returnsDefaultNodeNameEvenWhenEnvironmentVariableGiven</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsDefaultNodeNameWhenPresent</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsEnvironmentVariableWhenDefaultNodeNameNotGiven</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.html b/build/reports/tests/test/classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.html
    new file mode 100644
    index 00000000..b68d1e6b
    --- /dev/null
    +++ b/build/reports/tests/test/classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">returnsOrganization</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsRepo</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.html b/build/reports/tests/test/classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.html
    new file mode 100644
    index 00000000..e59ec29a
    --- /dev/null
    +++ b/build/reports/tests/test/classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">returnsOrganization</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsRepo</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/JenkinsfileTest$ParseScmUrl$WithSshUrl.html b/build/reports/tests/test/classes/JenkinsfileTest$ParseScmUrl$WithSshUrl.html
    new file mode 100644
    index 00000000..5268926f
    --- /dev/null
    +++ b/build/reports/tests/test/classes/JenkinsfileTest$ParseScmUrl$WithSshUrl.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class JenkinsfileTest$ParseScmUrl$WithSshUrl</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class JenkinsfileTest$ParseScmUrl$WithSshUrl</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; JenkinsfileTest$ParseScmUrl$WithSshUrl</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">returnsOrganization</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsRepo</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ParameterStoreBuildWrapperPluginTest$Init.html b/build/reports/tests/test/classes/ParameterStoreBuildWrapperPluginTest$Init.html
    new file mode 100644
    index 00000000..297ff697
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ParameterStoreBuildWrapperPluginTest$Init.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ParameterStoreBuildWrapperPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ParameterStoreBuildWrapperPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ParameterStoreBuildWrapperPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformEnvironmentStageCommand</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ParameterStoreBuildWrapperPluginTest$PathForEnvironment.html b/build/reports/tests/test/classes/ParameterStoreBuildWrapperPluginTest$PathForEnvironment.html
    new file mode 100644
    index 00000000..b1930b47
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ParameterStoreBuildWrapperPluginTest$PathForEnvironment.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ParameterStoreBuildWrapperPluginTest$PathForEnvironment</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ParameterStoreBuildWrapperPluginTest$PathForEnvironment</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ParameterStoreBuildWrapperPluginTest$PathForEnvironment</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">constructPathUsingOrgRepoAndEnvironment</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ParameterStoreExecPluginTest$Apply.html b/build/reports/tests/test/classes/ParameterStoreExecPluginTest$Apply.html
    new file mode 100644
    index 00000000..eb8190ac
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ParameterStoreExecPluginTest$Apply.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ParameterStoreExecPluginTest$Apply</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ParameterStoreExecPluginTest$Apply</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ParameterStoreExecPluginTest$Apply</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsParameterStorePrefixToTerraformApply</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsParameterStorePrefixToTerraformPlan</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ParameterStoreExecPluginTest$Init.html b/build/reports/tests/test/classes/ParameterStoreExecPluginTest$Init.html
    new file mode 100644
    index 00000000..120c1cd0
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ParameterStoreExecPluginTest$Init.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ParameterStoreExecPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ParameterStoreExecPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ParameterStoreExecPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformApplyCommand</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">modifiesTerraformEnvironmentStage</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">modifiesTerraformPlanCommand</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/ParameterStoreExecPluginTest$PathForEnvironment.html b/build/reports/tests/test/classes/ParameterStoreExecPluginTest$PathForEnvironment.html
    new file mode 100644
    index 00000000..80b6f408
    --- /dev/null
    +++ b/build/reports/tests/test/classes/ParameterStoreExecPluginTest$PathForEnvironment.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class ParameterStoreExecPluginTest$PathForEnvironment</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class ParameterStoreExecPluginTest$PathForEnvironment</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; ParameterStoreExecPluginTest$PathForEnvironment</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.002s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">constructPathUsingOrgRepoAndEnvironment</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/RegressionStageTest$AddedPlugins.html b/build/reports/tests/test/classes/RegressionStageTest$AddedPlugins.html
    new file mode 100644
    index 00000000..583ec805
    --- /dev/null
    +++ b/build/reports/tests/test/classes/RegressionStageTest$AddedPlugins.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class RegressionStageTest$AddedPlugins</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class RegressionStageTest$AddedPlugins</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; RegressionStageTest$AddedPlugins</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">willHaveApplyCalled</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/RegressionStageTest$AutomationRepo.html b/build/reports/tests/test/classes/RegressionStageTest$AutomationRepo.html
    new file mode 100644
    index 00000000..d9f09ff2
    --- /dev/null
    +++ b/build/reports/tests/test/classes/RegressionStageTest$AutomationRepo.html
    @@ -0,0 +1,111 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class RegressionStageTest$AutomationRepo</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class RegressionStageTest$AutomationRepo</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; RegressionStageTest$AutomationRepo</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.017s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">automationRepoAndAppRepoSpecifiedSuccessfullyCallApply</td>
    +<td class="success">0.013s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">automationRepoAndAppRepoWithChangeDirectorySpecifiedSuccessfullyCallApply</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">automationRepoSpecifiedSuccessfullyCallApply</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">noAutomationRepoSpecifiedSuccessfullyCallApply</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/S3BackendPluginTest$Apply.html b/build/reports/tests/test/classes/S3BackendPluginTest$Apply.html
    new file mode 100644
    index 00000000..14500ee3
    --- /dev/null
    +++ b/build/reports/tests/test/classes/S3BackendPluginTest$Apply.html
    @@ -0,0 +1,164 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class S3BackendPluginTest$Apply</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class S3BackendPluginTest$Apply</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; S3BackendPluginTest$Apply</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">6</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.033s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +<li>
    +<a href="#tab1">Standard output</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsBucketPreDefinedByEnvironmentAsBackendParameter</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsBucketRegionUsingPreDefinedEnvironmentVariableAsBackendParameter</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsDynamoDbTableAsBackendParameter</td>
    +<td class="success">0.018s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsEnvironmentSpecificKeyAsBackendParameter</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isAddedAndUsesCustomizedPatternFolderKeyAsBackendParameter</td>
    +<td class="success">0.004s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">skipsDynamoDbTableAsBackendParameter</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tab1" class="tab">
    +<h2>Standard output</h2>
    +<span class="code">
    +<pre>No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +MYENV_S3_BACKEND_DYNAMO_TABLE_LOCK is deprecated - please use MYENV_S3_BACKEND_DYNAMODB_TABLE instead
    +No S3 backend bucket found
    +No S3 backend region found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3 backend bucket found
    +No S3 backend region found
    +No S3 backend dynamodb_table found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3 backend bucket found
    +No S3 backend region found
    +No S3 backend dynamodb_table found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3 backend bucket found
    +No S3 backend region found
    +No S3 backend dynamodb_table found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +WARNING: DEFAULT_S3_BACKEND_REGION is deprecated, please use S3_BACKEND_REGION or MYENV_S3_BACKEND_REGION
    +No S3 backend bucket found
    +No S3 backend dynamodb_table found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3 backend region found
    +No S3 backend dynamodb_table found
    +</pre>
    +</span>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/S3BackendPluginTest$GetBackend.html b/build/reports/tests/test/classes/S3BackendPluginTest$GetBackend.html
    new file mode 100644
    index 00000000..1bf2149b
    --- /dev/null
    +++ b/build/reports/tests/test/classes/S3BackendPluginTest$GetBackend.html
    @@ -0,0 +1,122 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class S3BackendPluginTest$GetBackend</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class S3BackendPluginTest$GetBackend</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; S3BackendPluginTest$GetBackend</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.004s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +<li>
    +<a href="#tab1">Standard output</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">shouldPreferS3BackendBucketOverEnvironmentSpecificBucket</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnTheValueOfS3BackendBucket</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnTheValueOfTheEnvironmentSpecificS3BackendBucket</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnTheValueOfTheEnvironmentSpecificS3BackendBucketCaseInsensitive</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tab1" class="tab">
    +<h2>Standard output</h2>
    +<span class="code">
    +<pre>No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +</pre>
    +</span>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/S3BackendPluginTest$GetDynamoTable.html b/build/reports/tests/test/classes/S3BackendPluginTest$GetDynamoTable.html
    new file mode 100644
    index 00000000..8718d66f
    --- /dev/null
    +++ b/build/reports/tests/test/classes/S3BackendPluginTest$GetDynamoTable.html
    @@ -0,0 +1,131 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class S3BackendPluginTest$GetDynamoTable</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class S3BackendPluginTest$GetDynamoTable</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; S3BackendPluginTest$GetDynamoTable</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">6</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.002s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +<li>
    +<a href="#tab1">Standard output</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">shouldPreferS3BackendDynamodbTableOverDeprecatedValue</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldPreferS3BackendDynamodbTableOverEnvironmentSpecificValue</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnDeprecatedS3BackendDynamoTableLockValue</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnEnvironmentSpecificS3BackendDynamodbTableValue</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnEnvironmentSpecificS3BackendDynamodbTableValueCaseInsensitive</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnS3BackendDynamodbTableValue</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tab1" class="tab">
    +<h2>Standard output</h2>
    +<span class="code">
    +<pre>MYENV_S3_BACKEND_DYNAMO_TABLE_LOCK is deprecated - please use MYENV_S3_BACKEND_DYNAMODB_TABLE instead
    +</pre>
    +</span>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/S3BackendPluginTest$GetKey.html b/build/reports/tests/test/classes/S3BackendPluginTest$GetKey.html
    new file mode 100644
    index 00000000..84799a03
    --- /dev/null
    +++ b/build/reports/tests/test/classes/S3BackendPluginTest$GetKey.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class S3BackendPluginTest$GetKey</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class S3BackendPluginTest$GetKey</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; S3BackendPluginTest$GetKey</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">shouldBeGeneratedFromRepoSlugAndEnvironment</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldBeGeneratedFromTheCustomKeyPattern</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/S3BackendPluginTest$GetRegion.html b/build/reports/tests/test/classes/S3BackendPluginTest$GetRegion.html
    new file mode 100644
    index 00000000..c6d37e09
    --- /dev/null
    +++ b/build/reports/tests/test/classes/S3BackendPluginTest$GetRegion.html
    @@ -0,0 +1,135 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class S3BackendPluginTest$GetRegion</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class S3BackendPluginTest$GetRegion</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; S3BackendPluginTest$GetRegion</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">6</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.006s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +<li>
    +<a href="#tab1">Standard output</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">shouldPreferEnvironmentSpecificRegionOverDeprecatedDefaultS3BackendRegion</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldPreferS3BackendRegionOverEnvironmentSpecificRegion</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnTheValueOfDefaultS3BackendRegion</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnTheValueOfEnvironmentSpecificS3BackendRegion</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnTheValueOfEnvironmentSpecificS3BackendRegionCaseInsensitive</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">shouldReturnTheValueOfS3BackendRegion</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tab1" class="tab">
    +<h2>Standard output</h2>
    +<span class="code">
    +<pre>No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +WARNING: DEFAULT_S3_BACKEND_REGION is deprecated, please use S3_BACKEND_REGION or MYENV_S3_BACKEND_REGION
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +</pre>
    +</span>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/S3BackendPluginTest$Init.html b/build/reports/tests/test/classes/S3BackendPluginTest$Init.html
    new file mode 100644
    index 00000000..20671ccf
    --- /dev/null
    +++ b/build/reports/tests/test/classes/S3BackendPluginTest$Init.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class S3BackendPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class S3BackendPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; S3BackendPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.007s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsS3BackendPluginToListOfPlugins</td>
    +<td class="success">0.007s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformApplyCommandTest$Plugins.html b/build/reports/tests/test/classes/TerraformApplyCommandTest$Plugins.html
    new file mode 100644
    index 00000000..277df5e1
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformApplyCommandTest$Plugins.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformApplyCommandTest$Plugins</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformApplyCommandTest$Plugins</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformApplyCommandTest$Plugins</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.008s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">areAppliedEvenAfterCommandAlreadyInstantiated</td>
    +<td class="success">0.007s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">areAppliedExactlyOnce</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">areAppliedToTheCommand</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformApplyCommandTest$WithArgument.html b/build/reports/tests/test/classes/TerraformApplyCommandTest$WithArgument.html
    new file mode 100644
    index 00000000..1a2f0c9b
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformApplyCommandTest$WithArgument.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformApplyCommandTest$WithArgument</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformApplyCommandTest$WithArgument</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformApplyCommandTest$WithArgument</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.002s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsArgument</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isCumulative</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformApplyCommandTest$WithDirectory.html b/build/reports/tests/test/classes/TerraformApplyCommandTest$WithDirectory.html
    new file mode 100644
    index 00000000..820d13ef
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformApplyCommandTest$WithDirectory.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformApplyCommandTest$WithDirectory</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformApplyCommandTest$WithDirectory</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformApplyCommandTest$WithDirectory</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsDirectoryArgument</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformApplyCommandTest$WithInput.html b/build/reports/tests/test/classes/TerraformApplyCommandTest$WithInput.html
    new file mode 100644
    index 00000000..56ea3020
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformApplyCommandTest$WithInput.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformApplyCommandTest$WithInput</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformApplyCommandTest$WithInput</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformApplyCommandTest$WithInput</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.004s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">defaultsToFalse</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">setsInputFlagToFalseWhenFalse</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">skipsInputFlagWhenTrue</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformApplyCommandTest$WithPrefix.html b/build/reports/tests/test/classes/TerraformApplyCommandTest$WithPrefix.html
    new file mode 100644
    index 00000000..4cf8c408
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformApplyCommandTest$WithPrefix.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformApplyCommandTest$WithPrefix</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformApplyCommandTest$WithPrefix</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformApplyCommandTest$WithPrefix</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.002s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsPrefixToBeginningOfCommand</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isCumulative</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.html b/build/reports/tests/test/classes/TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.html
    new file mode 100644
    index 00000000..cedfbb49
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.html
    @@ -0,0 +1,111 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformDirectoryPluginTest$Apply$WithDirectoryProvided</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformDirectoryPluginTest$Apply$WithDirectoryProvided</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformDirectoryPluginTest$Apply$WithDirectoryProvided</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.005s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsDirectoryToTerraformApply</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsDirectoryToTerraformInit</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsDirectoryToTerraformPlan</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsDirectoryToTerraformValidate</td>
    +<td class="success">0.003s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.html b/build/reports/tests/test/classes/TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.html
    new file mode 100644
    index 00000000..72bf2e03
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.html
    @@ -0,0 +1,111 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.002s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsDirectoryToTerraformApply</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsDirectoryToTerraformInit</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsDirectoryToTerraformPlan</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsDirectoryToTerraformValidate</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformDirectoryPluginTest$Init.html b/build/reports/tests/test/classes/TerraformDirectoryPluginTest$Init.html
    new file mode 100644
    index 00000000..82fbc37f
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformDirectoryPluginTest$Init.html
    @@ -0,0 +1,111 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformDirectoryPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformDirectoryPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformDirectoryPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.007s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformApplyCommand</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">modifiesTerraformInitCommand</td>
    +<td class="success">0.006s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">modifiesTerraformPlanCommand</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">modifiesTerraformValidateCommand</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformEnvironmentStageTest$AddedPlugins.html b/build/reports/tests/test/classes/TerraformEnvironmentStageTest$AddedPlugins.html
    new file mode 100644
    index 00000000..52bef303
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformEnvironmentStageTest$AddedPlugins.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformEnvironmentStageTest$AddedPlugins</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformEnvironmentStageTest$AddedPlugins</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformEnvironmentStageTest$AddedPlugins</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.012s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">willHaveApplyCalled</td>
    +<td class="success">0.012s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformEnvironmentStageTest$WithEnv.html b/build/reports/tests/test/classes/TerraformEnvironmentStageTest$WithEnv.html
    new file mode 100644
    index 00000000..5c24b4bf
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformEnvironmentStageTest$WithEnv.html
    @@ -0,0 +1,111 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformEnvironmentStageTest$WithEnv</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformEnvironmentStageTest$WithEnv</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformEnvironmentStageTest$WithEnv</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.022s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsAnInstanceOfEnvironmentVariablePlugin</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">doesNotAddPluginToOtherInstances</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isFluent</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">preservesOrderOfOtherPlugins</td>
    +<td class="success">0.022s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformEnvironmentStageTest$WithGlobalEnv.html b/build/reports/tests/test/classes/TerraformEnvironmentStageTest$WithGlobalEnv.html
    new file mode 100644
    index 00000000..6b60bc0d
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformEnvironmentStageTest$WithGlobalEnv.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformEnvironmentStageTest$WithGlobalEnv</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformEnvironmentStageTest$WithGlobalEnv</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformEnvironmentStageTest$WithGlobalEnv</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsAnInstanceOfEnvironmeentVariablePlugin</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isFluent</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformInitCommandTest$Plugins.html b/build/reports/tests/test/classes/TerraformInitCommandTest$Plugins.html
    new file mode 100644
    index 00000000..93432f83
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformInitCommandTest$Plugins.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformInitCommandTest$Plugins</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformInitCommandTest$Plugins</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformInitCommandTest$Plugins</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.130s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">areAppliedEvenAfterCommandAlreadyInstantiated</td>
    +<td class="success">0.128s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">areAppliedExactlyOnce</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">areAppliedToTheCommand</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformInitCommandTest$WithBackendConfig.html b/build/reports/tests/test/classes/TerraformInitCommandTest$WithBackendConfig.html
    new file mode 100644
    index 00000000..650c1959
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformInitCommandTest$WithBackendConfig.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformInitCommandTest$WithBackendConfig</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformInitCommandTest$WithBackendConfig</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformInitCommandTest$WithBackendConfig</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.008s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsBackendConfigIsCumulative</td>
    +<td class="success">0.006s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">addsBackendConfigValues</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">notPresentByDefault</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformInitCommandTest$WithDirectory.html b/build/reports/tests/test/classes/TerraformInitCommandTest$WithDirectory.html
    new file mode 100644
    index 00000000..207ebd57
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformInitCommandTest$WithDirectory.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformInitCommandTest$WithDirectory</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformInitCommandTest$WithDirectory</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformInitCommandTest$WithDirectory</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.006s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsDirectoryArgument</td>
    +<td class="success">0.006s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformInitCommandTest$WithInput.html b/build/reports/tests/test/classes/TerraformInitCommandTest$WithInput.html
    new file mode 100644
    index 00000000..adda016c
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformInitCommandTest$WithInput.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformInitCommandTest$WithInput</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformInitCommandTest$WithInput</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformInitCommandTest$WithInput</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.026s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">defaultsToFalse</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">setsInputFlagToFalseWhenFalse</td>
    +<td class="success">0.024s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">skipsInputFlagWhenTrue</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformPlanCommandTest$Plugins.html b/build/reports/tests/test/classes/TerraformPlanCommandTest$Plugins.html
    new file mode 100644
    index 00000000..1d75e395
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformPlanCommandTest$Plugins.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformPlanCommandTest$Plugins</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformPlanCommandTest$Plugins</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformPlanCommandTest$Plugins</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.010s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">areAppliedEvenAfterCommandAlreadyInstantiated</td>
    +<td class="success">0.008s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">areAppliedExactlyOnce</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">areAppliedToTheCommand</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformPlanCommandTest$WithDirectory.html b/build/reports/tests/test/classes/TerraformPlanCommandTest$WithDirectory.html
    new file mode 100644
    index 00000000..607c1c67
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformPlanCommandTest$WithDirectory.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformPlanCommandTest$WithDirectory</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformPlanCommandTest$WithDirectory</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformPlanCommandTest$WithDirectory</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsDirectoryArgument</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformPlanCommandTest$WithInput.html b/build/reports/tests/test/classes/TerraformPlanCommandTest$WithInput.html
    new file mode 100644
    index 00000000..73c01f0f
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformPlanCommandTest$WithInput.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformPlanCommandTest$WithInput</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformPlanCommandTest$WithInput</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformPlanCommandTest$WithInput</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.004s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">defaultsToFalse</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">setsInputFlagToFalseWhenFalse</td>
    +<td class="success">0.004s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">skipsInputFlagWhenTrue</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformPlanCommandTest$WithPrefix.html b/build/reports/tests/test/classes/TerraformPlanCommandTest$WithPrefix.html
    new file mode 100644
    index 00000000..26ce049b
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformPlanCommandTest$WithPrefix.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformPlanCommandTest$WithPrefix</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformPlanCommandTest$WithPrefix</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformPlanCommandTest$WithPrefix</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsPrefixToBeginningOfCommand</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isCumulative</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformValidateCommandTest$Plugins.html b/build/reports/tests/test/classes/TerraformValidateCommandTest$Plugins.html
    new file mode 100644
    index 00000000..4dec5804
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformValidateCommandTest$Plugins.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformValidateCommandTest$Plugins</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformValidateCommandTest$Plugins</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformValidateCommandTest$Plugins</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.006s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">areAppliedEvenAfterCommandAlreadyInstantiated</td>
    +<td class="success">0.005s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">areAppliedExactlyOnce</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">areAppliedToTheCommand</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformValidateCommandTest$WithDirectory.html b/build/reports/tests/test/classes/TerraformValidateCommandTest$WithDirectory.html
    new file mode 100644
    index 00000000..f85fac21
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformValidateCommandTest$WithDirectory.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformValidateCommandTest$WithDirectory</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformValidateCommandTest$WithDirectory</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformValidateCommandTest$WithDirectory</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsDirectoryArgument</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/TerraformValidateCommandTest$WithPrefix.html b/build/reports/tests/test/classes/TerraformValidateCommandTest$WithPrefix.html
    new file mode 100644
    index 00000000..9c9cd26a
    --- /dev/null
    +++ b/build/reports/tests/test/classes/TerraformValidateCommandTest$WithPrefix.html
    @@ -0,0 +1,101 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class TerraformValidateCommandTest$WithPrefix</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class TerraformValidateCommandTest$WithPrefix</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; TerraformValidateCommandTest$WithPrefix</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">2</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">addsPrefixToBeginningOfCommand</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">isCumulative</td>
    +<td class="success">0s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/WithAwsPluginTest$Init.html b/build/reports/tests/test/classes/WithAwsPluginTest$Init.html
    new file mode 100644
    index 00000000..ae3fc773
    --- /dev/null
    +++ b/build/reports/tests/test/classes/WithAwsPluginTest$Init.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class WithAwsPluginTest$Init</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class WithAwsPluginTest$Init</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; WithAwsPluginTest$Init</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.021s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">modifiesTerraformEnvironmentStage</td>
    +<td class="success">0.021s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/WithAwsPluginTest$WithExplicitRole.html b/build/reports/tests/test/classes/WithAwsPluginTest$WithExplicitRole.html
    new file mode 100644
    index 00000000..9ee8276c
    --- /dev/null
    +++ b/build/reports/tests/test/classes/WithAwsPluginTest$WithExplicitRole.html
    @@ -0,0 +1,106 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class WithAwsPluginTest$WithExplicitRole</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class WithAwsPluginTest$WithExplicitRole</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; WithAwsPluginTest$WithExplicitRole</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">3</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.003s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">prefersProvidedRoleOverEnvironmntSpecificRole</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">prefersProvidedRoleOverGenericRole</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsProvidedRole</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/WithAwsPluginTest$WithImplicitRole.html b/build/reports/tests/test/classes/WithAwsPluginTest$WithImplicitRole.html
    new file mode 100644
    index 00000000..8329615f
    --- /dev/null
    +++ b/build/reports/tests/test/classes/WithAwsPluginTest$WithImplicitRole.html
    @@ -0,0 +1,111 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class WithAwsPluginTest$WithImplicitRole</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class WithAwsPluginTest$WithImplicitRole</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; WithAwsPluginTest$WithImplicitRole</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">4</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.017s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">prefersGenericRoleOverEnvironmentRole</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsCaseInsensitiveEnvironmentSpecificRoleIfPresent</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsEnvironmentSpecificRoleIfPresent</td>
    +<td class="success">0.013s</td>
    +<td class="success">passed</td>
    +</tr>
    +<tr>
    +<td class="success">returnsGenericRoleIfPresent</td>
    +<td class="success">0.002s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/classes/WithAwsPluginTest$WithRole.html b/build/reports/tests/test/classes/WithAwsPluginTest$WithRole.html
    new file mode 100644
    index 00000000..f7932cff
    --- /dev/null
    +++ b/build/reports/tests/test/classes/WithAwsPluginTest$WithRole.html
    @@ -0,0 +1,96 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Class WithAwsPluginTest$WithRole</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Class WithAwsPluginTest$WithRole</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; 
    +<a href="../packages/default-package.html">default-package</a> &gt; WithAwsPluginTest$WithRole</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">1</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">0.001s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Tests</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Tests</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Test</th>
    +<th>Duration</th>
    +<th>Result</th>
    +</tr>
    +</thead>
    +<tr>
    +<td class="success">isFluentAndReturnsThePluginClass</td>
    +<td class="success">0.001s</td>
    +<td class="success">passed</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/css/base-style.css b/build/reports/tests/test/css/base-style.css
    new file mode 100644
    index 00000000..4afa73e3
    --- /dev/null
    +++ b/build/reports/tests/test/css/base-style.css
    @@ -0,0 +1,179 @@
    +
    +body {
    +    margin: 0;
    +    padding: 0;
    +    font-family: sans-serif;
    +    font-size: 12pt;
    +}
    +
    +body, a, a:visited {
    +    color: #303030;
    +}
    +
    +#content {
    +    padding-left: 50px;
    +    padding-right: 50px;
    +    padding-top: 30px;
    +    padding-bottom: 30px;
    +}
    +
    +#content h1 {
    +    font-size: 160%;
    +    margin-bottom: 10px;
    +}
    +
    +#footer {
    +    margin-top: 100px;
    +    font-size: 80%;
    +    white-space: nowrap;
    +}
    +
    +#footer, #footer a {
    +    color: #a0a0a0;
    +}
    +
    +#line-wrapping-toggle {
    +    vertical-align: middle;
    +}
    +
    +#label-for-line-wrapping-toggle {
    +    vertical-align: middle;
    +}
    +
    +ul {
    +    margin-left: 0;
    +}
    +
    +h1, h2, h3 {
    +    white-space: nowrap;
    +}
    +
    +h2 {
    +    font-size: 120%;
    +}
    +
    +ul.tabLinks {
    +    padding-left: 0;
    +    padding-top: 10px;
    +    padding-bottom: 10px;
    +    overflow: auto;
    +    min-width: 800px;
    +    width: auto !important;
    +    width: 800px;
    +}
    +
    +ul.tabLinks li {
    +    float: left;
    +    height: 100%;
    +    list-style: none;
    +    padding-left: 10px;
    +    padding-right: 10px;
    +    padding-top: 5px;
    +    padding-bottom: 5px;
    +    margin-bottom: 0;
    +    -moz-border-radius: 7px;
    +    border-radius: 7px;
    +    margin-right: 25px;
    +    border: solid 1px #d4d4d4;
    +    background-color: #f0f0f0;
    +}
    +
    +ul.tabLinks li:hover {
    +    background-color: #fafafa;
    +}
    +
    +ul.tabLinks li.selected {
    +    background-color: #c5f0f5;
    +    border-color: #c5f0f5;
    +}
    +
    +ul.tabLinks a {
    +    font-size: 120%;
    +    display: block;
    +    outline: none;
    +    text-decoration: none;
    +    margin: 0;
    +    padding: 0;
    +}
    +
    +ul.tabLinks li h2 {
    +    margin: 0;
    +    padding: 0;
    +}
    +
    +div.tab {
    +}
    +
    +div.selected {
    +    display: block;
    +}
    +
    +div.deselected {
    +    display: none;
    +}
    +
    +div.tab table {
    +    min-width: 350px;
    +    width: auto !important;
    +    width: 350px;
    +    border-collapse: collapse;
    +}
    +
    +div.tab th, div.tab table {
    +    border-bottom: solid #d0d0d0 1px;
    +}
    +
    +div.tab th {
    +    text-align: left;
    +    white-space: nowrap;
    +    padding-left: 6em;
    +}
    +
    +div.tab th:first-child {
    +    padding-left: 0;
    +}
    +
    +div.tab td {
    +    white-space: nowrap;
    +    padding-left: 6em;
    +    padding-top: 5px;
    +    padding-bottom: 5px;
    +}
    +
    +div.tab td:first-child {
    +    padding-left: 0;
    +}
    +
    +div.tab td.numeric, div.tab th.numeric {
    +    text-align: right;
    +}
    +
    +span.code {
    +    display: inline-block;
    +    margin-top: 0em;
    +    margin-bottom: 1em;
    +}
    +
    +span.code pre {
    +    font-size: 11pt;
    +    padding-top: 10px;
    +    padding-bottom: 10px;
    +    padding-left: 10px;
    +    padding-right: 10px;
    +    margin: 0;
    +    background-color: #f7f7f7;
    +    border: solid 1px #d0d0d0;
    +    min-width: 700px;
    +    width: auto !important;
    +    width: 700px;
    +}
    +
    +span.wrapped pre {
    +    word-wrap: break-word;
    +    white-space: pre-wrap;
    +    word-break: break-all;
    +}
    +
    +label.hidden {
    +    display: none;
    +}
    \ No newline at end of file
    diff --git a/build/reports/tests/test/css/style.css b/build/reports/tests/test/css/style.css
    new file mode 100644
    index 00000000..3dc4913e
    --- /dev/null
    +++ b/build/reports/tests/test/css/style.css
    @@ -0,0 +1,84 @@
    +
    +#summary {
    +    margin-top: 30px;
    +    margin-bottom: 40px;
    +}
    +
    +#summary table {
    +    border-collapse: collapse;
    +}
    +
    +#summary td {
    +    vertical-align: top;
    +}
    +
    +.breadcrumbs, .breadcrumbs a {
    +    color: #606060;
    +}
    +
    +.infoBox {
    +    width: 110px;
    +    padding-top: 15px;
    +    padding-bottom: 15px;
    +    text-align: center;
    +}
    +
    +.infoBox p {
    +    margin: 0;
    +}
    +
    +.counter, .percent {
    +    font-size: 120%;
    +    font-weight: bold;
    +    margin-bottom: 8px;
    +}
    +
    +#duration {
    +    width: 125px;
    +}
    +
    +#successRate, .summaryGroup {
    +    border: solid 2px #d0d0d0;
    +    -moz-border-radius: 10px;
    +    border-radius: 10px;
    +}
    +
    +#successRate {
    +    width: 140px;
    +    margin-left: 35px;
    +}
    +
    +#successRate .percent {
    +    font-size: 180%;
    +}
    +
    +.success, .success a {
    +    color: #008000;
    +}
    +
    +div.success, #successRate.success {
    +    background-color: #bbd9bb;
    +    border-color: #008000;
    +}
    +
    +.failures, .failures a {
    +    color: #b60808;
    +}
    +
    +.skipped, .skipped a {
    +    color: #c09853;
    +}
    +
    +div.failures, #successRate.failures {
    +    background-color: #ecdada;
    +    border-color: #b60808;
    +}
    +
    +ul.linkList {
    +    padding-left: 0;
    +}
    +
    +ul.linkList li {
    +    list-style: none;
    +    margin-bottom: 5px;
    +}
    diff --git a/build/reports/tests/test/index.html b/build/reports/tests/test/index.html
    new file mode 100644
    index 00000000..370d8f0d
    --- /dev/null
    +++ b/build/reports/tests/test/index.html
    @@ -0,0 +1,803 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Test Summary</title>
    +<link href="css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Test Summary</h1>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">169</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">1.074s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Packages</a>
    +</li>
    +<li>
    +<a href="#tab1">Classes</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Packages</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Package</th>
    +<th>Tests</th>
    +<th>Failures</th>
    +<th>Ignored</th>
    +<th>Duration</th>
    +<th>Success rate</th>
    +</tr>
    +</thead>
    +<tbody>
    +<tr>
    +<td class="success">
    +<a href="packages/default-package.html">default-package</a>
    +</td>
    +<td>169</td>
    +<td>0</td>
    +<td>0</td>
    +<td>1.074s</td>
    +<td class="success">100%</td>
    +</tr>
    +</tbody>
    +</table>
    +</div>
    +<div id="tab1" class="tab">
    +<h2>Classes</h2>
    +<table>
    +<thead>
    +<tr>
    +<th>Class</th>
    +<th>Tests</th>
    +<th>Failures</th>
    +<th>Ignored</th>
    +<th>Duration</th>
    +<th>Success rate</th>
    +</tr>
    +</thead>
    +<tbody>
    +<tr>
    +<td class="success">
    +<a href="classes/AnsiColorPluginTest$Init.html">AnsiColorPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/AwssumePluginTest$Apply$WithRoleProvided.html">AwssumePluginTest$Apply$WithRoleProvided</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.007s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/AwssumePluginTest$Apply$WithoutRoleProvided.html">AwssumePluginTest$Apply$WithoutRoleProvided</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/AwssumePluginTest$GetAwsRoleArn.html">AwssumePluginTest$GetAwsRoleArn</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/AwssumePluginTest$GetRegion.html">AwssumePluginTest$GetRegion</a>
    +</td>
    +<td>5</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.005s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/AwssumePluginTest$Init.html">AwssumePluginTest$Init</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/BuildGraphTest$WithASingleStage.html">BuildGraphTest$WithASingleStage</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.008s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/BuildGraphTest$WithMultipleStages.html">BuildGraphTest$WithMultipleStages</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.008s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ConditionApplyPluginTest.html">ConditionApplyPluginTest</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ConditionApplyPluginTest$ShouldApply.html">ConditionApplyPluginTest$ShouldApply</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ConfirmApplyPluginTest.html">ConfirmApplyPluginTest</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.147s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ConsulBackendPluginTest$Apply$AddressBackendParameter.html">ConsulBackendPluginTest$Apply$AddressBackendParameter</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ConsulBackendPluginTest$Apply$PathBackendParameter.html">ConsulBackendPluginTest$Apply$PathBackendParameter</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ConsulBackendPluginTest$Init.html">ConsulBackendPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/CredentialsPluginTest$Init.html">CredentialsPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.009s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/CredentialsPluginTest$PopulateDefaults.html">CredentialsPluginTest$PopulateDefaults</a>
    +</td>
    +<td>5</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/CredentialsPluginTest$ToEnvironmentVariable.html">CredentialsPluginTest$ToEnvironmentVariable</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/CredentialsPluginTest$WithBuildCredentials.html">CredentialsPluginTest$WithBuildCredentials</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.012s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/CrqPluginTest$AddCrq$withCrqEnvironment.html">CrqPluginTest$AddCrq$withCrqEnvironment</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.015s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/CrqPluginTest$AddCrq$withoutCrqEnvironment.html">CrqPluginTest$AddCrq$withoutCrqEnvironment</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/CrqPluginTest$GetCrqEnviroment.html">CrqPluginTest$GetCrqEnviroment</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/CrqPluginTest$Init.html">CrqPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/DefaultEnvironmentPluginTest$Init.html">DefaultEnvironmentPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/FileParametersPluginTest$GetVariables.html">FileParametersPluginTest$GetVariables</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.428s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/FileParametersPluginTest$Init.html">FileParametersPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/JenkinsfileTest$GetNodeName.html">JenkinsfileTest$GetNodeName</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.html">JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.html">JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/JenkinsfileTest$ParseScmUrl$WithSshUrl.html">JenkinsfileTest$ParseScmUrl$WithSshUrl</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ParameterStoreBuildWrapperPluginTest$Init.html">ParameterStoreBuildWrapperPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ParameterStoreBuildWrapperPluginTest$PathForEnvironment.html">ParameterStoreBuildWrapperPluginTest$PathForEnvironment</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ParameterStoreExecPluginTest$Apply.html">ParameterStoreExecPluginTest$Apply</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ParameterStoreExecPluginTest$Init.html">ParameterStoreExecPluginTest$Init</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/ParameterStoreExecPluginTest$PathForEnvironment.html">ParameterStoreExecPluginTest$PathForEnvironment</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/RegressionStageTest$AddedPlugins.html">RegressionStageTest$AddedPlugins</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/RegressionStageTest$AutomationRepo.html">RegressionStageTest$AutomationRepo</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.017s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/S3BackendPluginTest$Apply.html">S3BackendPluginTest$Apply</a>
    +</td>
    +<td>6</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.033s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/S3BackendPluginTest$GetBackend.html">S3BackendPluginTest$GetBackend</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/S3BackendPluginTest$GetDynamoTable.html">S3BackendPluginTest$GetDynamoTable</a>
    +</td>
    +<td>6</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/S3BackendPluginTest$GetKey.html">S3BackendPluginTest$GetKey</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/S3BackendPluginTest$GetRegion.html">S3BackendPluginTest$GetRegion</a>
    +</td>
    +<td>6</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.006s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/S3BackendPluginTest$Init.html">S3BackendPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.007s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformApplyCommandTest$Plugins.html">TerraformApplyCommandTest$Plugins</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.008s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformApplyCommandTest$WithArgument.html">TerraformApplyCommandTest$WithArgument</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformApplyCommandTest$WithDirectory.html">TerraformApplyCommandTest$WithDirectory</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformApplyCommandTest$WithInput.html">TerraformApplyCommandTest$WithInput</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformApplyCommandTest$WithPrefix.html">TerraformApplyCommandTest$WithPrefix</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.html">TerraformDirectoryPluginTest$Apply$WithDirectoryProvided</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.005s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.html">TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformDirectoryPluginTest$Init.html">TerraformDirectoryPluginTest$Init</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.007s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformEnvironmentStageTest$AddedPlugins.html">TerraformEnvironmentStageTest$AddedPlugins</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.012s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformEnvironmentStageTest$WithEnv.html">TerraformEnvironmentStageTest$WithEnv</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.022s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformEnvironmentStageTest$WithGlobalEnv.html">TerraformEnvironmentStageTest$WithGlobalEnv</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformInitCommandTest$Plugins.html">TerraformInitCommandTest$Plugins</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.130s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformInitCommandTest$WithBackendConfig.html">TerraformInitCommandTest$WithBackendConfig</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.008s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformInitCommandTest$WithDirectory.html">TerraformInitCommandTest$WithDirectory</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.006s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformInitCommandTest$WithInput.html">TerraformInitCommandTest$WithInput</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.026s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformPlanCommandTest$Plugins.html">TerraformPlanCommandTest$Plugins</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.010s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformPlanCommandTest$WithDirectory.html">TerraformPlanCommandTest$WithDirectory</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformPlanCommandTest$WithInput.html">TerraformPlanCommandTest$WithInput</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformPlanCommandTest$WithPrefix.html">TerraformPlanCommandTest$WithPrefix</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformValidateCommandTest$Plugins.html">TerraformValidateCommandTest$Plugins</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.006s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformValidateCommandTest$WithDirectory.html">TerraformValidateCommandTest$WithDirectory</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/TerraformValidateCommandTest$WithPrefix.html">TerraformValidateCommandTest$WithPrefix</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/WithAwsPluginTest$Init.html">WithAwsPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.021s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/WithAwsPluginTest$WithExplicitRole.html">WithAwsPluginTest$WithExplicitRole</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/WithAwsPluginTest$WithImplicitRole.html">WithAwsPluginTest$WithImplicitRole</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.017s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="classes/WithAwsPluginTest$WithRole.html">WithAwsPluginTest$WithRole</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +</tbody>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/reports/tests/test/js/report.js b/build/reports/tests/test/js/report.js
    new file mode 100644
    index 00000000..83bab4a1
    --- /dev/null
    +++ b/build/reports/tests/test/js/report.js
    @@ -0,0 +1,194 @@
    +(function (window, document) {
    +    "use strict";
    +
    +    var tabs = {};
    +
    +    function changeElementClass(element, classValue) {
    +        if (element.getAttribute("className")) {
    +            element.setAttribute("className", classValue);
    +        } else {
    +            element.setAttribute("class", classValue);
    +        }
    +    }
    +
    +    function getClassAttribute(element) {
    +        if (element.getAttribute("className")) {
    +            return element.getAttribute("className");
    +        } else {
    +            return element.getAttribute("class");
    +        }
    +    }
    +
    +    function addClass(element, classValue) {
    +        changeElementClass(element, getClassAttribute(element) + " " + classValue);
    +    }
    +
    +    function removeClass(element, classValue) {
    +        changeElementClass(element, getClassAttribute(element).replace(classValue, ""));
    +    }
    +
    +    function initTabs() {
    +        var container = document.getElementById("tabs");
    +
    +        tabs.tabs = findTabs(container);
    +        tabs.titles = findTitles(tabs.tabs);
    +        tabs.headers = findHeaders(container);
    +        tabs.select = select;
    +        tabs.deselectAll = deselectAll;
    +        tabs.select(0);
    +
    +        return true;
    +    }
    +
    +    function getCheckBox() {
    +        return document.getElementById("line-wrapping-toggle");
    +    }
    +
    +    function getLabelForCheckBox() {
    +        return document.getElementById("label-for-line-wrapping-toggle");
    +    }
    +
    +    function findCodeBlocks() {
    +        var spans = document.getElementById("tabs").getElementsByTagName("span");
    +        var codeBlocks = [];
    +        for (var i = 0; i < spans.length; ++i) {
    +            if (spans[i].className.indexOf("code") >= 0) {
    +                codeBlocks.push(spans[i]);
    +            }
    +        }
    +        return codeBlocks;
    +    }
    +
    +    function forAllCodeBlocks(operation) {
    +        var codeBlocks = findCodeBlocks();
    +
    +        for (var i = 0; i < codeBlocks.length; ++i) {
    +            operation(codeBlocks[i], "wrapped");
    +        }
    +    }
    +
    +    function toggleLineWrapping() {
    +        var checkBox = getCheckBox();
    +
    +        if (checkBox.checked) {
    +            forAllCodeBlocks(addClass);
    +        } else {
    +            forAllCodeBlocks(removeClass);
    +        }
    +    }
    +
    +    function initControls() {
    +        if (findCodeBlocks().length > 0) {
    +            var checkBox = getCheckBox();
    +            var label = getLabelForCheckBox();
    +
    +            checkBox.onclick = toggleLineWrapping;
    +            checkBox.checked = false;
    +
    +            removeClass(label, "hidden");
    +         }
    +    }
    +
    +    function switchTab() {
    +        var id = this.id.substr(1);
    +
    +        for (var i = 0; i < tabs.tabs.length; i++) {
    +            if (tabs.tabs[i].id === id) {
    +                tabs.select(i);
    +                break;
    +            }
    +        }
    +
    +        return false;
    +    }
    +
    +    function select(i) {
    +        this.deselectAll();
    +
    +        changeElementClass(this.tabs[i], "tab selected");
    +        changeElementClass(this.headers[i], "selected");
    +
    +        while (this.headers[i].firstChild) {
    +            this.headers[i].removeChild(this.headers[i].firstChild);
    +        }
    +
    +        var h2 = document.createElement("H2");
    +
    +        h2.appendChild(document.createTextNode(this.titles[i]));
    +        this.headers[i].appendChild(h2);
    +    }
    +
    +    function deselectAll() {
    +        for (var i = 0; i < this.tabs.length; i++) {
    +            changeElementClass(this.tabs[i], "tab deselected");
    +            changeElementClass(this.headers[i], "deselected");
    +
    +            while (this.headers[i].firstChild) {
    +                this.headers[i].removeChild(this.headers[i].firstChild);
    +            }
    +
    +            var a = document.createElement("A");
    +
    +            a.setAttribute("id", "ltab" + i);
    +            a.setAttribute("href", "#tab" + i);
    +            a.onclick = switchTab;
    +            a.appendChild(document.createTextNode(this.titles[i]));
    +
    +            this.headers[i].appendChild(a);
    +        }
    +    }
    +
    +    function findTabs(container) {
    +        return findChildElements(container, "DIV", "tab");
    +    }
    +
    +    function findHeaders(container) {
    +        var owner = findChildElements(container, "UL", "tabLinks");
    +        return findChildElements(owner[0], "LI", null);
    +    }
    +
    +    function findTitles(tabs) {
    +        var titles = [];
    +
    +        for (var i = 0; i < tabs.length; i++) {
    +            var tab = tabs[i];
    +            var header = findChildElements(tab, "H2", null)[0];
    +
    +            header.parentNode.removeChild(header);
    +
    +            if (header.innerText) {
    +                titles.push(header.innerText);
    +            } else {
    +                titles.push(header.textContent);
    +            }
    +        }
    +
    +        return titles;
    +    }
    +
    +    function findChildElements(container, name, targetClass) {
    +        var elements = [];
    +        var children = container.childNodes;
    +
    +        for (var i = 0; i < children.length; i++) {
    +            var child = children.item(i);
    +
    +            if (child.nodeType === 1 && child.nodeName === name) {
    +                if (targetClass && child.className.indexOf(targetClass) < 0) {
    +                    continue;
    +                }
    +
    +                elements.push(child);
    +            }
    +        }
    +
    +        return elements;
    +    }
    +
    +    // Entry point.
    +
    +    window.onload = function() {
    +        initTabs();
    +        initControls();
    +    };
    +} (window, window.document));
    \ No newline at end of file
    diff --git a/build/reports/tests/test/packages/default-package.html b/build/reports/tests/test/packages/default-package.html
    new file mode 100644
    index 00000000..0d985288
    --- /dev/null
    +++ b/build/reports/tests/test/packages/default-package.html
    @@ -0,0 +1,773 @@
    +<!DOCTYPE html>
    +<html>
    +<head>
    +<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    +<meta http-equiv="x-ua-compatible" content="IE=edge"/>
    +<title>Test results - Default package</title>
    +<link href="../css/base-style.css" rel="stylesheet" type="text/css"/>
    +<link href="../css/style.css" rel="stylesheet" type="text/css"/>
    +<script src="../js/report.js" type="text/javascript"></script>
    +</head>
    +<body>
    +<div id="content">
    +<h1>Default package</h1>
    +<div class="breadcrumbs">
    +<a href="../index.html">all</a> &gt; default-package</div>
    +<div id="summary">
    +<table>
    +<tr>
    +<td>
    +<div class="summaryGroup">
    +<table>
    +<tr>
    +<td>
    +<div class="infoBox" id="tests">
    +<div class="counter">169</div>
    +<p>tests</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="failures">
    +<div class="counter">0</div>
    +<p>failures</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="ignored">
    +<div class="counter">0</div>
    +<p>ignored</p>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox" id="duration">
    +<div class="counter">1.074s</div>
    +<p>duration</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +</td>
    +<td>
    +<div class="infoBox success" id="successRate">
    +<div class="percent">100%</div>
    +<p>successful</p>
    +</div>
    +</td>
    +</tr>
    +</table>
    +</div>
    +<div id="tabs">
    +<ul class="tabLinks">
    +<li>
    +<a href="#tab0">Classes</a>
    +</li>
    +</ul>
    +<div id="tab0" class="tab">
    +<h2>Classes</h2>
    +<table>
    +<thread>
    +<tr>
    +<th>Class</th>
    +<th>Tests</th>
    +<th>Failures</th>
    +<th>Ignored</th>
    +<th>Duration</th>
    +<th>Success rate</th>
    +</tr>
    +</thread>
    +<tr>
    +<td class="success">
    +<a href="../classes/AnsiColorPluginTest$Init.html">AnsiColorPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/AwssumePluginTest$Apply$WithRoleProvided.html">AwssumePluginTest$Apply$WithRoleProvided</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.007s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/AwssumePluginTest$Apply$WithoutRoleProvided.html">AwssumePluginTest$Apply$WithoutRoleProvided</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/AwssumePluginTest$GetAwsRoleArn.html">AwssumePluginTest$GetAwsRoleArn</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/AwssumePluginTest$GetRegion.html">AwssumePluginTest$GetRegion</a>
    +</td>
    +<td>5</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.005s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/AwssumePluginTest$Init.html">AwssumePluginTest$Init</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/BuildGraphTest$WithASingleStage.html">BuildGraphTest$WithASingleStage</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.008s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/BuildGraphTest$WithMultipleStages.html">BuildGraphTest$WithMultipleStages</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.008s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ConditionApplyPluginTest.html">ConditionApplyPluginTest</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ConditionApplyPluginTest$ShouldApply.html">ConditionApplyPluginTest$ShouldApply</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ConfirmApplyPluginTest.html">ConfirmApplyPluginTest</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.147s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ConsulBackendPluginTest$Apply$AddressBackendParameter.html">ConsulBackendPluginTest$Apply$AddressBackendParameter</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ConsulBackendPluginTest$Apply$PathBackendParameter.html">ConsulBackendPluginTest$Apply$PathBackendParameter</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ConsulBackendPluginTest$Init.html">ConsulBackendPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/CredentialsPluginTest$Init.html">CredentialsPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.009s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/CredentialsPluginTest$PopulateDefaults.html">CredentialsPluginTest$PopulateDefaults</a>
    +</td>
    +<td>5</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/CredentialsPluginTest$ToEnvironmentVariable.html">CredentialsPluginTest$ToEnvironmentVariable</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/CredentialsPluginTest$WithBuildCredentials.html">CredentialsPluginTest$WithBuildCredentials</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.012s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/CrqPluginTest$AddCrq$withCrqEnvironment.html">CrqPluginTest$AddCrq$withCrqEnvironment</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.015s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/CrqPluginTest$AddCrq$withoutCrqEnvironment.html">CrqPluginTest$AddCrq$withoutCrqEnvironment</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/CrqPluginTest$GetCrqEnviroment.html">CrqPluginTest$GetCrqEnviroment</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/CrqPluginTest$Init.html">CrqPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/DefaultEnvironmentPluginTest$Init.html">DefaultEnvironmentPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/FileParametersPluginTest$GetVariables.html">FileParametersPluginTest$GetVariables</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.428s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/FileParametersPluginTest$Init.html">FileParametersPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/JenkinsfileTest$GetNodeName.html">JenkinsfileTest$GetNodeName</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.html">JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.html">JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/JenkinsfileTest$ParseScmUrl$WithSshUrl.html">JenkinsfileTest$ParseScmUrl$WithSshUrl</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ParameterStoreBuildWrapperPluginTest$Init.html">ParameterStoreBuildWrapperPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ParameterStoreBuildWrapperPluginTest$PathForEnvironment.html">ParameterStoreBuildWrapperPluginTest$PathForEnvironment</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ParameterStoreExecPluginTest$Apply.html">ParameterStoreExecPluginTest$Apply</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ParameterStoreExecPluginTest$Init.html">ParameterStoreExecPluginTest$Init</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/ParameterStoreExecPluginTest$PathForEnvironment.html">ParameterStoreExecPluginTest$PathForEnvironment</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/RegressionStageTest$AddedPlugins.html">RegressionStageTest$AddedPlugins</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/RegressionStageTest$AutomationRepo.html">RegressionStageTest$AutomationRepo</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.017s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/S3BackendPluginTest$Apply.html">S3BackendPluginTest$Apply</a>
    +</td>
    +<td>6</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.033s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/S3BackendPluginTest$GetBackend.html">S3BackendPluginTest$GetBackend</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/S3BackendPluginTest$GetDynamoTable.html">S3BackendPluginTest$GetDynamoTable</a>
    +</td>
    +<td>6</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/S3BackendPluginTest$GetKey.html">S3BackendPluginTest$GetKey</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/S3BackendPluginTest$GetRegion.html">S3BackendPluginTest$GetRegion</a>
    +</td>
    +<td>6</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.006s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/S3BackendPluginTest$Init.html">S3BackendPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.007s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformApplyCommandTest$Plugins.html">TerraformApplyCommandTest$Plugins</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.008s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformApplyCommandTest$WithArgument.html">TerraformApplyCommandTest$WithArgument</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformApplyCommandTest$WithDirectory.html">TerraformApplyCommandTest$WithDirectory</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformApplyCommandTest$WithInput.html">TerraformApplyCommandTest$WithInput</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformApplyCommandTest$WithPrefix.html">TerraformApplyCommandTest$WithPrefix</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.html">TerraformDirectoryPluginTest$Apply$WithDirectoryProvided</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.005s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.html">TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.002s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformDirectoryPluginTest$Init.html">TerraformDirectoryPluginTest$Init</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.007s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformEnvironmentStageTest$AddedPlugins.html">TerraformEnvironmentStageTest$AddedPlugins</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.012s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformEnvironmentStageTest$WithEnv.html">TerraformEnvironmentStageTest$WithEnv</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.022s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformEnvironmentStageTest$WithGlobalEnv.html">TerraformEnvironmentStageTest$WithGlobalEnv</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformInitCommandTest$Plugins.html">TerraformInitCommandTest$Plugins</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.130s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformInitCommandTest$WithBackendConfig.html">TerraformInitCommandTest$WithBackendConfig</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.008s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformInitCommandTest$WithDirectory.html">TerraformInitCommandTest$WithDirectory</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.006s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformInitCommandTest$WithInput.html">TerraformInitCommandTest$WithInput</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.026s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformPlanCommandTest$Plugins.html">TerraformPlanCommandTest$Plugins</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.010s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformPlanCommandTest$WithDirectory.html">TerraformPlanCommandTest$WithDirectory</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformPlanCommandTest$WithInput.html">TerraformPlanCommandTest$WithInput</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.004s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformPlanCommandTest$WithPrefix.html">TerraformPlanCommandTest$WithPrefix</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformValidateCommandTest$Plugins.html">TerraformValidateCommandTest$Plugins</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.006s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformValidateCommandTest$WithDirectory.html">TerraformValidateCommandTest$WithDirectory</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/TerraformValidateCommandTest$WithPrefix.html">TerraformValidateCommandTest$WithPrefix</a>
    +</td>
    +<td>2</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/WithAwsPluginTest$Init.html">WithAwsPluginTest$Init</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.021s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/WithAwsPluginTest$WithExplicitRole.html">WithAwsPluginTest$WithExplicitRole</a>
    +</td>
    +<td>3</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.003s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/WithAwsPluginTest$WithImplicitRole.html">WithAwsPluginTest$WithImplicitRole</a>
    +</td>
    +<td>4</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.017s</td>
    +<td class="success">100%</td>
    +</tr>
    +<tr>
    +<td class="success">
    +<a href="../classes/WithAwsPluginTest$WithRole.html">WithAwsPluginTest$WithRole</a>
    +</td>
    +<td>1</td>
    +<td>0</td>
    +<td>0</td>
    +<td>0.001s</td>
    +<td class="success">100%</td>
    +</tr>
    +</table>
    +</div>
    +</div>
    +<div id="footer">
    +<p>
    +<div>
    +<label class="hidden" id="label-for-line-wrapping-toggle" for="line-wrapping-toggle">Wrap lines
    +<input id="line-wrapping-toggle" type="checkbox" autocomplete="off"/>
    +</label>
    +</div>Generated by 
    +<a href="http://www.gradle.org">Gradle 5.0</a> at Aug 28, 2019 3:36:11 PM</p>
    +</div>
    +</div>
    +</body>
    +</html>
    diff --git a/build/test-results/test/TEST-AnsiColorPluginTest$Init.xml b/build/test-results/test/TEST-AnsiColorPluginTest$Init.xml
    new file mode 100644
    index 00000000..a8cb45c8
    --- /dev/null
    +++ b/build/test-results/test/TEST-AnsiColorPluginTest$Init.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="AnsiColorPluginTest$Init" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="modifiesTerraformEnvironmentStage" classname="AnsiColorPluginTest$Init" time="0.003"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-AwssumePluginTest$Apply$WithRoleProvided.xml b/build/test-results/test/TEST-AwssumePluginTest$Apply$WithRoleProvided.xml
    new file mode 100644
    index 00000000..f8773b91
    --- /dev/null
    +++ b/build/test-results/test/TEST-AwssumePluginTest$Apply$WithRoleProvided.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="AwssumePluginTest$Apply$WithRoleProvided" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.007">
    +  <properties/>
    +  <testcase name="addsEnvironmentSpecificRoleArnAsPrefixToTerraformInit" classname="AwssumePluginTest$Apply$WithRoleProvided" time="0.003"/>
    +  <testcase name="addsEnvironmentSpecificRoleArnAsPrefixToTerraformPlan" classname="AwssumePluginTest$Apply$WithRoleProvided" time="0.002"/>
    +  <testcase name="addsEnvironmentSpecificRoleArnAsPrefixToTerraformApply" classname="AwssumePluginTest$Apply$WithRoleProvided" time="0.002"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-AwssumePluginTest$Apply$WithoutRoleProvided.xml b/build/test-results/test/TEST-AwssumePluginTest$Apply$WithoutRoleProvided.xml
    new file mode 100644
    index 00000000..894e372f
    --- /dev/null
    +++ b/build/test-results/test/TEST-AwssumePluginTest$Apply$WithoutRoleProvided.xml
    @@ -0,0 +1,12 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="AwssumePluginTest$Apply$WithoutRoleProvided" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.004">
    +  <properties/>
    +  <testcase name="skipsAwssumeForTerraformApply" classname="AwssumePluginTest$Apply$WithoutRoleProvided" time="0.001"/>
    +  <testcase name="skipsAwssumeForTerraformInit" classname="AwssumePluginTest$Apply$WithoutRoleProvided" time="0.002"/>
    +  <testcase name="skipsAwssumeForTerraformPlan" classname="AwssumePluginTest$Apply$WithoutRoleProvided" time="0.001"/>
    +  <system-out><![CDATA[No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the myEnv environment.
    +No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the myEnv environment.
    +No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the myEnv environment.
    +]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-AwssumePluginTest$GetAwsRoleArn.xml b/build/test-results/test/TEST-AwssumePluginTest$GetAwsRoleArn.xml
    new file mode 100644
    index 00000000..5d22a077
    --- /dev/null
    +++ b/build/test-results/test/TEST-AwssumePluginTest$GetAwsRoleArn.xml
    @@ -0,0 +1,10 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="AwssumePluginTest$GetAwsRoleArn" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.004">
    +  <properties/>
    +  <testcase name="returnsEnvironmentSpecificAwsRoleArnIfPresent" classname="AwssumePluginTest$GetAwsRoleArn" time="0.002"/>
    +  <testcase name="returnsEnvironmentSpecifiedAwsRoleArnIfPresentCaseInsensitive" classname="AwssumePluginTest$GetAwsRoleArn" time="0.001"/>
    +  <testcase name="prefersAwsArnRoleOverEnvironmentSpecificRole" classname="AwssumePluginTest$GetAwsRoleArn" time="0.0"/>
    +  <testcase name="returnsAwsRoleArnIfPresent" classname="AwssumePluginTest$GetAwsRoleArn" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-AwssumePluginTest$GetRegion.xml b/build/test-results/test/TEST-AwssumePluginTest$GetRegion.xml
    new file mode 100644
    index 00000000..cb917062
    --- /dev/null
    +++ b/build/test-results/test/TEST-AwssumePluginTest$GetRegion.xml
    @@ -0,0 +1,11 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="AwssumePluginTest$GetRegion" tests="5" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.005">
    +  <properties/>
    +  <testcase name="prefersRegionOverEnvironmentSpecificRegion" classname="AwssumePluginTest$GetRegion" time="0.001"/>
    +  <testcase name="returnsEnvironmentSpecificRegionIfPresent" classname="AwssumePluginTest$GetRegion" time="0.001"/>
    +  <testcase name="returnsAwsRegionIfPresent" classname="AwssumePluginTest$GetRegion" time="0.001"/>
    +  <testcase name="returnsAwsDefaultRegionIfPresent" classname="AwssumePluginTest$GetRegion" time="0.001"/>
    +  <testcase name="prefersEnvironmentSpecificRegionOverDefaultRegion" classname="AwssumePluginTest$GetRegion" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-AwssumePluginTest$Init.xml b/build/test-results/test/TEST-AwssumePluginTest$Init.xml
    new file mode 100644
    index 00000000..c5543a8f
    --- /dev/null
    +++ b/build/test-results/test/TEST-AwssumePluginTest$Init.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="AwssumePluginTest$Init" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.005">
    +  <properties/>
    +  <testcase name="modifiesTerraformInitCommand" classname="AwssumePluginTest$Init" time="0.003"/>
    +  <testcase name="modifiesTerraformPlanCommand" classname="AwssumePluginTest$Init" time="0.0"/>
    +  <testcase name="modifiesTerraformApplyCommand" classname="AwssumePluginTest$Init" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-BuildGraphTest$WithASingleStage.xml b/build/test-results/test/TEST-BuildGraphTest$WithASingleStage.xml
    new file mode 100644
    index 00000000..7f2e4715
    --- /dev/null
    +++ b/build/test-results/test/TEST-BuildGraphTest$WithASingleStage.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="BuildGraphTest$WithASingleStage" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.008">
    +  <properties/>
    +  <testcase name="buildsTheStageThatItWasCreatedWith" classname="BuildGraphTest$WithASingleStage" time="0.008"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-BuildGraphTest$WithMultipleStages.xml b/build/test-results/test/TEST-BuildGraphTest$WithMultipleStages.xml
    new file mode 100644
    index 00000000..678f448d
    --- /dev/null
    +++ b/build/test-results/test/TEST-BuildGraphTest$WithMultipleStages.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="BuildGraphTest$WithMultipleStages" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.008">
    +  <properties/>
    +  <testcase name="buildsTheStagesInOrder" classname="BuildGraphTest$WithMultipleStages" time="0.008"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ConditionApplyPluginTest$ShouldApply.xml b/build/test-results/test/TEST-ConditionApplyPluginTest$ShouldApply.xml
    new file mode 100644
    index 00000000..c2d21ae9
    --- /dev/null
    +++ b/build/test-results/test/TEST-ConditionApplyPluginTest$ShouldApply.xml
    @@ -0,0 +1,11 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ConditionApplyPluginTest$ShouldApply" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.004">
    +  <properties/>
    +  <testcase name="returnsTrueForMaster" classname="ConditionApplyPluginTest$ShouldApply" time="0.002"/>
    +  <testcase name="returnsFalseForNonMaster" classname="ConditionApplyPluginTest$ShouldApply" time="0.0"/>
    +  <testcase name="returnsTrueWhenBranchIsUnknown" classname="ConditionApplyPluginTest$ShouldApply" time="0.001"/>
    +  <system-out><![CDATA[Current branch 'master' matches expected branch 'master', stage branch-condition is met and will run.
    +Current branch is null - you're probably using a single-branch job which doesn't make your branch name available.  Assume that apply should be enabled.
    +]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ConditionApplyPluginTest.xml b/build/test-results/test/TEST-ConditionApplyPluginTest.xml
    new file mode 100644
    index 00000000..4abd2e50
    --- /dev/null
    +++ b/build/test-results/test/TEST-ConditionApplyPluginTest.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ConditionApplyPluginTest" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.0">
    +  <properties/>
    +  <testcase name="modifiesTerraformEnvironmentStageByDefault" classname="ConditionApplyPluginTest" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ConfirmApplyPluginTest.xml b/build/test-results/test/TEST-ConfirmApplyPluginTest.xml
    new file mode 100644
    index 00000000..4c57da37
    --- /dev/null
    +++ b/build/test-results/test/TEST-ConfirmApplyPluginTest.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ConfirmApplyPluginTest" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.147">
    +  <properties/>
    +  <testcase name="ConfirmApplyPluginDisabled" classname="ConfirmApplyPluginTest" time="0.108"/>
    +  <testcase name="modifiesTerraformEnvironmentStageByDefault" classname="ConfirmApplyPluginTest" time="0.037"/>
    +  <testcase name="ConfirmApplyPluginEnabled" classname="ConfirmApplyPluginTest" time="0.002"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ConsulBackendPluginTest$Apply$AddressBackendParameter.xml b/build/test-results/test/TEST-ConsulBackendPluginTest$Apply$AddressBackendParameter.xml
    new file mode 100644
    index 00000000..4b7e9468
    --- /dev/null
    +++ b/build/test-results/test/TEST-ConsulBackendPluginTest$Apply$AddressBackendParameter.xml
    @@ -0,0 +1,10 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ConsulBackendPluginTest$Apply$AddressBackendParameter" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="isNotAddedByDefault" classname="ConsulBackendPluginTest$Apply$AddressBackendParameter" time="0.001"/>
    +  <testcase name="isAddedIfEnvironmentVariablePresent" classname="ConsulBackendPluginTest$Apply$AddressBackendParameter" time="0.001"/>
    +  <testcase name="isAddedAndPrefersTheExplicitValueOverTheDefaultEnvironmentValue" classname="ConsulBackendPluginTest$Apply$AddressBackendParameter" time="0.001"/>
    +  <testcase name="isAddedIfExplicitlySet" classname="ConsulBackendPluginTest$Apply$AddressBackendParameter" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ConsulBackendPluginTest$Apply$PathBackendParameter.xml b/build/test-results/test/TEST-ConsulBackendPluginTest$Apply$PathBackendParameter.xml
    new file mode 100644
    index 00000000..0c664669
    --- /dev/null
    +++ b/build/test-results/test/TEST-ConsulBackendPluginTest$Apply$PathBackendParameter.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ConsulBackendPluginTest$Apply$PathBackendParameter" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="isAddedAndIsEnvironmentSpecific" classname="ConsulBackendPluginTest$Apply$PathBackendParameter" time="0.001"/>
    +  <testcase name="isAddedAndUsesCustomizablePattern" classname="ConsulBackendPluginTest$Apply$PathBackendParameter" time="0.002"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ConsulBackendPluginTest$Init.xml b/build/test-results/test/TEST-ConsulBackendPluginTest$Init.xml
    new file mode 100644
    index 00000000..98c235da
    --- /dev/null
    +++ b/build/test-results/test/TEST-ConsulBackendPluginTest$Init.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ConsulBackendPluginTest$Init" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="modifiesTerraformInitCommand" classname="ConsulBackendPluginTest$Init" time="0.003"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-CredentialsPluginTest$Init.xml b/build/test-results/test/TEST-CredentialsPluginTest$Init.xml
    new file mode 100644
    index 00000000..a3a5eea0
    --- /dev/null
    +++ b/build/test-results/test/TEST-CredentialsPluginTest$Init.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="CredentialsPluginTest$Init" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.009">
    +  <properties/>
    +  <testcase name="modifiesBuildStage" classname="CredentialsPluginTest$Init" time="0.009"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-CredentialsPluginTest$PopulateDefaults.xml b/build/test-results/test/TEST-CredentialsPluginTest$PopulateDefaults.xml
    new file mode 100644
    index 00000000..f4237db7
    --- /dev/null
    +++ b/build/test-results/test/TEST-CredentialsPluginTest$PopulateDefaults.xml
    @@ -0,0 +1,11 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="CredentialsPluginTest$PopulateDefaults" tests="5" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.002">
    +  <properties/>
    +  <testcase name="defaultsUserVariableUsingCredentialsId" classname="CredentialsPluginTest$PopulateDefaults" time="0.001"/>
    +  <testcase name="populatesCredentialsId" classname="CredentialsPluginTest$PopulateDefaults" time="0.0"/>
    +  <testcase name="defaultsPasswordVariableUsingCredentialsId" classname="CredentialsPluginTest$PopulateDefaults" time="0.001"/>
    +  <testcase name="allowsCustomUserVariable" classname="CredentialsPluginTest$PopulateDefaults" time="0.0"/>
    +  <testcase name="allowsCustomPasswordVariable" classname="CredentialsPluginTest$PopulateDefaults" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-CredentialsPluginTest$ToEnvironmentVariable.xml b/build/test-results/test/TEST-CredentialsPluginTest$ToEnvironmentVariable.xml
    new file mode 100644
    index 00000000..eba59204
    --- /dev/null
    +++ b/build/test-results/test/TEST-CredentialsPluginTest$ToEnvironmentVariable.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="CredentialsPluginTest$ToEnvironmentVariable" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="convertsDashesToUnderscore" classname="CredentialsPluginTest$ToEnvironmentVariable" time="0.002"/>
    +  <testcase name="convertsAllTheThings" classname="CredentialsPluginTest$ToEnvironmentVariable" time="0.0"/>
    +  <testcase name="convertsLowercaseToUppercase" classname="CredentialsPluginTest$ToEnvironmentVariable" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-CredentialsPluginTest$WithBuildCredentials.xml b/build/test-results/test/TEST-CredentialsPluginTest$WithBuildCredentials.xml
    new file mode 100644
    index 00000000..b8f5d28e
    --- /dev/null
    +++ b/build/test-results/test/TEST-CredentialsPluginTest$WithBuildCredentials.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="CredentialsPluginTest$WithBuildCredentials" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.012">
    +  <properties/>
    +  <testcase name="addsCredentialsForBuildStage" classname="CredentialsPluginTest$WithBuildCredentials" time="0.01"/>
    +  <testcase name="addsMultipleCredentialsForBuildStage" classname="CredentialsPluginTest$WithBuildCredentials" time="0.002"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-CrqPluginTest$AddCrq$withCrqEnvironment.xml b/build/test-results/test/TEST-CrqPluginTest$AddCrq$withCrqEnvironment.xml
    new file mode 100644
    index 00000000..acd24dfc
    --- /dev/null
    +++ b/build/test-results/test/TEST-CrqPluginTest$AddCrq$withCrqEnvironment.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="CrqPluginTest$AddCrq$withCrqEnvironment" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.015">
    +  <properties/>
    +  <testcase name="shouldExecutePipeline" classname="CrqPluginTest$AddCrq$withCrqEnvironment" time="0.015"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-CrqPluginTest$AddCrq$withoutCrqEnvironment.xml b/build/test-results/test/TEST-CrqPluginTest$AddCrq$withoutCrqEnvironment.xml
    new file mode 100644
    index 00000000..f3c83ed7
    --- /dev/null
    +++ b/build/test-results/test/TEST-CrqPluginTest$AddCrq$withoutCrqEnvironment.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="CrqPluginTest$AddCrq$withoutCrqEnvironment" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="shouldExecutePipeline" classname="CrqPluginTest$AddCrq$withoutCrqEnvironment" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-CrqPluginTest$GetCrqEnviroment.xml b/build/test-results/test/TEST-CrqPluginTest$GetCrqEnviroment.xml
    new file mode 100644
    index 00000000..4da99914
    --- /dev/null
    +++ b/build/test-results/test/TEST-CrqPluginTest$GetCrqEnviroment.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="CrqPluginTest$GetCrqEnviroment" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="returnsCrqEnvirommentIfPresent" classname="CrqPluginTest$GetCrqEnviroment" time="0.002"/>
    +  <testcase name="prefersNonPrefixedCrqOverPrefixedCrq" classname="CrqPluginTest$GetCrqEnviroment" time="0.0"/>
    +  <testcase name="returnsEnvironmentSpecificCrqEnvirommentIfPresent" classname="CrqPluginTest$GetCrqEnviroment" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-CrqPluginTest$Init.xml b/build/test-results/test/TEST-CrqPluginTest$Init.xml
    new file mode 100644
    index 00000000..0f78b074
    --- /dev/null
    +++ b/build/test-results/test/TEST-CrqPluginTest$Init.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="CrqPluginTest$Init" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.004">
    +  <properties/>
    +  <testcase name="modifiesTerraformEnvironmentStageCommand" classname="CrqPluginTest$Init" time="0.004"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-DefaultEnvironmentPluginTest$Init.xml b/build/test-results/test/TEST-DefaultEnvironmentPluginTest$Init.xml
    new file mode 100644
    index 00000000..721e81ba
    --- /dev/null
    +++ b/build/test-results/test/TEST-DefaultEnvironmentPluginTest$Init.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="DefaultEnvironmentPluginTest$Init" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.0">
    +  <properties/>
    +  <testcase name="modifiesTerraformEnvironmentStageByDefault" classname="DefaultEnvironmentPluginTest$Init" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-FileParametersPluginTest$GetVariables.xml b/build/test-results/test/TEST-FileParametersPluginTest$GetVariables.xml
    new file mode 100644
    index 00000000..80fa2afa
    --- /dev/null
    +++ b/build/test-results/test/TEST-FileParametersPluginTest$GetVariables.xml
    @@ -0,0 +1,10 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="FileParametersPluginTest$GetVariables" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.428">
    +  <properties/>
    +  <testcase name="handlesCarriageReturnCharacters" classname="FileParametersPluginTest$GetVariables" time="0.354"/>
    +  <testcase name="ignoresTrailingNewline" classname="FileParametersPluginTest$GetVariables" time="0.028"/>
    +  <testcase name="returnsAValueForEachLine" classname="FileParametersPluginTest$GetVariables" time="0.026"/>
    +  <testcase name="interpolatesReferencesToOtherEnvironmentVariables" classname="FileParametersPluginTest$GetVariables" time="0.02"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-FileParametersPluginTest$Init.xml b/build/test-results/test/TEST-FileParametersPluginTest$Init.xml
    new file mode 100644
    index 00000000..3abd7579
    --- /dev/null
    +++ b/build/test-results/test/TEST-FileParametersPluginTest$Init.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="FileParametersPluginTest$Init" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.004">
    +  <properties/>
    +  <testcase name="modifiesTerraformEnvironmentStage" classname="FileParametersPluginTest$Init" time="0.004"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-JenkinsfileTest$GetNodeName.xml b/build/test-results/test/TEST-JenkinsfileTest$GetNodeName.xml
    new file mode 100644
    index 00000000..38e08dbe
    --- /dev/null
    +++ b/build/test-results/test/TEST-JenkinsfileTest$GetNodeName.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="JenkinsfileTest$GetNodeName" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.002">
    +  <properties/>
    +  <testcase name="returnsDefaultNodeNameEvenWhenEnvironmentVariableGiven" classname="JenkinsfileTest$GetNodeName" time="0.001"/>
    +  <testcase name="returnsEnvironmentVariableWhenDefaultNodeNameNotGiven" classname="JenkinsfileTest$GetNodeName" time="0.001"/>
    +  <testcase name="returnsDefaultNodeNameWhenPresent" classname="JenkinsfileTest$GetNodeName" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.xml b/build/test-results/test/TEST-JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.xml
    new file mode 100644
    index 00000000..34175b74
    --- /dev/null
    +++ b/build/test-results/test/TEST-JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="returnsRepo" classname="JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp" time="0.003"/>
    +  <testcase name="returnsOrganization" classname="JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttp" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.xml b/build/test-results/test/TEST-JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.xml
    new file mode 100644
    index 00000000..0ac061dc
    --- /dev/null
    +++ b/build/test-results/test/TEST-JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="returnsRepo" classname="JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps" time="0.001"/>
    +  <testcase name="returnsOrganization" classname="JenkinsfileTest$ParseScmUrl$WithHttpUrl$WithHttps" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-JenkinsfileTest$ParseScmUrl$WithSshUrl.xml b/build/test-results/test/TEST-JenkinsfileTest$ParseScmUrl$WithSshUrl.xml
    new file mode 100644
    index 00000000..8c2b500d
    --- /dev/null
    +++ b/build/test-results/test/TEST-JenkinsfileTest$ParseScmUrl$WithSshUrl.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="JenkinsfileTest$ParseScmUrl$WithSshUrl" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="returnsRepo" classname="JenkinsfileTest$ParseScmUrl$WithSshUrl" time="0.0"/>
    +  <testcase name="returnsOrganization" classname="JenkinsfileTest$ParseScmUrl$WithSshUrl" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ParameterStoreBuildWrapperPluginTest$Init.xml b/build/test-results/test/TEST-ParameterStoreBuildWrapperPluginTest$Init.xml
    new file mode 100644
    index 00000000..1d9519cd
    --- /dev/null
    +++ b/build/test-results/test/TEST-ParameterStoreBuildWrapperPluginTest$Init.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ParameterStoreBuildWrapperPluginTest$Init" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="modifiesTerraformEnvironmentStageCommand" classname="ParameterStoreBuildWrapperPluginTest$Init" time="0.003"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ParameterStoreBuildWrapperPluginTest$PathForEnvironment.xml b/build/test-results/test/TEST-ParameterStoreBuildWrapperPluginTest$PathForEnvironment.xml
    new file mode 100644
    index 00000000..fe359a11
    --- /dev/null
    +++ b/build/test-results/test/TEST-ParameterStoreBuildWrapperPluginTest$PathForEnvironment.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ParameterStoreBuildWrapperPluginTest$PathForEnvironment" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="constructPathUsingOrgRepoAndEnvironment" classname="ParameterStoreBuildWrapperPluginTest$PathForEnvironment" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ParameterStoreExecPluginTest$Apply.xml b/build/test-results/test/TEST-ParameterStoreExecPluginTest$Apply.xml
    new file mode 100644
    index 00000000..771509ff
    --- /dev/null
    +++ b/build/test-results/test/TEST-ParameterStoreExecPluginTest$Apply.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ParameterStoreExecPluginTest$Apply" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="addsParameterStorePrefixToTerraformPlan" classname="ParameterStoreExecPluginTest$Apply" time="0.0"/>
    +  <testcase name="addsParameterStorePrefixToTerraformApply" classname="ParameterStoreExecPluginTest$Apply" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ParameterStoreExecPluginTest$Init.xml b/build/test-results/test/TEST-ParameterStoreExecPluginTest$Init.xml
    new file mode 100644
    index 00000000..502206b3
    --- /dev/null
    +++ b/build/test-results/test/TEST-ParameterStoreExecPluginTest$Init.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ParameterStoreExecPluginTest$Init" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="modifiesTerraformEnvironmentStage" classname="ParameterStoreExecPluginTest$Init" time="0.003"/>
    +  <testcase name="modifiesTerraformPlanCommand" classname="ParameterStoreExecPluginTest$Init" time="0.0"/>
    +  <testcase name="modifiesTerraformApplyCommand" classname="ParameterStoreExecPluginTest$Init" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-ParameterStoreExecPluginTest$PathForEnvironment.xml b/build/test-results/test/TEST-ParameterStoreExecPluginTest$PathForEnvironment.xml
    new file mode 100644
    index 00000000..0feac3ca
    --- /dev/null
    +++ b/build/test-results/test/TEST-ParameterStoreExecPluginTest$PathForEnvironment.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="ParameterStoreExecPluginTest$PathForEnvironment" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.002">
    +  <properties/>
    +  <testcase name="constructPathUsingOrgRepoAndEnvironment" classname="ParameterStoreExecPluginTest$PathForEnvironment" time="0.002"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-RegressionStageTest$AddedPlugins.xml b/build/test-results/test/TEST-RegressionStageTest$AddedPlugins.xml
    new file mode 100644
    index 00000000..99b2e232
    --- /dev/null
    +++ b/build/test-results/test/TEST-RegressionStageTest$AddedPlugins.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="RegressionStageTest$AddedPlugins" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="willHaveApplyCalled" classname="RegressionStageTest$AddedPlugins" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-RegressionStageTest$AutomationRepo.xml b/build/test-results/test/TEST-RegressionStageTest$AutomationRepo.xml
    new file mode 100644
    index 00000000..17a568f9
    --- /dev/null
    +++ b/build/test-results/test/TEST-RegressionStageTest$AutomationRepo.xml
    @@ -0,0 +1,10 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="RegressionStageTest$AutomationRepo" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.017">
    +  <properties/>
    +  <testcase name="automationRepoAndAppRepoSpecifiedSuccessfullyCallApply" classname="RegressionStageTest$AutomationRepo" time="0.013"/>
    +  <testcase name="automationRepoSpecifiedSuccessfullyCallApply" classname="RegressionStageTest$AutomationRepo" time="0.001"/>
    +  <testcase name="noAutomationRepoSpecifiedSuccessfullyCallApply" classname="RegressionStageTest$AutomationRepo" time="0.001"/>
    +  <testcase name="automationRepoAndAppRepoWithChangeDirectorySpecifiedSuccessfullyCallApply" classname="RegressionStageTest$AutomationRepo" time="0.002"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-S3BackendPluginTest$Apply.xml b/build/test-results/test/TEST-S3BackendPluginTest$Apply.xml
    new file mode 100644
    index 00000000..fc2d8827
    --- /dev/null
    +++ b/build/test-results/test/TEST-S3BackendPluginTest$Apply.xml
    @@ -0,0 +1,46 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="S3BackendPluginTest$Apply" tests="6" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.033">
    +  <properties/>
    +  <testcase name="addsDynamoDbTableAsBackendParameter" classname="S3BackendPluginTest$Apply" time="0.018"/>
    +  <testcase name="addsEnvironmentSpecificKeyAsBackendParameter" classname="S3BackendPluginTest$Apply" time="0.003"/>
    +  <testcase name="isAddedAndUsesCustomizedPatternFolderKeyAsBackendParameter" classname="S3BackendPluginTest$Apply" time="0.004"/>
    +  <testcase name="skipsDynamoDbTableAsBackendParameter" classname="S3BackendPluginTest$Apply" time="0.003"/>
    +  <testcase name="addsBucketRegionUsingPreDefinedEnvironmentVariableAsBackendParameter" classname="S3BackendPluginTest$Apply" time="0.003"/>
    +  <testcase name="addsBucketPreDefinedByEnvironmentAsBackendParameter" classname="S3BackendPluginTest$Apply" time="0.002"/>
    +  <system-out><![CDATA[No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +MYENV_S3_BACKEND_DYNAMO_TABLE_LOCK is deprecated - please use MYENV_S3_BACKEND_DYNAMODB_TABLE instead
    +No S3 backend bucket found
    +No S3 backend region found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3 backend bucket found
    +No S3 backend region found
    +No S3 backend dynamodb_table found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3 backend bucket found
    +No S3 backend region found
    +No S3 backend dynamodb_table found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3 backend bucket found
    +No S3 backend region found
    +No S3 backend dynamodb_table found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No MYENV_S3_BACKEND_BUCKET found either.
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +WARNING: DEFAULT_S3_BACKEND_REGION is deprecated, please use S3_BACKEND_REGION or MYENV_S3_BACKEND_REGION
    +No S3 backend bucket found
    +No S3 backend dynamodb_table found
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3 backend region found
    +No S3 backend dynamodb_table found
    +]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-S3BackendPluginTest$GetBackend.xml b/build/test-results/test/TEST-S3BackendPluginTest$GetBackend.xml
    new file mode 100644
    index 00000000..2fd9ff70
    --- /dev/null
    +++ b/build/test-results/test/TEST-S3BackendPluginTest$GetBackend.xml
    @@ -0,0 +1,12 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="S3BackendPluginTest$GetBackend" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.005">
    +  <properties/>
    +  <testcase name="shouldPreferS3BackendBucketOverEnvironmentSpecificBucket" classname="S3BackendPluginTest$GetBackend" time="0.001"/>
    +  <testcase name="shouldReturnTheValueOfTheEnvironmentSpecificS3BackendBucket" classname="S3BackendPluginTest$GetBackend" time="0.001"/>
    +  <testcase name="shouldReturnTheValueOfTheEnvironmentSpecificS3BackendBucketCaseInsensitive" classname="S3BackendPluginTest$GetBackend" time="0.001"/>
    +  <testcase name="shouldReturnTheValueOfS3BackendBucket" classname="S3BackendPluginTest$GetBackend" time="0.001"/>
    +  <system-out><![CDATA[No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +No S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-S3BackendPluginTest$GetDynamoTable.xml b/build/test-results/test/TEST-S3BackendPluginTest$GetDynamoTable.xml
    new file mode 100644
    index 00000000..5d853046
    --- /dev/null
    +++ b/build/test-results/test/TEST-S3BackendPluginTest$GetDynamoTable.xml
    @@ -0,0 +1,13 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="S3BackendPluginTest$GetDynamoTable" tests="6" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.006">
    +  <properties/>
    +  <testcase name="shouldPreferS3BackendDynamodbTableOverDeprecatedValue" classname="S3BackendPluginTest$GetDynamoTable" time="0.001"/>
    +  <testcase name="shouldReturnEnvironmentSpecificS3BackendDynamodbTableValueCaseInsensitive" classname="S3BackendPluginTest$GetDynamoTable" time="0.0"/>
    +  <testcase name="shouldReturnDeprecatedS3BackendDynamoTableLockValue" classname="S3BackendPluginTest$GetDynamoTable" time="0.0"/>
    +  <testcase name="shouldReturnEnvironmentSpecificS3BackendDynamodbTableValue" classname="S3BackendPluginTest$GetDynamoTable" time="0.0"/>
    +  <testcase name="shouldReturnS3BackendDynamodbTableValue" classname="S3BackendPluginTest$GetDynamoTable" time="0.0"/>
    +  <testcase name="shouldPreferS3BackendDynamodbTableOverEnvironmentSpecificValue" classname="S3BackendPluginTest$GetDynamoTable" time="0.001"/>
    +  <system-out><![CDATA[MYENV_S3_BACKEND_DYNAMO_TABLE_LOCK is deprecated - please use MYENV_S3_BACKEND_DYNAMODB_TABLE instead
    +]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-S3BackendPluginTest$GetKey.xml b/build/test-results/test/TEST-S3BackendPluginTest$GetKey.xml
    new file mode 100644
    index 00000000..ef398dfb
    --- /dev/null
    +++ b/build/test-results/test/TEST-S3BackendPluginTest$GetKey.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="S3BackendPluginTest$GetKey" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="shouldBeGeneratedFromRepoSlugAndEnvironment" classname="S3BackendPluginTest$GetKey" time="0.002"/>
    +  <testcase name="shouldBeGeneratedFromTheCustomKeyPattern" classname="S3BackendPluginTest$GetKey" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-S3BackendPluginTest$GetRegion.xml b/build/test-results/test/TEST-S3BackendPluginTest$GetRegion.xml
    new file mode 100644
    index 00000000..9f4c4428
    --- /dev/null
    +++ b/build/test-results/test/TEST-S3BackendPluginTest$GetRegion.xml
    @@ -0,0 +1,17 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="S3BackendPluginTest$GetRegion" tests="6" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.008">
    +  <properties/>
    +  <testcase name="shouldReturnTheValueOfS3BackendRegion" classname="S3BackendPluginTest$GetRegion" time="0.002"/>
    +  <testcase name="shouldReturnTheValueOfEnvironmentSpecificS3BackendRegionCaseInsensitive" classname="S3BackendPluginTest$GetRegion" time="0.001"/>
    +  <testcase name="shouldPreferS3BackendRegionOverEnvironmentSpecificRegion" classname="S3BackendPluginTest$GetRegion" time="0.0"/>
    +  <testcase name="shouldReturnTheValueOfEnvironmentSpecificS3BackendRegion" classname="S3BackendPluginTest$GetRegion" time="0.001"/>
    +  <testcase name="shouldReturnTheValueOfDefaultS3BackendRegion" classname="S3BackendPluginTest$GetRegion" time="0.001"/>
    +  <testcase name="shouldPreferEnvironmentSpecificRegionOverDeprecatedDefaultS3BackendRegion" classname="S3BackendPluginTest$GetRegion" time="0.001"/>
    +  <system-out><![CDATA[No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +WARNING: DEFAULT_S3_BACKEND_REGION is deprecated, please use S3_BACKEND_REGION or MYENV_S3_BACKEND_REGION
    +No S3_BACKEND_REGION found - checking for environment-specific region
    +]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-S3BackendPluginTest$Init.xml b/build/test-results/test/TEST-S3BackendPluginTest$Init.xml
    new file mode 100644
    index 00000000..aab27dab
    --- /dev/null
    +++ b/build/test-results/test/TEST-S3BackendPluginTest$Init.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="S3BackendPluginTest$Init" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.007">
    +  <properties/>
    +  <testcase name="addsS3BackendPluginToListOfPlugins" classname="S3BackendPluginTest$Init" time="0.007"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformApplyCommandTest$Plugins.xml b/build/test-results/test/TEST-TerraformApplyCommandTest$Plugins.xml
    new file mode 100644
    index 00000000..dc343e1e
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformApplyCommandTest$Plugins.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformApplyCommandTest$Plugins" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.008">
    +  <properties/>
    +  <testcase name="areAppliedEvenAfterCommandAlreadyInstantiated" classname="TerraformApplyCommandTest$Plugins" time="0.007"/>
    +  <testcase name="areAppliedToTheCommand" classname="TerraformApplyCommandTest$Plugins" time="0.001"/>
    +  <testcase name="areAppliedExactlyOnce" classname="TerraformApplyCommandTest$Plugins" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformApplyCommandTest$WithArgument.xml b/build/test-results/test/TEST-TerraformApplyCommandTest$WithArgument.xml
    new file mode 100644
    index 00000000..dd0e07d9
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformApplyCommandTest$WithArgument.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformApplyCommandTest$WithArgument" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.002">
    +  <properties/>
    +  <testcase name="addsArgument" classname="TerraformApplyCommandTest$WithArgument" time="0.001"/>
    +  <testcase name="isCumulative" classname="TerraformApplyCommandTest$WithArgument" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformApplyCommandTest$WithDirectory.xml b/build/test-results/test/TEST-TerraformApplyCommandTest$WithDirectory.xml
    new file mode 100644
    index 00000000..96264e70
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformApplyCommandTest$WithDirectory.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformApplyCommandTest$WithDirectory" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="addsDirectoryArgument" classname="TerraformApplyCommandTest$WithDirectory" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformApplyCommandTest$WithInput.xml b/build/test-results/test/TEST-TerraformApplyCommandTest$WithInput.xml
    new file mode 100644
    index 00000000..b734d6f6
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformApplyCommandTest$WithInput.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformApplyCommandTest$WithInput" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.004">
    +  <properties/>
    +  <testcase name="setsInputFlagToFalseWhenFalse" classname="TerraformApplyCommandTest$WithInput" time="0.003"/>
    +  <testcase name="skipsInputFlagWhenTrue" classname="TerraformApplyCommandTest$WithInput" time="0.001"/>
    +  <testcase name="defaultsToFalse" classname="TerraformApplyCommandTest$WithInput" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformApplyCommandTest$WithPrefix.xml b/build/test-results/test/TEST-TerraformApplyCommandTest$WithPrefix.xml
    new file mode 100644
    index 00000000..6c35dd79
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformApplyCommandTest$WithPrefix.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformApplyCommandTest$WithPrefix" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.002">
    +  <properties/>
    +  <testcase name="addsPrefixToBeginningOfCommand" classname="TerraformApplyCommandTest$WithPrefix" time="0.001"/>
    +  <testcase name="isCumulative" classname="TerraformApplyCommandTest$WithPrefix" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.xml b/build/test-results/test/TEST-TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.xml
    new file mode 100644
    index 00000000..31b075bb
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformDirectoryPluginTest$Apply$WithDirectoryProvided.xml
    @@ -0,0 +1,10 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformDirectoryPluginTest$Apply$WithDirectoryProvided" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.005">
    +  <properties/>
    +  <testcase name="addsDirectoryToTerraformInit" classname="TerraformDirectoryPluginTest$Apply$WithDirectoryProvided" time="0.001"/>
    +  <testcase name="addsDirectoryToTerraformPlan" classname="TerraformDirectoryPluginTest$Apply$WithDirectoryProvided" time="0.0"/>
    +  <testcase name="addsDirectoryToTerraformValidate" classname="TerraformDirectoryPluginTest$Apply$WithDirectoryProvided" time="0.003"/>
    +  <testcase name="addsDirectoryToTerraformApply" classname="TerraformDirectoryPluginTest$Apply$WithDirectoryProvided" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.xml b/build/test-results/test/TEST-TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.xml
    new file mode 100644
    index 00000000..027151bb
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided.xml
    @@ -0,0 +1,10 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.002">
    +  <properties/>
    +  <testcase name="addsDirectoryToTerraformInit" classname="TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided" time="0.001"/>
    +  <testcase name="addsDirectoryToTerraformPlan" classname="TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided" time="0.0"/>
    +  <testcase name="addsDirectoryToTerraformValidate" classname="TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided" time="0.0"/>
    +  <testcase name="addsDirectoryToTerraformApply" classname="TerraformDirectoryPluginTest$Apply$WithoutDirectoryProvided" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformDirectoryPluginTest$Init.xml b/build/test-results/test/TEST-TerraformDirectoryPluginTest$Init.xml
    new file mode 100644
    index 00000000..80a0b054
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformDirectoryPluginTest$Init.xml
    @@ -0,0 +1,10 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformDirectoryPluginTest$Init" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.007">
    +  <properties/>
    +  <testcase name="modifiesTerraformInitCommand" classname="TerraformDirectoryPluginTest$Init" time="0.006"/>
    +  <testcase name="modifiesTerraformPlanCommand" classname="TerraformDirectoryPluginTest$Init" time="0.0"/>
    +  <testcase name="modifiesTerraformValidateCommand" classname="TerraformDirectoryPluginTest$Init" time="0.001"/>
    +  <testcase name="modifiesTerraformApplyCommand" classname="TerraformDirectoryPluginTest$Init" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformEnvironmentStageTest$AddedPlugins.xml b/build/test-results/test/TEST-TerraformEnvironmentStageTest$AddedPlugins.xml
    new file mode 100644
    index 00000000..d4d3be21
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformEnvironmentStageTest$AddedPlugins.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformEnvironmentStageTest$AddedPlugins" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.012">
    +  <properties/>
    +  <testcase name="willHaveApplyCalled" classname="TerraformEnvironmentStageTest$AddedPlugins" time="0.012"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformEnvironmentStageTest$WithEnv.xml b/build/test-results/test/TEST-TerraformEnvironmentStageTest$WithEnv.xml
    new file mode 100644
    index 00000000..125fcfde
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformEnvironmentStageTest$WithEnv.xml
    @@ -0,0 +1,10 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformEnvironmentStageTest$WithEnv" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.023">
    +  <properties/>
    +  <testcase name="preservesOrderOfOtherPlugins" classname="TerraformEnvironmentStageTest$WithEnv" time="0.022"/>
    +  <testcase name="isFluent" classname="TerraformEnvironmentStageTest$WithEnv" time="0.0"/>
    +  <testcase name="addsAnInstanceOfEnvironmentVariablePlugin" classname="TerraformEnvironmentStageTest$WithEnv" time="0.0"/>
    +  <testcase name="doesNotAddPluginToOtherInstances" classname="TerraformEnvironmentStageTest$WithEnv" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformEnvironmentStageTest$WithGlobalEnv.xml b/build/test-results/test/TEST-TerraformEnvironmentStageTest$WithGlobalEnv.xml
    new file mode 100644
    index 00000000..862b4fb7
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformEnvironmentStageTest$WithGlobalEnv.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformEnvironmentStageTest$WithGlobalEnv" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="isFluent" classname="TerraformEnvironmentStageTest$WithGlobalEnv" time="0.001"/>
    +  <testcase name="addsAnInstanceOfEnvironmeentVariablePlugin" classname="TerraformEnvironmentStageTest$WithGlobalEnv" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformInitCommandTest$Plugins.xml b/build/test-results/test/TEST-TerraformInitCommandTest$Plugins.xml
    new file mode 100644
    index 00000000..565e9ac4
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformInitCommandTest$Plugins.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformInitCommandTest$Plugins" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.13">
    +  <properties/>
    +  <testcase name="areAppliedEvenAfterCommandAlreadyInstantiated" classname="TerraformInitCommandTest$Plugins" time="0.128"/>
    +  <testcase name="areAppliedToTheCommand" classname="TerraformInitCommandTest$Plugins" time="0.001"/>
    +  <testcase name="areAppliedExactlyOnce" classname="TerraformInitCommandTest$Plugins" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformInitCommandTest$WithBackendConfig.xml b/build/test-results/test/TEST-TerraformInitCommandTest$WithBackendConfig.xml
    new file mode 100644
    index 00000000..b06c5631
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformInitCommandTest$WithBackendConfig.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformInitCommandTest$WithBackendConfig" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.008">
    +  <properties/>
    +  <testcase name="notPresentByDefault" classname="TerraformInitCommandTest$WithBackendConfig" time="0.001"/>
    +  <testcase name="addsBackendConfigIsCumulative" classname="TerraformInitCommandTest$WithBackendConfig" time="0.006"/>
    +  <testcase name="addsBackendConfigValues" classname="TerraformInitCommandTest$WithBackendConfig" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformInitCommandTest$WithDirectory.xml b/build/test-results/test/TEST-TerraformInitCommandTest$WithDirectory.xml
    new file mode 100644
    index 00000000..a61c908c
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformInitCommandTest$WithDirectory.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformInitCommandTest$WithDirectory" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.006">
    +  <properties/>
    +  <testcase name="addsDirectoryArgument" classname="TerraformInitCommandTest$WithDirectory" time="0.006"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformInitCommandTest$WithInput.xml b/build/test-results/test/TEST-TerraformInitCommandTest$WithInput.xml
    new file mode 100644
    index 00000000..30df185c
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformInitCommandTest$WithInput.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformInitCommandTest$WithInput" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.026">
    +  <properties/>
    +  <testcase name="setsInputFlagToFalseWhenFalse" classname="TerraformInitCommandTest$WithInput" time="0.024"/>
    +  <testcase name="skipsInputFlagWhenTrue" classname="TerraformInitCommandTest$WithInput" time="0.002"/>
    +  <testcase name="defaultsToFalse" classname="TerraformInitCommandTest$WithInput" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformPlanCommandTest$Plugins.xml b/build/test-results/test/TEST-TerraformPlanCommandTest$Plugins.xml
    new file mode 100644
    index 00000000..d2281d78
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformPlanCommandTest$Plugins.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformPlanCommandTest$Plugins" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.01">
    +  <properties/>
    +  <testcase name="areAppliedEvenAfterCommandAlreadyInstantiated" classname="TerraformPlanCommandTest$Plugins" time="0.008"/>
    +  <testcase name="areAppliedToTheCommand" classname="TerraformPlanCommandTest$Plugins" time="0.001"/>
    +  <testcase name="areAppliedExactlyOnce" classname="TerraformPlanCommandTest$Plugins" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformPlanCommandTest$WithDirectory.xml b/build/test-results/test/TEST-TerraformPlanCommandTest$WithDirectory.xml
    new file mode 100644
    index 00000000..35d18c18
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformPlanCommandTest$WithDirectory.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformPlanCommandTest$WithDirectory" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="addsDirectoryArgument" classname="TerraformPlanCommandTest$WithDirectory" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformPlanCommandTest$WithInput.xml b/build/test-results/test/TEST-TerraformPlanCommandTest$WithInput.xml
    new file mode 100644
    index 00000000..ee613f19
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformPlanCommandTest$WithInput.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformPlanCommandTest$WithInput" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.005">
    +  <properties/>
    +  <testcase name="setsInputFlagToFalseWhenFalse" classname="TerraformPlanCommandTest$WithInput" time="0.004"/>
    +  <testcase name="skipsInputFlagWhenTrue" classname="TerraformPlanCommandTest$WithInput" time="0.0"/>
    +  <testcase name="defaultsToFalse" classname="TerraformPlanCommandTest$WithInput" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformPlanCommandTest$WithPrefix.xml b/build/test-results/test/TEST-TerraformPlanCommandTest$WithPrefix.xml
    new file mode 100644
    index 00000000..30e12187
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformPlanCommandTest$WithPrefix.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformPlanCommandTest$WithPrefix" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.003">
    +  <properties/>
    +  <testcase name="addsPrefixToBeginningOfCommand" classname="TerraformPlanCommandTest$WithPrefix" time="0.002"/>
    +  <testcase name="isCumulative" classname="TerraformPlanCommandTest$WithPrefix" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformValidateCommandTest$Plugins.xml b/build/test-results/test/TEST-TerraformValidateCommandTest$Plugins.xml
    new file mode 100644
    index 00000000..6ad5a230
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformValidateCommandTest$Plugins.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformValidateCommandTest$Plugins" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.006">
    +  <properties/>
    +  <testcase name="areAppliedEvenAfterCommandAlreadyInstantiated" classname="TerraformValidateCommandTest$Plugins" time="0.005"/>
    +  <testcase name="areAppliedToTheCommand" classname="TerraformValidateCommandTest$Plugins" time="0.0"/>
    +  <testcase name="areAppliedExactlyOnce" classname="TerraformValidateCommandTest$Plugins" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformValidateCommandTest$WithDirectory.xml b/build/test-results/test/TEST-TerraformValidateCommandTest$WithDirectory.xml
    new file mode 100644
    index 00000000..7b49d41a
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformValidateCommandTest$WithDirectory.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformValidateCommandTest$WithDirectory" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="addsDirectoryArgument" classname="TerraformValidateCommandTest$WithDirectory" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-TerraformValidateCommandTest$WithPrefix.xml b/build/test-results/test/TEST-TerraformValidateCommandTest$WithPrefix.xml
    new file mode 100644
    index 00000000..a12f82f5
    --- /dev/null
    +++ b/build/test-results/test/TEST-TerraformValidateCommandTest$WithPrefix.xml
    @@ -0,0 +1,8 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="TerraformValidateCommandTest$WithPrefix" tests="2" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:11" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="addsPrefixToBeginningOfCommand" classname="TerraformValidateCommandTest$WithPrefix" time="0.001"/>
    +  <testcase name="isCumulative" classname="TerraformValidateCommandTest$WithPrefix" time="0.0"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-WithAwsPluginTest$Init.xml b/build/test-results/test/TEST-WithAwsPluginTest$Init.xml
    new file mode 100644
    index 00000000..b0b742ae
    --- /dev/null
    +++ b/build/test-results/test/TEST-WithAwsPluginTest$Init.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="WithAwsPluginTest$Init" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.021">
    +  <properties/>
    +  <testcase name="modifiesTerraformEnvironmentStage" classname="WithAwsPluginTest$Init" time="0.021"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-WithAwsPluginTest$WithExplicitRole.xml b/build/test-results/test/TEST-WithAwsPluginTest$WithExplicitRole.xml
    new file mode 100644
    index 00000000..d1e81a77
    --- /dev/null
    +++ b/build/test-results/test/TEST-WithAwsPluginTest$WithExplicitRole.xml
    @@ -0,0 +1,9 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="WithAwsPluginTest$WithExplicitRole" tests="3" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.004">
    +  <properties/>
    +  <testcase name="returnsProvidedRole" classname="WithAwsPluginTest$WithExplicitRole" time="0.001"/>
    +  <testcase name="prefersProvidedRoleOverEnvironmntSpecificRole" classname="WithAwsPluginTest$WithExplicitRole" time="0.001"/>
    +  <testcase name="prefersProvidedRoleOverGenericRole" classname="WithAwsPluginTest$WithExplicitRole" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-WithAwsPluginTest$WithImplicitRole.xml b/build/test-results/test/TEST-WithAwsPluginTest$WithImplicitRole.xml
    new file mode 100644
    index 00000000..7e91638f
    --- /dev/null
    +++ b/build/test-results/test/TEST-WithAwsPluginTest$WithImplicitRole.xml
    @@ -0,0 +1,10 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="WithAwsPluginTest$WithImplicitRole" tests="4" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.018">
    +  <properties/>
    +  <testcase name="returnsEnvironmentSpecificRoleIfPresent" classname="WithAwsPluginTest$WithImplicitRole" time="0.013"/>
    +  <testcase name="returnsCaseInsensitiveEnvironmentSpecificRoleIfPresent" classname="WithAwsPluginTest$WithImplicitRole" time="0.001"/>
    +  <testcase name="returnsGenericRoleIfPresent" classname="WithAwsPluginTest$WithImplicitRole" time="0.002"/>
    +  <testcase name="prefersGenericRoleOverEnvironmentRole" classname="WithAwsPluginTest$WithImplicitRole" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/TEST-WithAwsPluginTest$WithRole.xml b/build/test-results/test/TEST-WithAwsPluginTest$WithRole.xml
    new file mode 100644
    index 00000000..c41a2a6d
    --- /dev/null
    +++ b/build/test-results/test/TEST-WithAwsPluginTest$WithRole.xml
    @@ -0,0 +1,7 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<testsuite name="WithAwsPluginTest$WithRole" tests="1" skipped="0" failures="0" errors="0" timestamp="2019-08-28T19:36:10" hostname="kmanning-laptop" time="0.001">
    +  <properties/>
    +  <testcase name="isFluentAndReturnsThePluginClass" classname="WithAwsPluginTest$WithRole" time="0.001"/>
    +  <system-out><![CDATA[]]></system-out>
    +  <system-err><![CDATA[]]></system-err>
    +</testsuite>
    diff --git a/build/test-results/test/binary/output.bin b/build/test-results/test/binary/output.bin
    new file mode 100644
    index 00000000..4d1e8a1c
    --- /dev/null
    +++ b/build/test-results/test/binary/output.bin
    @@ -0,0 +1,47 @@
    +<;FNo S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +<;)No MYENV_S3_BACKEND_BUCKET found either.
    +<;FNo S3_BACKEND_REGION found - checking for environment-specific region
    +<;fMYENV_S3_BACKEND_DYNAMO_TABLE_LOCK is deprecated - please use MYENV_S3_BACKEND_DYNAMODB_TABLE instead
    +<;No S3 backend bucket found
    +<;No S3 backend region found
    +<=FNo S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +<=)No MYENV_S3_BACKEND_BUCKET found either.
    +<=FNo S3_BACKEND_REGION found - checking for environment-specific region
    +<=No S3 backend bucket found
    +<=No S3 backend region found
    +<=#No S3 backend dynamodb_table found
    +<>FNo S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +<>)No MYENV_S3_BACKEND_BUCKET found either.
    +<>FNo S3_BACKEND_REGION found - checking for environment-specific region
    +<>No S3 backend bucket found
    +<>No S3 backend region found
    +<>#No S3 backend dynamodb_table found
    +<?FNo S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +<?)No MYENV_S3_BACKEND_BUCKET found either.
    +<?FNo S3_BACKEND_REGION found - checking for environment-specific region
    +<?No S3 backend bucket found
    +<?No S3 backend region found
    +<?#No S3 backend dynamodb_table found
    +<@FNo S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +<@)No MYENV_S3_BACKEND_BUCKET found either.
    +<@FNo S3_BACKEND_REGION found - checking for environment-specific region
    +<@jWARNING: DEFAULT_S3_BACKEND_REGION is deprecated, please use S3_BACKEND_REGION or MYENV_S3_BACKEND_REGION
    +<@No S3 backend bucket found
    +<@#No S3 backend dynamodb_table found
    +<AFNo S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +<AFNo S3_BACKEND_REGION found - checking for environment-specific region
    +<ANo S3 backend region found
    +<A#No S3 backend dynamodb_table found
    +CDFNo S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +CEFNo S3_BACKEND_BUCKET found - checking for environment-specific bucket
    +HIFNo S3_BACKEND_REGION found - checking for environment-specific region
    +HKFNo S3_BACKEND_REGION found - checking for environment-specific region
    +HLFNo S3_BACKEND_REGION found - checking for environment-specific region
    +HLjWARNING: DEFAULT_S3_BACKEND_REGION is deprecated, please use S3_BACKEND_REGION or MYENV_S3_BACKEND_REGION
    +HMFNo S3_BACKEND_REGION found - checking for environment-specific region
    +RTfMYENV_S3_BACKEND_DYNAMO_TABLE_LOCK is deprecated - please use MYENV_S3_BACKEND_DYNAMODB_TABLE instead
    +€\No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the myEnv environment.
    +€\No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the myEnv environment.
    +€‚\No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the myEnv environment.
    +ÇÆfCurrent branch 'master' matches expected branch 'master', stage branch-condition is met and will run.
    +ÇɘCurrent branch is null - you're probably using a single-branch job which doesn't make your branch name available.  Assume that apply should be enabled.
    diff --git a/build/test-results/test/binary/output.bin.idx b/build/test-results/test/binary/output.bin.idx
    new file mode 100644
    index 00000000..d8962d11
    Binary files /dev/null and b/build/test-results/test/binary/output.bin.idx differ
    diff --git a/build/test-results/test/binary/results.bin b/build/test-results/test/binary/results.bin
    new file mode 100644
    index 00000000..c9beca55
    Binary files /dev/null and b/build/test-results/test/binary/results.bin differ
    diff --git a/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/META-INF/MANIFEST.MF b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/META-INF/MANIFEST.MF
    new file mode 100644
    index 00000000..02a1aaba
    --- /dev/null
    +++ b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/META-INF/MANIFEST.MF
    @@ -0,0 +1,22 @@
    +Manifest-Version: 1.0
    +Archiver-Version: Plexus Archiver
    +Created-By: Apache Maven Bundle Plugin
    +Built-By: godin
    +Build-Jdk: 1.8.0_152
    +Automatic-Module-Name: org.jacoco.agent
    +Bnd-LastModified: 1534872838956
    +Bundle-Description: JaCoCo Agent
    +Bundle-License: http://www.eclipse.org/legal/epl-v10.html
    +Bundle-ManifestVersion: 2
    +Bundle-Name: JaCoCo Agent
    +Bundle-RequiredExecutionEnvironment: J2SE-1.5
    +Bundle-SymbolicName: org.jacoco.agent
    +Bundle-Vendor: Mountainminds GmbH & Co. KG
    +Bundle-Version: 0.8.2.201808211720
    +Eclipse-SourceReferences: scm:git:git://github.com/jacoco/jacoco.git;p
    + ath="org.jacoco.agent";commitId=485bc5e4d99d9da7f6a4619be187b836928ba
    + b1d
    +Export-Package: org.jacoco.agent;version="0.8.2"
    +Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.5))"
    +Tool: Bnd-3.5.0.201709291849
    +
    diff --git a/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/META-INF/maven/org.jacoco/org.jacoco.agent/pom.properties b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/META-INF/maven/org.jacoco/org.jacoco.agent/pom.properties
    new file mode 100644
    index 00000000..c220c6c4
    --- /dev/null
    +++ b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/META-INF/maven/org.jacoco/org.jacoco.agent/pom.properties
    @@ -0,0 +1,5 @@
    +#Generated by Maven
    +#Tue Aug 21 19:33:59 CEST 2018
    +version=0.8.2
    +groupId=org.jacoco
    +artifactId=org.jacoco.agent
    diff --git a/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/META-INF/maven/org.jacoco/org.jacoco.agent/pom.xml b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/META-INF/maven/org.jacoco/org.jacoco.agent/pom.xml
    new file mode 100644
    index 00000000..9fc9d6e9
    --- /dev/null
    +++ b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/META-INF/maven/org.jacoco/org.jacoco.agent/pom.xml
    @@ -0,0 +1,105 @@
    +<?xml version="1.0" encoding="UTF-8"?>
    +<!--
    +   Copyright (c) 2009, 2018 Mountainminds GmbH & Co. KG and Contributors
    +   All rights reserved. This program and the accompanying materials
    +   are made available under the terms of the Eclipse Public License v1.0
    +   which accompanies this distribution, and is available at
    +   http://www.eclipse.org/legal/epl-v10.html
    +
    +   Contributors:
    +      Evgeny Mandrikov - initial API and implementation
    +-->
    +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    +  <modelVersion>4.0.0</modelVersion>
    +
    +  <parent>
    +    <groupId>org.jacoco</groupId>
    +    <artifactId>org.jacoco.build</artifactId>
    +    <version>0.8.2</version>
    +    <relativePath>../org.jacoco.build</relativePath>
    +  </parent>
    +
    +  <artifactId>org.jacoco.agent</artifactId>
    +
    +  <name>JaCoCo :: Agent</name>
    +  <description>JaCoCo Agent</description>
    +
    +  <build>
    +    <sourceDirectory>src</sourceDirectory>
    +
    +    <plugins>
    +      <plugin>
    +        <groupId>org.apache.maven.plugins</groupId>
    +        <artifactId>maven-dependency-plugin</artifactId>
    +        <executions>
    +          <execution>
    +            <phase>prepare-package</phase>
    +            <goals>
    +              <goal>copy</goal>
    +            </goals>
    +            <configuration>
    +              <artifactItems>
    +                <artifactItem>
    +                  <groupId>${project.groupId}</groupId>
    +                  <artifactId>org.jacoco.agent.rt</artifactId>
    +                  <classifier>all</classifier>
    +                  <version>${project.version}</version>
    +                  <destFileName>jacocoagent.jar</destFileName>
    +                </artifactItem>
    +              </artifactItems>
    +              <outputDirectory>${project.build.directory}/classes</outputDirectory>
    +              <overWriteReleases>false</overWriteReleases>
    +              <overWriteSnapshots>false</overWriteSnapshots>
    +              <overWriteIfNewer>true</overWriteIfNewer>
    +            </configuration>
    +          </execution>
    +        </executions>
    +      </plugin>
    +
    +      <plugin>
    +        <groupId>org.codehaus.mojo</groupId>
    +        <artifactId>build-helper-maven-plugin</artifactId>
    +        <executions>
    +          <execution>
    +            <id>attach-artifacts</id>
    +            <phase>package</phase>
    +            <goals>
    +              <goal>attach-artifact</goal>
    +            </goals>
    +            <configuration>
    +              <artifacts>
    +                <artifact>
    +                  <file>${project.build.directory}/classes/jacocoagent.jar</file>
    +                  <type>jar</type>
    +                  <classifier>runtime</classifier>
    +                </artifact>
    +              </artifacts>
    +            </configuration>
    +          </execution>
    +        </executions>
    +      </plugin>
    +
    +      <plugin>
    +        <groupId>org.apache.felix</groupId>
    +        <artifactId>maven-bundle-plugin</artifactId>
    +        <executions>
    +          <execution>
    +            <phase>process-classes</phase>
    +            <goals>
    +              <goal>manifest</goal>
    +            </goals>
    +          </execution>
    +        </executions>
    +      </plugin>
    +      <plugin>
    +        <groupId>org.apache.maven.plugins</groupId>
    +        <artifactId>maven-jar-plugin</artifactId>
    +        <configuration>
    +          <archive>
    +            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
    +          </archive>
    +        </configuration>
    +      </plugin>
    +    </plugins>
    +  </build>
    +</project>
    diff --git a/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/about.html b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/about.html
    new file mode 100644
    index 00000000..1ac2355b
    --- /dev/null
    +++ b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/about.html
    @@ -0,0 +1,73 @@
    +<?xml version="1.0" encoding="UTF-8" ?>
    +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    +<html>
    +<head>
    +<title>About</title>
    +<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    +</head>
    +<body lang="EN-US">
    +<h2>About This Content</h2>
    +
    +<p>
    +  2018/08/21
    +</p>
    +
    +<h3>License</h3>
    +
    +<p>
    +  All Content in this plug-in is made available by Mountainminds GmbH &amp; Co.
    +  KG, Munich. Unless otherwise indicated below, the Content is provided to you
    +  under the terms and conditions of the Eclipse Public License Version 1.0
    +  (&quot;EPL&quot;). A copy of the EPL is available at
    +  <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
    +  For purposes of the EPL, "Program" will mean the Content.
    +</p>
    +
    +<h3>Third Party Content</h3>
    +
    +<p>
    +  The Content includes items that have been sourced from third parties as set
    +  out below.
    +</p>
    +
    +<h4>ASM</h4>
    +
    +<p>
    +  This plug-in contains the <a href="http://asm.objectweb.org/">ASM</a> library
    +  which is subject to the terms and conditions of the following license: 
    +</p>
    +
    +<pre>
    +Copyright (c) 2012 France Télécom
    +All rights reserved.
    +
    +Redistribution and use in source and binary forms, with or without
    +modification, are permitted provided that the following conditions
    +are met:
    +
    +1. Redistributions of source code must retain the above copyright
    +   notice, this list of conditions and the following disclaimer.
    +
    +2. Redistributions in binary form must reproduce the above copyright
    +   notice, this list of conditions and the following disclaimer in the
    +   documentation and/or other materials provided with the distribution.
    +
    +3. Neither the name of the copyright holders nor the names of its
    +   contributors may be used to endorse or promote products derived from
    +   this software without specific prior written permission.
    +
    +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    +ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
    +LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
    +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
    +SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
    +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
    +CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
    +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
    +THE POSSIBILITY OF SUCH DAMAGE.
    +</pre>
    +
    +</body>
    +</html>
    \ No newline at end of file
    diff --git a/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/jacocoagent.jar b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/jacocoagent.jar
    new file mode 100644
    index 00000000..7e0debd0
    Binary files /dev/null and b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/jacocoagent.jar differ
    diff --git a/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/org/jacoco/agent/AgentJar.class b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/org/jacoco/agent/AgentJar.class
    new file mode 100644
    index 00000000..772a51a4
    Binary files /dev/null and b/build/tmp/expandedArchives/org.jacoco.agent-0.8.2.jar_2aca8b620b19ecd063f63feff8caaa38/org/jacoco/agent/AgentJar.class differ
    diff --git a/build/tmp/test/jar_extract_1007787578629112729_tmp b/build/tmp/test/jar_extract_1007787578629112729_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1007787578629112729_tmp differ
    diff --git a/build/tmp/test/jar_extract_1012222659386678964_tmp b/build/tmp/test/jar_extract_1012222659386678964_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1012222659386678964_tmp differ
    diff --git a/build/tmp/test/jar_extract_1017027146246193839_tmp b/build/tmp/test/jar_extract_1017027146246193839_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1017027146246193839_tmp differ
    diff --git a/build/tmp/test/jar_extract_1020470546537077191_tmp b/build/tmp/test/jar_extract_1020470546537077191_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1020470546537077191_tmp differ
    diff --git a/build/tmp/test/jar_extract_1024272810800025154_tmp b/build/tmp/test/jar_extract_1024272810800025154_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1024272810800025154_tmp differ
    diff --git a/build/tmp/test/jar_extract_1025009130961192390_tmp b/build/tmp/test/jar_extract_1025009130961192390_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1025009130961192390_tmp differ
    diff --git a/build/tmp/test/jar_extract_1042266973524449451_tmp b/build/tmp/test/jar_extract_1042266973524449451_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1042266973524449451_tmp differ
    diff --git a/build/tmp/test/jar_extract_1044609025136121162_tmp b/build/tmp/test/jar_extract_1044609025136121162_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1044609025136121162_tmp differ
    diff --git a/build/tmp/test/jar_extract_1046574144554232539_tmp b/build/tmp/test/jar_extract_1046574144554232539_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1046574144554232539_tmp differ
    diff --git a/build/tmp/test/jar_extract_1049576943224141433_tmp b/build/tmp/test/jar_extract_1049576943224141433_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1049576943224141433_tmp differ
    diff --git a/build/tmp/test/jar_extract_1054457930809391441_tmp b/build/tmp/test/jar_extract_1054457930809391441_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1054457930809391441_tmp differ
    diff --git a/build/tmp/test/jar_extract_1056265188643692672_tmp b/build/tmp/test/jar_extract_1056265188643692672_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1056265188643692672_tmp differ
    diff --git a/build/tmp/test/jar_extract_1062145210328614026_tmp b/build/tmp/test/jar_extract_1062145210328614026_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1062145210328614026_tmp differ
    diff --git a/build/tmp/test/jar_extract_1065923615943295298_tmp b/build/tmp/test/jar_extract_1065923615943295298_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1065923615943295298_tmp differ
    diff --git a/build/tmp/test/jar_extract_1068394469615234351_tmp b/build/tmp/test/jar_extract_1068394469615234351_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1068394469615234351_tmp differ
    diff --git a/build/tmp/test/jar_extract_1071028580649397825_tmp b/build/tmp/test/jar_extract_1071028580649397825_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1071028580649397825_tmp differ
    diff --git a/build/tmp/test/jar_extract_1079638184699679929_tmp b/build/tmp/test/jar_extract_1079638184699679929_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1079638184699679929_tmp differ
    diff --git a/build/tmp/test/jar_extract_1084730304875588544_tmp b/build/tmp/test/jar_extract_1084730304875588544_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1084730304875588544_tmp differ
    diff --git a/build/tmp/test/jar_extract_1088356400487491565_tmp b/build/tmp/test/jar_extract_1088356400487491565_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1088356400487491565_tmp differ
    diff --git a/build/tmp/test/jar_extract_1097016090153445634_tmp b/build/tmp/test/jar_extract_1097016090153445634_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1097016090153445634_tmp differ
    diff --git a/build/tmp/test/jar_extract_1101331422960001624_tmp b/build/tmp/test/jar_extract_1101331422960001624_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1101331422960001624_tmp differ
    diff --git a/build/tmp/test/jar_extract_1102391675518789720_tmp b/build/tmp/test/jar_extract_1102391675518789720_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1102391675518789720_tmp differ
    diff --git a/build/tmp/test/jar_extract_1105850095607777646_tmp b/build/tmp/test/jar_extract_1105850095607777646_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1105850095607777646_tmp differ
    diff --git a/build/tmp/test/jar_extract_1112008693376273437_tmp b/build/tmp/test/jar_extract_1112008693376273437_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1112008693376273437_tmp differ
    diff --git a/build/tmp/test/jar_extract_11155670303911072_tmp b/build/tmp/test/jar_extract_11155670303911072_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_11155670303911072_tmp differ
    diff --git a/build/tmp/test/jar_extract_1120326024560812943_tmp b/build/tmp/test/jar_extract_1120326024560812943_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1120326024560812943_tmp differ
    diff --git a/build/tmp/test/jar_extract_1131991238455200755_tmp b/build/tmp/test/jar_extract_1131991238455200755_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1131991238455200755_tmp differ
    diff --git a/build/tmp/test/jar_extract_1134725573556519600_tmp b/build/tmp/test/jar_extract_1134725573556519600_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1134725573556519600_tmp differ
    diff --git a/build/tmp/test/jar_extract_1139624835214407937_tmp b/build/tmp/test/jar_extract_1139624835214407937_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1139624835214407937_tmp differ
    diff --git a/build/tmp/test/jar_extract_1147191783232097189_tmp b/build/tmp/test/jar_extract_1147191783232097189_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1147191783232097189_tmp differ
    diff --git a/build/tmp/test/jar_extract_1151050101227343322_tmp b/build/tmp/test/jar_extract_1151050101227343322_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1151050101227343322_tmp differ
    diff --git a/build/tmp/test/jar_extract_1158844201113419817_tmp b/build/tmp/test/jar_extract_1158844201113419817_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1158844201113419817_tmp differ
    diff --git a/build/tmp/test/jar_extract_1160525054190552142_tmp b/build/tmp/test/jar_extract_1160525054190552142_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1160525054190552142_tmp differ
    diff --git a/build/tmp/test/jar_extract_116066753394862088_tmp b/build/tmp/test/jar_extract_116066753394862088_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_116066753394862088_tmp differ
    diff --git a/build/tmp/test/jar_extract_116494673584193516_tmp b/build/tmp/test/jar_extract_116494673584193516_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_116494673584193516_tmp differ
    diff --git a/build/tmp/test/jar_extract_1168122086278400535_tmp b/build/tmp/test/jar_extract_1168122086278400535_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1168122086278400535_tmp differ
    diff --git a/build/tmp/test/jar_extract_1169831471478884799_tmp b/build/tmp/test/jar_extract_1169831471478884799_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1169831471478884799_tmp differ
    diff --git a/build/tmp/test/jar_extract_1172698997677858862_tmp b/build/tmp/test/jar_extract_1172698997677858862_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1172698997677858862_tmp differ
    diff --git a/build/tmp/test/jar_extract_1177708470160862958_tmp b/build/tmp/test/jar_extract_1177708470160862958_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1177708470160862958_tmp differ
    diff --git a/build/tmp/test/jar_extract_11824634562783329_tmp b/build/tmp/test/jar_extract_11824634562783329_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_11824634562783329_tmp differ
    diff --git a/build/tmp/test/jar_extract_1191565493492926807_tmp b/build/tmp/test/jar_extract_1191565493492926807_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1191565493492926807_tmp differ
    diff --git a/build/tmp/test/jar_extract_1193395068185094990_tmp b/build/tmp/test/jar_extract_1193395068185094990_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1193395068185094990_tmp differ
    diff --git a/build/tmp/test/jar_extract_1195421128189378681_tmp b/build/tmp/test/jar_extract_1195421128189378681_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1195421128189378681_tmp differ
    diff --git a/build/tmp/test/jar_extract_1203020085553199810_tmp b/build/tmp/test/jar_extract_1203020085553199810_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1203020085553199810_tmp differ
    diff --git a/build/tmp/test/jar_extract_1203087630112463197_tmp b/build/tmp/test/jar_extract_1203087630112463197_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1203087630112463197_tmp differ
    diff --git a/build/tmp/test/jar_extract_1212596558685394530_tmp b/build/tmp/test/jar_extract_1212596558685394530_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1212596558685394530_tmp differ
    diff --git a/build/tmp/test/jar_extract_1216632139883251693_tmp b/build/tmp/test/jar_extract_1216632139883251693_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1216632139883251693_tmp differ
    diff --git a/build/tmp/test/jar_extract_1217210222088969792_tmp b/build/tmp/test/jar_extract_1217210222088969792_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1217210222088969792_tmp differ
    diff --git a/build/tmp/test/jar_extract_1217759674118045462_tmp b/build/tmp/test/jar_extract_1217759674118045462_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1217759674118045462_tmp differ
    diff --git a/build/tmp/test/jar_extract_1219911216453765195_tmp b/build/tmp/test/jar_extract_1219911216453765195_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1219911216453765195_tmp differ
    diff --git a/build/tmp/test/jar_extract_1224235503222104533_tmp b/build/tmp/test/jar_extract_1224235503222104533_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1224235503222104533_tmp differ
    diff --git a/build/tmp/test/jar_extract_1245876908957855635_tmp b/build/tmp/test/jar_extract_1245876908957855635_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1245876908957855635_tmp differ
    diff --git a/build/tmp/test/jar_extract_1251891164436284260_tmp b/build/tmp/test/jar_extract_1251891164436284260_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1251891164436284260_tmp differ
    diff --git a/build/tmp/test/jar_extract_1255980136689673416_tmp b/build/tmp/test/jar_extract_1255980136689673416_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1255980136689673416_tmp differ
    diff --git a/build/tmp/test/jar_extract_1278871274864011875_tmp b/build/tmp/test/jar_extract_1278871274864011875_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1278871274864011875_tmp differ
    diff --git a/build/tmp/test/jar_extract_1283375693225210974_tmp b/build/tmp/test/jar_extract_1283375693225210974_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1283375693225210974_tmp differ
    diff --git a/build/tmp/test/jar_extract_1285228521083416254_tmp b/build/tmp/test/jar_extract_1285228521083416254_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1285228521083416254_tmp differ
    diff --git a/build/tmp/test/jar_extract_1292634948802324262_tmp b/build/tmp/test/jar_extract_1292634948802324262_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1292634948802324262_tmp differ
    diff --git a/build/tmp/test/jar_extract_1294201878304064762_tmp b/build/tmp/test/jar_extract_1294201878304064762_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1294201878304064762_tmp differ
    diff --git a/build/tmp/test/jar_extract_130388957726241951_tmp b/build/tmp/test/jar_extract_130388957726241951_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_130388957726241951_tmp differ
    diff --git a/build/tmp/test/jar_extract_1304048922730662301_tmp b/build/tmp/test/jar_extract_1304048922730662301_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1304048922730662301_tmp differ
    diff --git a/build/tmp/test/jar_extract_1308192768759079803_tmp b/build/tmp/test/jar_extract_1308192768759079803_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1308192768759079803_tmp differ
    diff --git a/build/tmp/test/jar_extract_1310078540856954587_tmp b/build/tmp/test/jar_extract_1310078540856954587_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1310078540856954587_tmp differ
    diff --git a/build/tmp/test/jar_extract_131674520210280678_tmp b/build/tmp/test/jar_extract_131674520210280678_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_131674520210280678_tmp differ
    diff --git a/build/tmp/test/jar_extract_1320957550676895284_tmp b/build/tmp/test/jar_extract_1320957550676895284_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1320957550676895284_tmp differ
    diff --git a/build/tmp/test/jar_extract_1321867020340163485_tmp b/build/tmp/test/jar_extract_1321867020340163485_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_1321867020340163485_tmp differ
    diff --git a/build/tmp/test/jar_extract_1325878333237117300_tmp b/build/tmp/test/jar_extract_1325878333237117300_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1325878333237117300_tmp differ
    diff --git a/build/tmp/test/jar_extract_1336031899988889117_tmp b/build/tmp/test/jar_extract_1336031899988889117_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1336031899988889117_tmp differ
    diff --git a/build/tmp/test/jar_extract_1336634597445652810_tmp b/build/tmp/test/jar_extract_1336634597445652810_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1336634597445652810_tmp differ
    diff --git a/build/tmp/test/jar_extract_1337439787374553467_tmp b/build/tmp/test/jar_extract_1337439787374553467_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1337439787374553467_tmp differ
    diff --git a/build/tmp/test/jar_extract_1338086947416169799_tmp b/build/tmp/test/jar_extract_1338086947416169799_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1338086947416169799_tmp differ
    diff --git a/build/tmp/test/jar_extract_1340353345307621079_tmp b/build/tmp/test/jar_extract_1340353345307621079_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1340353345307621079_tmp differ
    diff --git a/build/tmp/test/jar_extract_1363396571251424476_tmp b/build/tmp/test/jar_extract_1363396571251424476_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1363396571251424476_tmp differ
    diff --git a/build/tmp/test/jar_extract_1367580887183501183_tmp b/build/tmp/test/jar_extract_1367580887183501183_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1367580887183501183_tmp differ
    diff --git a/build/tmp/test/jar_extract_1369510108620130067_tmp b/build/tmp/test/jar_extract_1369510108620130067_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1369510108620130067_tmp differ
    diff --git a/build/tmp/test/jar_extract_1369896700048534302_tmp b/build/tmp/test/jar_extract_1369896700048534302_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1369896700048534302_tmp differ
    diff --git a/build/tmp/test/jar_extract_1372780832610368579_tmp b/build/tmp/test/jar_extract_1372780832610368579_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1372780832610368579_tmp differ
    diff --git a/build/tmp/test/jar_extract_1377719397558625874_tmp b/build/tmp/test/jar_extract_1377719397558625874_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1377719397558625874_tmp differ
    diff --git a/build/tmp/test/jar_extract_137888322799805906_tmp b/build/tmp/test/jar_extract_137888322799805906_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_137888322799805906_tmp differ
    diff --git a/build/tmp/test/jar_extract_1385291140766396105_tmp b/build/tmp/test/jar_extract_1385291140766396105_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1385291140766396105_tmp differ
    diff --git a/build/tmp/test/jar_extract_1390820831887999042_tmp b/build/tmp/test/jar_extract_1390820831887999042_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1390820831887999042_tmp differ
    diff --git a/build/tmp/test/jar_extract_1392929497620979680_tmp b/build/tmp/test/jar_extract_1392929497620979680_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1392929497620979680_tmp differ
    diff --git a/build/tmp/test/jar_extract_1393797531292399875_tmp b/build/tmp/test/jar_extract_1393797531292399875_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1393797531292399875_tmp differ
    diff --git a/build/tmp/test/jar_extract_1393945895546489823_tmp b/build/tmp/test/jar_extract_1393945895546489823_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1393945895546489823_tmp differ
    diff --git a/build/tmp/test/jar_extract_1396787889368747184_tmp b/build/tmp/test/jar_extract_1396787889368747184_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1396787889368747184_tmp differ
    diff --git a/build/tmp/test/jar_extract_1397499076046213730_tmp b/build/tmp/test/jar_extract_1397499076046213730_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1397499076046213730_tmp differ
    diff --git a/build/tmp/test/jar_extract_1414484603944406882_tmp b/build/tmp/test/jar_extract_1414484603944406882_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1414484603944406882_tmp differ
    diff --git a/build/tmp/test/jar_extract_1415871795108793754_tmp b/build/tmp/test/jar_extract_1415871795108793754_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1415871795108793754_tmp differ
    diff --git a/build/tmp/test/jar_extract_1427774329415429655_tmp b/build/tmp/test/jar_extract_1427774329415429655_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1427774329415429655_tmp differ
    diff --git a/build/tmp/test/jar_extract_1427780832797686610_tmp b/build/tmp/test/jar_extract_1427780832797686610_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1427780832797686610_tmp differ
    diff --git a/build/tmp/test/jar_extract_14558301269524052_tmp b/build/tmp/test/jar_extract_14558301269524052_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_14558301269524052_tmp differ
    diff --git a/build/tmp/test/jar_extract_1481918725087050504_tmp b/build/tmp/test/jar_extract_1481918725087050504_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1481918725087050504_tmp differ
    diff --git a/build/tmp/test/jar_extract_1492721975276996112_tmp b/build/tmp/test/jar_extract_1492721975276996112_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1492721975276996112_tmp differ
    diff --git a/build/tmp/test/jar_extract_1501126526803744815_tmp b/build/tmp/test/jar_extract_1501126526803744815_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1501126526803744815_tmp differ
    diff --git a/build/tmp/test/jar_extract_1517473222951613107_tmp b/build/tmp/test/jar_extract_1517473222951613107_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1517473222951613107_tmp differ
    diff --git a/build/tmp/test/jar_extract_1520724766909731329_tmp b/build/tmp/test/jar_extract_1520724766909731329_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1520724766909731329_tmp differ
    diff --git a/build/tmp/test/jar_extract_1525268876566397852_tmp b/build/tmp/test/jar_extract_1525268876566397852_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1525268876566397852_tmp differ
    diff --git a/build/tmp/test/jar_extract_1533194864796774972_tmp b/build/tmp/test/jar_extract_1533194864796774972_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1533194864796774972_tmp differ
    diff --git a/build/tmp/test/jar_extract_1550437848249934934_tmp b/build/tmp/test/jar_extract_1550437848249934934_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1550437848249934934_tmp differ
    diff --git a/build/tmp/test/jar_extract_1552985135262608527_tmp b/build/tmp/test/jar_extract_1552985135262608527_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1552985135262608527_tmp differ
    diff --git a/build/tmp/test/jar_extract_1553560838769349887_tmp b/build/tmp/test/jar_extract_1553560838769349887_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1553560838769349887_tmp differ
    diff --git a/build/tmp/test/jar_extract_155859636363053717_tmp b/build/tmp/test/jar_extract_155859636363053717_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_155859636363053717_tmp differ
    diff --git a/build/tmp/test/jar_extract_1565577406770591143_tmp b/build/tmp/test/jar_extract_1565577406770591143_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1565577406770591143_tmp differ
    diff --git a/build/tmp/test/jar_extract_1566680243373906171_tmp b/build/tmp/test/jar_extract_1566680243373906171_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1566680243373906171_tmp differ
    diff --git a/build/tmp/test/jar_extract_1566714153699199320_tmp b/build/tmp/test/jar_extract_1566714153699199320_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1566714153699199320_tmp differ
    diff --git a/build/tmp/test/jar_extract_1574511119511308858_tmp b/build/tmp/test/jar_extract_1574511119511308858_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1574511119511308858_tmp differ
    diff --git a/build/tmp/test/jar_extract_1577411006853593776_tmp b/build/tmp/test/jar_extract_1577411006853593776_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1577411006853593776_tmp differ
    diff --git a/build/tmp/test/jar_extract_1578607396770011857_tmp b/build/tmp/test/jar_extract_1578607396770011857_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1578607396770011857_tmp differ
    diff --git a/build/tmp/test/jar_extract_15807523299313459_tmp b/build/tmp/test/jar_extract_15807523299313459_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_15807523299313459_tmp differ
    diff --git a/build/tmp/test/jar_extract_159768179203935202_tmp b/build/tmp/test/jar_extract_159768179203935202_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_159768179203935202_tmp differ
    diff --git a/build/tmp/test/jar_extract_1604959783789717587_tmp b/build/tmp/test/jar_extract_1604959783789717587_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1604959783789717587_tmp differ
    diff --git a/build/tmp/test/jar_extract_1607828262362256160_tmp b/build/tmp/test/jar_extract_1607828262362256160_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1607828262362256160_tmp differ
    diff --git a/build/tmp/test/jar_extract_161664984814520504_tmp b/build/tmp/test/jar_extract_161664984814520504_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_161664984814520504_tmp differ
    diff --git a/build/tmp/test/jar_extract_1618493440135350183_tmp b/build/tmp/test/jar_extract_1618493440135350183_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1618493440135350183_tmp differ
    diff --git a/build/tmp/test/jar_extract_1631411567076587234_tmp b/build/tmp/test/jar_extract_1631411567076587234_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1631411567076587234_tmp differ
    diff --git a/build/tmp/test/jar_extract_1634831458992758507_tmp b/build/tmp/test/jar_extract_1634831458992758507_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1634831458992758507_tmp differ
    diff --git a/build/tmp/test/jar_extract_1644169447204510240_tmp b/build/tmp/test/jar_extract_1644169447204510240_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1644169447204510240_tmp differ
    diff --git a/build/tmp/test/jar_extract_1646264380740454396_tmp b/build/tmp/test/jar_extract_1646264380740454396_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1646264380740454396_tmp differ
    diff --git a/build/tmp/test/jar_extract_165064682721620645_tmp b/build/tmp/test/jar_extract_165064682721620645_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_165064682721620645_tmp differ
    diff --git a/build/tmp/test/jar_extract_1669878915195693123_tmp b/build/tmp/test/jar_extract_1669878915195693123_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1669878915195693123_tmp differ
    diff --git a/build/tmp/test/jar_extract_167506412754010721_tmp b/build/tmp/test/jar_extract_167506412754010721_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_167506412754010721_tmp differ
    diff --git a/build/tmp/test/jar_extract_1675868202274309560_tmp b/build/tmp/test/jar_extract_1675868202274309560_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1675868202274309560_tmp differ
    diff --git a/build/tmp/test/jar_extract_1676732184094903094_tmp b/build/tmp/test/jar_extract_1676732184094903094_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1676732184094903094_tmp differ
    diff --git a/build/tmp/test/jar_extract_1681329318507003064_tmp b/build/tmp/test/jar_extract_1681329318507003064_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1681329318507003064_tmp differ
    diff --git a/build/tmp/test/jar_extract_1683659697401284594_tmp b/build/tmp/test/jar_extract_1683659697401284594_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1683659697401284594_tmp differ
    diff --git a/build/tmp/test/jar_extract_168655392114878891_tmp b/build/tmp/test/jar_extract_168655392114878891_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_168655392114878891_tmp differ
    diff --git a/build/tmp/test/jar_extract_1687557788041710813_tmp b/build/tmp/test/jar_extract_1687557788041710813_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1687557788041710813_tmp differ
    diff --git a/build/tmp/test/jar_extract_169213856739188403_tmp b/build/tmp/test/jar_extract_169213856739188403_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_169213856739188403_tmp differ
    diff --git a/build/tmp/test/jar_extract_1695212054664722195_tmp b/build/tmp/test/jar_extract_1695212054664722195_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1695212054664722195_tmp differ
    diff --git a/build/tmp/test/jar_extract_1695893074639386890_tmp b/build/tmp/test/jar_extract_1695893074639386890_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1695893074639386890_tmp differ
    diff --git a/build/tmp/test/jar_extract_1712107767707777853_tmp b/build/tmp/test/jar_extract_1712107767707777853_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1712107767707777853_tmp differ
    diff --git a/build/tmp/test/jar_extract_171536029593581091_tmp b/build/tmp/test/jar_extract_171536029593581091_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_171536029593581091_tmp differ
    diff --git a/build/tmp/test/jar_extract_1715779458453460546_tmp b/build/tmp/test/jar_extract_1715779458453460546_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1715779458453460546_tmp differ
    diff --git a/build/tmp/test/jar_extract_1720519974473597293_tmp b/build/tmp/test/jar_extract_1720519974473597293_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1720519974473597293_tmp differ
    diff --git a/build/tmp/test/jar_extract_1726416383242823697_tmp b/build/tmp/test/jar_extract_1726416383242823697_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1726416383242823697_tmp differ
    diff --git a/build/tmp/test/jar_extract_1740875196465805858_tmp b/build/tmp/test/jar_extract_1740875196465805858_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1740875196465805858_tmp differ
    diff --git a/build/tmp/test/jar_extract_1741240712825552972_tmp b/build/tmp/test/jar_extract_1741240712825552972_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1741240712825552972_tmp differ
    diff --git a/build/tmp/test/jar_extract_1742180684772389618_tmp b/build/tmp/test/jar_extract_1742180684772389618_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1742180684772389618_tmp differ
    diff --git a/build/tmp/test/jar_extract_1742664410453087617_tmp b/build/tmp/test/jar_extract_1742664410453087617_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1742664410453087617_tmp differ
    diff --git a/build/tmp/test/jar_extract_1747066345569822479_tmp b/build/tmp/test/jar_extract_1747066345569822479_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1747066345569822479_tmp differ
    diff --git a/build/tmp/test/jar_extract_1750969166634229855_tmp b/build/tmp/test/jar_extract_1750969166634229855_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1750969166634229855_tmp differ
    diff --git a/build/tmp/test/jar_extract_1760447733813594409_tmp b/build/tmp/test/jar_extract_1760447733813594409_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1760447733813594409_tmp differ
    diff --git a/build/tmp/test/jar_extract_1761402647525876124_tmp b/build/tmp/test/jar_extract_1761402647525876124_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1761402647525876124_tmp differ
    diff --git a/build/tmp/test/jar_extract_1762609001911333795_tmp b/build/tmp/test/jar_extract_1762609001911333795_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1762609001911333795_tmp differ
    diff --git a/build/tmp/test/jar_extract_1763394300029652102_tmp b/build/tmp/test/jar_extract_1763394300029652102_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1763394300029652102_tmp differ
    diff --git a/build/tmp/test/jar_extract_1764562224960779920_tmp b/build/tmp/test/jar_extract_1764562224960779920_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1764562224960779920_tmp differ
    diff --git a/build/tmp/test/jar_extract_1771662220346728947_tmp b/build/tmp/test/jar_extract_1771662220346728947_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1771662220346728947_tmp differ
    diff --git a/build/tmp/test/jar_extract_1780353026329762686_tmp b/build/tmp/test/jar_extract_1780353026329762686_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1780353026329762686_tmp differ
    diff --git a/build/tmp/test/jar_extract_1782085272148734004_tmp b/build/tmp/test/jar_extract_1782085272148734004_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1782085272148734004_tmp differ
    diff --git a/build/tmp/test/jar_extract_1786172102465947588_tmp b/build/tmp/test/jar_extract_1786172102465947588_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1786172102465947588_tmp differ
    diff --git a/build/tmp/test/jar_extract_180041331553857343_tmp b/build/tmp/test/jar_extract_180041331553857343_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_180041331553857343_tmp differ
    diff --git a/build/tmp/test/jar_extract_1802697755831675957_tmp b/build/tmp/test/jar_extract_1802697755831675957_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1802697755831675957_tmp differ
    diff --git a/build/tmp/test/jar_extract_1811053698949821082_tmp b/build/tmp/test/jar_extract_1811053698949821082_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1811053698949821082_tmp differ
    diff --git a/build/tmp/test/jar_extract_1816078580536650582_tmp b/build/tmp/test/jar_extract_1816078580536650582_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1816078580536650582_tmp differ
    diff --git a/build/tmp/test/jar_extract_1825654693111272680_tmp b/build/tmp/test/jar_extract_1825654693111272680_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1825654693111272680_tmp differ
    diff --git a/build/tmp/test/jar_extract_1831161009398483479_tmp b/build/tmp/test/jar_extract_1831161009398483479_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1831161009398483479_tmp differ
    diff --git a/build/tmp/test/jar_extract_1853471889651716310_tmp b/build/tmp/test/jar_extract_1853471889651716310_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1853471889651716310_tmp differ
    diff --git a/build/tmp/test/jar_extract_1854367284334825096_tmp b/build/tmp/test/jar_extract_1854367284334825096_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1854367284334825096_tmp differ
    diff --git a/build/tmp/test/jar_extract_1857571331904018495_tmp b/build/tmp/test/jar_extract_1857571331904018495_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1857571331904018495_tmp differ
    diff --git a/build/tmp/test/jar_extract_1859520986922477150_tmp b/build/tmp/test/jar_extract_1859520986922477150_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1859520986922477150_tmp differ
    diff --git a/build/tmp/test/jar_extract_1864544268873509695_tmp b/build/tmp/test/jar_extract_1864544268873509695_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1864544268873509695_tmp differ
    diff --git a/build/tmp/test/jar_extract_1872086962848285975_tmp b/build/tmp/test/jar_extract_1872086962848285975_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1872086962848285975_tmp differ
    diff --git a/build/tmp/test/jar_extract_1874747917607594926_tmp b/build/tmp/test/jar_extract_1874747917607594926_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1874747917607594926_tmp differ
    diff --git a/build/tmp/test/jar_extract_1877937889292967154_tmp b/build/tmp/test/jar_extract_1877937889292967154_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1877937889292967154_tmp differ
    diff --git a/build/tmp/test/jar_extract_1887961296653827618_tmp b/build/tmp/test/jar_extract_1887961296653827618_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1887961296653827618_tmp differ
    diff --git a/build/tmp/test/jar_extract_1890534199096542608_tmp b/build/tmp/test/jar_extract_1890534199096542608_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1890534199096542608_tmp differ
    diff --git a/build/tmp/test/jar_extract_1896435879885103898_tmp b/build/tmp/test/jar_extract_1896435879885103898_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1896435879885103898_tmp differ
    diff --git a/build/tmp/test/jar_extract_1912710054800056311_tmp b/build/tmp/test/jar_extract_1912710054800056311_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1912710054800056311_tmp differ
    diff --git a/build/tmp/test/jar_extract_1916133782283114072_tmp b/build/tmp/test/jar_extract_1916133782283114072_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1916133782283114072_tmp differ
    diff --git a/build/tmp/test/jar_extract_1920838142804686068_tmp b/build/tmp/test/jar_extract_1920838142804686068_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1920838142804686068_tmp differ
    diff --git a/build/tmp/test/jar_extract_1937892672266796098_tmp b/build/tmp/test/jar_extract_1937892672266796098_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1937892672266796098_tmp differ
    diff --git a/build/tmp/test/jar_extract_1963296463096247146_tmp b/build/tmp/test/jar_extract_1963296463096247146_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1963296463096247146_tmp differ
    diff --git a/build/tmp/test/jar_extract_1971921988062601624_tmp b/build/tmp/test/jar_extract_1971921988062601624_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1971921988062601624_tmp differ
    diff --git a/build/tmp/test/jar_extract_1975884797219204083_tmp b/build/tmp/test/jar_extract_1975884797219204083_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1975884797219204083_tmp differ
    diff --git a/build/tmp/test/jar_extract_1976984846129204563_tmp b/build/tmp/test/jar_extract_1976984846129204563_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1976984846129204563_tmp differ
    diff --git a/build/tmp/test/jar_extract_1977186763081168938_tmp b/build/tmp/test/jar_extract_1977186763081168938_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1977186763081168938_tmp differ
    diff --git a/build/tmp/test/jar_extract_1979248169813743195_tmp b/build/tmp/test/jar_extract_1979248169813743195_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1979248169813743195_tmp differ
    diff --git a/build/tmp/test/jar_extract_1992477309639538592_tmp b/build/tmp/test/jar_extract_1992477309639538592_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_1992477309639538592_tmp differ
    diff --git a/build/tmp/test/jar_extract_2000886537066487354_tmp b/build/tmp/test/jar_extract_2000886537066487354_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2000886537066487354_tmp differ
    diff --git a/build/tmp/test/jar_extract_2006734544070771769_tmp b/build/tmp/test/jar_extract_2006734544070771769_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2006734544070771769_tmp differ
    diff --git a/build/tmp/test/jar_extract_20208705334658688_tmp b/build/tmp/test/jar_extract_20208705334658688_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_20208705334658688_tmp differ
    diff --git a/build/tmp/test/jar_extract_2029372408287276158_tmp b/build/tmp/test/jar_extract_2029372408287276158_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2029372408287276158_tmp differ
    diff --git a/build/tmp/test/jar_extract_2052251110274761924_tmp b/build/tmp/test/jar_extract_2052251110274761924_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2052251110274761924_tmp differ
    diff --git a/build/tmp/test/jar_extract_2061591180037982959_tmp b/build/tmp/test/jar_extract_2061591180037982959_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2061591180037982959_tmp differ
    diff --git a/build/tmp/test/jar_extract_2061666875726486541_tmp b/build/tmp/test/jar_extract_2061666875726486541_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2061666875726486541_tmp differ
    diff --git a/build/tmp/test/jar_extract_2066584892251555878_tmp b/build/tmp/test/jar_extract_2066584892251555878_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2066584892251555878_tmp differ
    diff --git a/build/tmp/test/jar_extract_2067944708003176741_tmp b/build/tmp/test/jar_extract_2067944708003176741_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2067944708003176741_tmp differ
    diff --git a/build/tmp/test/jar_extract_2068729038890774409_tmp b/build/tmp/test/jar_extract_2068729038890774409_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2068729038890774409_tmp differ
    diff --git a/build/tmp/test/jar_extract_2080206635210135154_tmp b/build/tmp/test/jar_extract_2080206635210135154_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2080206635210135154_tmp differ
    diff --git a/build/tmp/test/jar_extract_2085819629819122109_tmp b/build/tmp/test/jar_extract_2085819629819122109_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2085819629819122109_tmp differ
    diff --git a/build/tmp/test/jar_extract_2101925900870072222_tmp b/build/tmp/test/jar_extract_2101925900870072222_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2101925900870072222_tmp differ
    diff --git a/build/tmp/test/jar_extract_2113947712353472188_tmp b/build/tmp/test/jar_extract_2113947712353472188_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2113947712353472188_tmp differ
    diff --git a/build/tmp/test/jar_extract_2120448939485703958_tmp b/build/tmp/test/jar_extract_2120448939485703958_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2120448939485703958_tmp differ
    diff --git a/build/tmp/test/jar_extract_2121642316110902830_tmp b/build/tmp/test/jar_extract_2121642316110902830_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2121642316110902830_tmp differ
    diff --git a/build/tmp/test/jar_extract_2129937447753599605_tmp b/build/tmp/test/jar_extract_2129937447753599605_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2129937447753599605_tmp differ
    diff --git a/build/tmp/test/jar_extract_213213114176349969_tmp b/build/tmp/test/jar_extract_213213114176349969_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_213213114176349969_tmp differ
    diff --git a/build/tmp/test/jar_extract_2146600924129671486_tmp b/build/tmp/test/jar_extract_2146600924129671486_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2146600924129671486_tmp differ
    diff --git a/build/tmp/test/jar_extract_2149065195389312998_tmp b/build/tmp/test/jar_extract_2149065195389312998_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2149065195389312998_tmp differ
    diff --git a/build/tmp/test/jar_extract_2152718120211711599_tmp b/build/tmp/test/jar_extract_2152718120211711599_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2152718120211711599_tmp differ
    diff --git a/build/tmp/test/jar_extract_2153234440414364219_tmp b/build/tmp/test/jar_extract_2153234440414364219_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2153234440414364219_tmp differ
    diff --git a/build/tmp/test/jar_extract_2158307328999188515_tmp b/build/tmp/test/jar_extract_2158307328999188515_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2158307328999188515_tmp differ
    diff --git a/build/tmp/test/jar_extract_2158792040392229078_tmp b/build/tmp/test/jar_extract_2158792040392229078_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2158792040392229078_tmp differ
    diff --git a/build/tmp/test/jar_extract_2161819830445005888_tmp b/build/tmp/test/jar_extract_2161819830445005888_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2161819830445005888_tmp differ
    diff --git a/build/tmp/test/jar_extract_2178215741581608172_tmp b/build/tmp/test/jar_extract_2178215741581608172_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2178215741581608172_tmp differ
    diff --git a/build/tmp/test/jar_extract_2182968956069592898_tmp b/build/tmp/test/jar_extract_2182968956069592898_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2182968956069592898_tmp differ
    diff --git a/build/tmp/test/jar_extract_2189621230666663258_tmp b/build/tmp/test/jar_extract_2189621230666663258_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2189621230666663258_tmp differ
    diff --git a/build/tmp/test/jar_extract_2192527365535264776_tmp b/build/tmp/test/jar_extract_2192527365535264776_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2192527365535264776_tmp differ
    diff --git a/build/tmp/test/jar_extract_2195341780933003268_tmp b/build/tmp/test/jar_extract_2195341780933003268_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2195341780933003268_tmp differ
    diff --git a/build/tmp/test/jar_extract_2209426742495825680_tmp b/build/tmp/test/jar_extract_2209426742495825680_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2209426742495825680_tmp differ
    diff --git a/build/tmp/test/jar_extract_2211318267719977222_tmp b/build/tmp/test/jar_extract_2211318267719977222_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2211318267719977222_tmp differ
    diff --git a/build/tmp/test/jar_extract_2211594860137325222_tmp b/build/tmp/test/jar_extract_2211594860137325222_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2211594860137325222_tmp differ
    diff --git a/build/tmp/test/jar_extract_2216818260214590671_tmp b/build/tmp/test/jar_extract_2216818260214590671_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2216818260214590671_tmp differ
    diff --git a/build/tmp/test/jar_extract_2232623699969825448_tmp b/build/tmp/test/jar_extract_2232623699969825448_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2232623699969825448_tmp differ
    diff --git a/build/tmp/test/jar_extract_2257044388406154500_tmp b/build/tmp/test/jar_extract_2257044388406154500_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2257044388406154500_tmp differ
    diff --git a/build/tmp/test/jar_extract_2258767308709398127_tmp b/build/tmp/test/jar_extract_2258767308709398127_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2258767308709398127_tmp differ
    diff --git a/build/tmp/test/jar_extract_2263215238215021729_tmp b/build/tmp/test/jar_extract_2263215238215021729_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2263215238215021729_tmp differ
    diff --git a/build/tmp/test/jar_extract_2264623242663088102_tmp b/build/tmp/test/jar_extract_2264623242663088102_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2264623242663088102_tmp differ
    diff --git a/build/tmp/test/jar_extract_226885668175351265_tmp b/build/tmp/test/jar_extract_226885668175351265_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_226885668175351265_tmp differ
    diff --git a/build/tmp/test/jar_extract_2271596302458908436_tmp b/build/tmp/test/jar_extract_2271596302458908436_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2271596302458908436_tmp differ
    diff --git a/build/tmp/test/jar_extract_2274256232809684792_tmp b/build/tmp/test/jar_extract_2274256232809684792_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2274256232809684792_tmp differ
    diff --git a/build/tmp/test/jar_extract_2283239946244064202_tmp b/build/tmp/test/jar_extract_2283239946244064202_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2283239946244064202_tmp differ
    diff --git a/build/tmp/test/jar_extract_2296893843426268171_tmp b/build/tmp/test/jar_extract_2296893843426268171_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2296893843426268171_tmp differ
    diff --git a/build/tmp/test/jar_extract_2306203544882942172_tmp b/build/tmp/test/jar_extract_2306203544882942172_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2306203544882942172_tmp differ
    diff --git a/build/tmp/test/jar_extract_2308098789560742236_tmp b/build/tmp/test/jar_extract_2308098789560742236_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2308098789560742236_tmp differ
    diff --git a/build/tmp/test/jar_extract_2313261211451822953_tmp b/build/tmp/test/jar_extract_2313261211451822953_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2313261211451822953_tmp differ
    diff --git a/build/tmp/test/jar_extract_2315861108491215151_tmp b/build/tmp/test/jar_extract_2315861108491215151_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2315861108491215151_tmp differ
    diff --git a/build/tmp/test/jar_extract_2317357266677404863_tmp b/build/tmp/test/jar_extract_2317357266677404863_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2317357266677404863_tmp differ
    diff --git a/build/tmp/test/jar_extract_2333201653617339635_tmp b/build/tmp/test/jar_extract_2333201653617339635_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2333201653617339635_tmp differ
    diff --git a/build/tmp/test/jar_extract_2337099708762964591_tmp b/build/tmp/test/jar_extract_2337099708762964591_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2337099708762964591_tmp differ
    diff --git a/build/tmp/test/jar_extract_2338390941783805581_tmp b/build/tmp/test/jar_extract_2338390941783805581_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2338390941783805581_tmp differ
    diff --git a/build/tmp/test/jar_extract_2341899766259837758_tmp b/build/tmp/test/jar_extract_2341899766259837758_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2341899766259837758_tmp differ
    diff --git a/build/tmp/test/jar_extract_234221120945930557_tmp b/build/tmp/test/jar_extract_234221120945930557_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_234221120945930557_tmp differ
    diff --git a/build/tmp/test/jar_extract_2353552245594059886_tmp b/build/tmp/test/jar_extract_2353552245594059886_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2353552245594059886_tmp differ
    diff --git a/build/tmp/test/jar_extract_2373382282015537956_tmp b/build/tmp/test/jar_extract_2373382282015537956_tmp
    new file mode 100644
    index 00000000..aa20d64a
    Binary files /dev/null and b/build/tmp/test/jar_extract_2373382282015537956_tmp differ
    diff --git a/build/tmp/test/jar_extract_23762237161988508_tmp b/build/tmp/test/jar_extract_23762237161988508_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_23762237161988508_tmp differ
    diff --git a/build/tmp/test/jar_extract_2376771468643827469_tmp b/build/tmp/test/jar_extract_2376771468643827469_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2376771468643827469_tmp differ
    diff --git a/build/tmp/test/jar_extract_2380125340453568416_tmp b/build/tmp/test/jar_extract_2380125340453568416_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2380125340453568416_tmp differ
    diff --git a/build/tmp/test/jar_extract_2397295552614628301_tmp b/build/tmp/test/jar_extract_2397295552614628301_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2397295552614628301_tmp differ
    diff --git a/build/tmp/test/jar_extract_2408683795347862035_tmp b/build/tmp/test/jar_extract_2408683795347862035_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2408683795347862035_tmp differ
    diff --git a/build/tmp/test/jar_extract_2424192737648855640_tmp b/build/tmp/test/jar_extract_2424192737648855640_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2424192737648855640_tmp differ
    diff --git a/build/tmp/test/jar_extract_2424675581920491781_tmp b/build/tmp/test/jar_extract_2424675581920491781_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2424675581920491781_tmp differ
    diff --git a/build/tmp/test/jar_extract_2429983413555919385_tmp b/build/tmp/test/jar_extract_2429983413555919385_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_2429983413555919385_tmp differ
    diff --git a/build/tmp/test/jar_extract_244217018236252470_tmp b/build/tmp/test/jar_extract_244217018236252470_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_244217018236252470_tmp differ
    diff --git a/build/tmp/test/jar_extract_2449528362086868349_tmp b/build/tmp/test/jar_extract_2449528362086868349_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2449528362086868349_tmp differ
    diff --git a/build/tmp/test/jar_extract_24582296732546925_tmp b/build/tmp/test/jar_extract_24582296732546925_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_24582296732546925_tmp differ
    diff --git a/build/tmp/test/jar_extract_2459978546489484094_tmp b/build/tmp/test/jar_extract_2459978546489484094_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2459978546489484094_tmp differ
    diff --git a/build/tmp/test/jar_extract_2463376528087717791_tmp b/build/tmp/test/jar_extract_2463376528087717791_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_2463376528087717791_tmp differ
    diff --git a/build/tmp/test/jar_extract_246555975217955532_tmp b/build/tmp/test/jar_extract_246555975217955532_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_246555975217955532_tmp differ
    diff --git a/build/tmp/test/jar_extract_2468280734355972540_tmp b/build/tmp/test/jar_extract_2468280734355972540_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2468280734355972540_tmp differ
    diff --git a/build/tmp/test/jar_extract_2485347106039398830_tmp b/build/tmp/test/jar_extract_2485347106039398830_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2485347106039398830_tmp differ
    diff --git a/build/tmp/test/jar_extract_2492301784159420883_tmp b/build/tmp/test/jar_extract_2492301784159420883_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2492301784159420883_tmp differ
    diff --git a/build/tmp/test/jar_extract_2492527502980177861_tmp b/build/tmp/test/jar_extract_2492527502980177861_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2492527502980177861_tmp differ
    diff --git a/build/tmp/test/jar_extract_2494972090135648371_tmp b/build/tmp/test/jar_extract_2494972090135648371_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2494972090135648371_tmp differ
    diff --git a/build/tmp/test/jar_extract_2498566569083337013_tmp b/build/tmp/test/jar_extract_2498566569083337013_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2498566569083337013_tmp differ
    diff --git a/build/tmp/test/jar_extract_2504247435634038021_tmp b/build/tmp/test/jar_extract_2504247435634038021_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2504247435634038021_tmp differ
    diff --git a/build/tmp/test/jar_extract_2507881203733479460_tmp b/build/tmp/test/jar_extract_2507881203733479460_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2507881203733479460_tmp differ
    diff --git a/build/tmp/test/jar_extract_2515758808898785802_tmp b/build/tmp/test/jar_extract_2515758808898785802_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2515758808898785802_tmp differ
    diff --git a/build/tmp/test/jar_extract_2527419588399578081_tmp b/build/tmp/test/jar_extract_2527419588399578081_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2527419588399578081_tmp differ
    diff --git a/build/tmp/test/jar_extract_2532956999412263701_tmp b/build/tmp/test/jar_extract_2532956999412263701_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2532956999412263701_tmp differ
    diff --git a/build/tmp/test/jar_extract_2538116611485154562_tmp b/build/tmp/test/jar_extract_2538116611485154562_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2538116611485154562_tmp differ
    diff --git a/build/tmp/test/jar_extract_2548042084776653485_tmp b/build/tmp/test/jar_extract_2548042084776653485_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2548042084776653485_tmp differ
    diff --git a/build/tmp/test/jar_extract_2552438606854480643_tmp b/build/tmp/test/jar_extract_2552438606854480643_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2552438606854480643_tmp differ
    diff --git a/build/tmp/test/jar_extract_2565289714393670798_tmp b/build/tmp/test/jar_extract_2565289714393670798_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_2565289714393670798_tmp differ
    diff --git a/build/tmp/test/jar_extract_2570041355501211820_tmp b/build/tmp/test/jar_extract_2570041355501211820_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2570041355501211820_tmp differ
    diff --git a/build/tmp/test/jar_extract_2570916467814869150_tmp b/build/tmp/test/jar_extract_2570916467814869150_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2570916467814869150_tmp differ
    diff --git a/build/tmp/test/jar_extract_2576144632725299703_tmp b/build/tmp/test/jar_extract_2576144632725299703_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2576144632725299703_tmp differ
    diff --git a/build/tmp/test/jar_extract_2578839844591444612_tmp b/build/tmp/test/jar_extract_2578839844591444612_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2578839844591444612_tmp differ
    diff --git a/build/tmp/test/jar_extract_2580594419687675378_tmp b/build/tmp/test/jar_extract_2580594419687675378_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2580594419687675378_tmp differ
    diff --git a/build/tmp/test/jar_extract_2583025551143588675_tmp b/build/tmp/test/jar_extract_2583025551143588675_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2583025551143588675_tmp differ
    diff --git a/build/tmp/test/jar_extract_2583276676463455296_tmp b/build/tmp/test/jar_extract_2583276676463455296_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2583276676463455296_tmp differ
    diff --git a/build/tmp/test/jar_extract_2607753686528694063_tmp b/build/tmp/test/jar_extract_2607753686528694063_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2607753686528694063_tmp differ
    diff --git a/build/tmp/test/jar_extract_2614021171655962989_tmp b/build/tmp/test/jar_extract_2614021171655962989_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2614021171655962989_tmp differ
    diff --git a/build/tmp/test/jar_extract_2620624318636282406_tmp b/build/tmp/test/jar_extract_2620624318636282406_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_2620624318636282406_tmp differ
    diff --git a/build/tmp/test/jar_extract_2633434187976828837_tmp b/build/tmp/test/jar_extract_2633434187976828837_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2633434187976828837_tmp differ
    diff --git a/build/tmp/test/jar_extract_264826587204455876_tmp b/build/tmp/test/jar_extract_264826587204455876_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_264826587204455876_tmp differ
    diff --git a/build/tmp/test/jar_extract_2653067503248813073_tmp b/build/tmp/test/jar_extract_2653067503248813073_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2653067503248813073_tmp differ
    diff --git a/build/tmp/test/jar_extract_2654534929787680773_tmp b/build/tmp/test/jar_extract_2654534929787680773_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2654534929787680773_tmp differ
    diff --git a/build/tmp/test/jar_extract_2660950356648788626_tmp b/build/tmp/test/jar_extract_2660950356648788626_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_2660950356648788626_tmp differ
    diff --git a/build/tmp/test/jar_extract_2662646581535943932_tmp b/build/tmp/test/jar_extract_2662646581535943932_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2662646581535943932_tmp differ
    diff --git a/build/tmp/test/jar_extract_2678356662650510849_tmp b/build/tmp/test/jar_extract_2678356662650510849_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2678356662650510849_tmp differ
    diff --git a/build/tmp/test/jar_extract_267939611708542530_tmp b/build/tmp/test/jar_extract_267939611708542530_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_267939611708542530_tmp differ
    diff --git a/build/tmp/test/jar_extract_2682122831045768947_tmp b/build/tmp/test/jar_extract_2682122831045768947_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2682122831045768947_tmp differ
    diff --git a/build/tmp/test/jar_extract_2685226731391588825_tmp b/build/tmp/test/jar_extract_2685226731391588825_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2685226731391588825_tmp differ
    diff --git a/build/tmp/test/jar_extract_2686591262422485560_tmp b/build/tmp/test/jar_extract_2686591262422485560_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2686591262422485560_tmp differ
    diff --git a/build/tmp/test/jar_extract_268733267331954488_tmp b/build/tmp/test/jar_extract_268733267331954488_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_268733267331954488_tmp differ
    diff --git a/build/tmp/test/jar_extract_2695115933910520840_tmp b/build/tmp/test/jar_extract_2695115933910520840_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2695115933910520840_tmp differ
    diff --git a/build/tmp/test/jar_extract_2695948664599589368_tmp b/build/tmp/test/jar_extract_2695948664599589368_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2695948664599589368_tmp differ
    diff --git a/build/tmp/test/jar_extract_2724951069582759418_tmp b/build/tmp/test/jar_extract_2724951069582759418_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2724951069582759418_tmp differ
    diff --git a/build/tmp/test/jar_extract_2729372526967120299_tmp b/build/tmp/test/jar_extract_2729372526967120299_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2729372526967120299_tmp differ
    diff --git a/build/tmp/test/jar_extract_2738817307642721129_tmp b/build/tmp/test/jar_extract_2738817307642721129_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2738817307642721129_tmp differ
    diff --git a/build/tmp/test/jar_extract_2756415774259139250_tmp b/build/tmp/test/jar_extract_2756415774259139250_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2756415774259139250_tmp differ
    diff --git a/build/tmp/test/jar_extract_277065027925968155_tmp b/build/tmp/test/jar_extract_277065027925968155_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_277065027925968155_tmp differ
    diff --git a/build/tmp/test/jar_extract_2797036092089748204_tmp b/build/tmp/test/jar_extract_2797036092089748204_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2797036092089748204_tmp differ
    diff --git a/build/tmp/test/jar_extract_2808238037267084414_tmp b/build/tmp/test/jar_extract_2808238037267084414_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2808238037267084414_tmp differ
    diff --git a/build/tmp/test/jar_extract_2808361506481583442_tmp b/build/tmp/test/jar_extract_2808361506481583442_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2808361506481583442_tmp differ
    diff --git a/build/tmp/test/jar_extract_2812185001686798448_tmp b/build/tmp/test/jar_extract_2812185001686798448_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2812185001686798448_tmp differ
    diff --git a/build/tmp/test/jar_extract_281371696351513110_tmp b/build/tmp/test/jar_extract_281371696351513110_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_281371696351513110_tmp differ
    diff --git a/build/tmp/test/jar_extract_2816478840743732008_tmp b/build/tmp/test/jar_extract_2816478840743732008_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2816478840743732008_tmp differ
    diff --git a/build/tmp/test/jar_extract_2833443397640021763_tmp b/build/tmp/test/jar_extract_2833443397640021763_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2833443397640021763_tmp differ
    diff --git a/build/tmp/test/jar_extract_2834136397595011061_tmp b/build/tmp/test/jar_extract_2834136397595011061_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2834136397595011061_tmp differ
    diff --git a/build/tmp/test/jar_extract_2836560734540144855_tmp b/build/tmp/test/jar_extract_2836560734540144855_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2836560734540144855_tmp differ
    diff --git a/build/tmp/test/jar_extract_2841836000207026219_tmp b/build/tmp/test/jar_extract_2841836000207026219_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2841836000207026219_tmp differ
    diff --git a/build/tmp/test/jar_extract_2842662442672723496_tmp b/build/tmp/test/jar_extract_2842662442672723496_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2842662442672723496_tmp differ
    diff --git a/build/tmp/test/jar_extract_2844184732954928605_tmp b/build/tmp/test/jar_extract_2844184732954928605_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2844184732954928605_tmp differ
    diff --git a/build/tmp/test/jar_extract_2847045438183218279_tmp b/build/tmp/test/jar_extract_2847045438183218279_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2847045438183218279_tmp differ
    diff --git a/build/tmp/test/jar_extract_2859345440136919916_tmp b/build/tmp/test/jar_extract_2859345440136919916_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2859345440136919916_tmp differ
    diff --git a/build/tmp/test/jar_extract_2859920795395960432_tmp b/build/tmp/test/jar_extract_2859920795395960432_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2859920795395960432_tmp differ
    diff --git a/build/tmp/test/jar_extract_2892418751430778603_tmp b/build/tmp/test/jar_extract_2892418751430778603_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2892418751430778603_tmp differ
    diff --git a/build/tmp/test/jar_extract_2899006913584322912_tmp b/build/tmp/test/jar_extract_2899006913584322912_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2899006913584322912_tmp differ
    diff --git a/build/tmp/test/jar_extract_2899282437000817598_tmp b/build/tmp/test/jar_extract_2899282437000817598_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2899282437000817598_tmp differ
    diff --git a/build/tmp/test/jar_extract_2901942025910560816_tmp b/build/tmp/test/jar_extract_2901942025910560816_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2901942025910560816_tmp differ
    diff --git a/build/tmp/test/jar_extract_2904561650794145946_tmp b/build/tmp/test/jar_extract_2904561650794145946_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2904561650794145946_tmp differ
    diff --git a/build/tmp/test/jar_extract_2919884791306514561_tmp b/build/tmp/test/jar_extract_2919884791306514561_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2919884791306514561_tmp differ
    diff --git a/build/tmp/test/jar_extract_2927901032588942273_tmp b/build/tmp/test/jar_extract_2927901032588942273_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2927901032588942273_tmp differ
    diff --git a/build/tmp/test/jar_extract_292980768701079110_tmp b/build/tmp/test/jar_extract_292980768701079110_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_292980768701079110_tmp differ
    diff --git a/build/tmp/test/jar_extract_2934748942400701129_tmp b/build/tmp/test/jar_extract_2934748942400701129_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2934748942400701129_tmp differ
    diff --git a/build/tmp/test/jar_extract_2948416398576790086_tmp b/build/tmp/test/jar_extract_2948416398576790086_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2948416398576790086_tmp differ
    diff --git a/build/tmp/test/jar_extract_2951848687414076878_tmp b/build/tmp/test/jar_extract_2951848687414076878_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2951848687414076878_tmp differ
    diff --git a/build/tmp/test/jar_extract_2964053732782265767_tmp b/build/tmp/test/jar_extract_2964053732782265767_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2964053732782265767_tmp differ
    diff --git a/build/tmp/test/jar_extract_2971595126246756217_tmp b/build/tmp/test/jar_extract_2971595126246756217_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2971595126246756217_tmp differ
    diff --git a/build/tmp/test/jar_extract_2975177446994581633_tmp b/build/tmp/test/jar_extract_2975177446994581633_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2975177446994581633_tmp differ
    diff --git a/build/tmp/test/jar_extract_2981299325431841208_tmp b/build/tmp/test/jar_extract_2981299325431841208_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2981299325431841208_tmp differ
    diff --git a/build/tmp/test/jar_extract_2982926556767276277_tmp b/build/tmp/test/jar_extract_2982926556767276277_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2982926556767276277_tmp differ
    diff --git a/build/tmp/test/jar_extract_2992040373277745519_tmp b/build/tmp/test/jar_extract_2992040373277745519_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2992040373277745519_tmp differ
    diff --git a/build/tmp/test/jar_extract_2992614787056707918_tmp b/build/tmp/test/jar_extract_2992614787056707918_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2992614787056707918_tmp differ
    diff --git a/build/tmp/test/jar_extract_2998519526787138408_tmp b/build/tmp/test/jar_extract_2998519526787138408_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2998519526787138408_tmp differ
    diff --git a/build/tmp/test/jar_extract_2999805163355259135_tmp b/build/tmp/test/jar_extract_2999805163355259135_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_2999805163355259135_tmp differ
    diff --git a/build/tmp/test/jar_extract_3002130301510674206_tmp b/build/tmp/test/jar_extract_3002130301510674206_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3002130301510674206_tmp differ
    diff --git a/build/tmp/test/jar_extract_3010362944544386950_tmp b/build/tmp/test/jar_extract_3010362944544386950_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3010362944544386950_tmp differ
    diff --git a/build/tmp/test/jar_extract_3025210864751387025_tmp b/build/tmp/test/jar_extract_3025210864751387025_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3025210864751387025_tmp differ
    diff --git a/build/tmp/test/jar_extract_303945317787461308_tmp b/build/tmp/test/jar_extract_303945317787461308_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_303945317787461308_tmp differ
    diff --git a/build/tmp/test/jar_extract_3053486119435198348_tmp b/build/tmp/test/jar_extract_3053486119435198348_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3053486119435198348_tmp differ
    diff --git a/build/tmp/test/jar_extract_3060300374079361259_tmp b/build/tmp/test/jar_extract_3060300374079361259_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3060300374079361259_tmp differ
    diff --git a/build/tmp/test/jar_extract_3061035309177944060_tmp b/build/tmp/test/jar_extract_3061035309177944060_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3061035309177944060_tmp differ
    diff --git a/build/tmp/test/jar_extract_306927704940940059_tmp b/build/tmp/test/jar_extract_306927704940940059_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_306927704940940059_tmp differ
    diff --git a/build/tmp/test/jar_extract_307446352338794416_tmp b/build/tmp/test/jar_extract_307446352338794416_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_307446352338794416_tmp differ
    diff --git a/build/tmp/test/jar_extract_3088075105078580715_tmp b/build/tmp/test/jar_extract_3088075105078580715_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3088075105078580715_tmp differ
    diff --git a/build/tmp/test/jar_extract_3094364971316793758_tmp b/build/tmp/test/jar_extract_3094364971316793758_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3094364971316793758_tmp differ
    diff --git a/build/tmp/test/jar_extract_3102459516009740270_tmp b/build/tmp/test/jar_extract_3102459516009740270_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3102459516009740270_tmp differ
    diff --git a/build/tmp/test/jar_extract_3105176420967829748_tmp b/build/tmp/test/jar_extract_3105176420967829748_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3105176420967829748_tmp differ
    diff --git a/build/tmp/test/jar_extract_3113697325543283871_tmp b/build/tmp/test/jar_extract_3113697325543283871_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3113697325543283871_tmp differ
    diff --git a/build/tmp/test/jar_extract_3127701129412532081_tmp b/build/tmp/test/jar_extract_3127701129412532081_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3127701129412532081_tmp differ
    diff --git a/build/tmp/test/jar_extract_3130128363238157171_tmp b/build/tmp/test/jar_extract_3130128363238157171_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3130128363238157171_tmp differ
    diff --git a/build/tmp/test/jar_extract_3139988970709359065_tmp b/build/tmp/test/jar_extract_3139988970709359065_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3139988970709359065_tmp differ
    diff --git a/build/tmp/test/jar_extract_3154288778020405619_tmp b/build/tmp/test/jar_extract_3154288778020405619_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3154288778020405619_tmp differ
    diff --git a/build/tmp/test/jar_extract_3158544452545346311_tmp b/build/tmp/test/jar_extract_3158544452545346311_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3158544452545346311_tmp differ
    diff --git a/build/tmp/test/jar_extract_3168868614015907770_tmp b/build/tmp/test/jar_extract_3168868614015907770_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3168868614015907770_tmp differ
    diff --git a/build/tmp/test/jar_extract_3170717029053702859_tmp b/build/tmp/test/jar_extract_3170717029053702859_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3170717029053702859_tmp differ
    diff --git a/build/tmp/test/jar_extract_3181315591540346292_tmp b/build/tmp/test/jar_extract_3181315591540346292_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3181315591540346292_tmp differ
    diff --git a/build/tmp/test/jar_extract_3188086178887189147_tmp b/build/tmp/test/jar_extract_3188086178887189147_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3188086178887189147_tmp differ
    diff --git a/build/tmp/test/jar_extract_3209419819874265064_tmp b/build/tmp/test/jar_extract_3209419819874265064_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3209419819874265064_tmp differ
    diff --git a/build/tmp/test/jar_extract_3235080514154639544_tmp b/build/tmp/test/jar_extract_3235080514154639544_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3235080514154639544_tmp differ
    diff --git a/build/tmp/test/jar_extract_3236364796935015800_tmp b/build/tmp/test/jar_extract_3236364796935015800_tmp
    new file mode 100644
    index 00000000..aa20d64a
    Binary files /dev/null and b/build/tmp/test/jar_extract_3236364796935015800_tmp differ
    diff --git a/build/tmp/test/jar_extract_3239149991898457505_tmp b/build/tmp/test/jar_extract_3239149991898457505_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3239149991898457505_tmp differ
    diff --git a/build/tmp/test/jar_extract_3245266539437834048_tmp b/build/tmp/test/jar_extract_3245266539437834048_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3245266539437834048_tmp differ
    diff --git a/build/tmp/test/jar_extract_3248092995328228246_tmp b/build/tmp/test/jar_extract_3248092995328228246_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3248092995328228246_tmp differ
    diff --git a/build/tmp/test/jar_extract_3250399646311939993_tmp b/build/tmp/test/jar_extract_3250399646311939993_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3250399646311939993_tmp differ
    diff --git a/build/tmp/test/jar_extract_3264136016556886963_tmp b/build/tmp/test/jar_extract_3264136016556886963_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3264136016556886963_tmp differ
    diff --git a/build/tmp/test/jar_extract_3264652927499447308_tmp b/build/tmp/test/jar_extract_3264652927499447308_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3264652927499447308_tmp differ
    diff --git a/build/tmp/test/jar_extract_3274797059889837942_tmp b/build/tmp/test/jar_extract_3274797059889837942_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3274797059889837942_tmp differ
    diff --git a/build/tmp/test/jar_extract_327902823306022545_tmp b/build/tmp/test/jar_extract_327902823306022545_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_327902823306022545_tmp differ
    diff --git a/build/tmp/test/jar_extract_3282784116163512918_tmp b/build/tmp/test/jar_extract_3282784116163512918_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3282784116163512918_tmp differ
    diff --git a/build/tmp/test/jar_extract_3305865215271347129_tmp b/build/tmp/test/jar_extract_3305865215271347129_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3305865215271347129_tmp differ
    diff --git a/build/tmp/test/jar_extract_3324609982655769090_tmp b/build/tmp/test/jar_extract_3324609982655769090_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3324609982655769090_tmp differ
    diff --git a/build/tmp/test/jar_extract_334145069994252178_tmp b/build/tmp/test/jar_extract_334145069994252178_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_334145069994252178_tmp differ
    diff --git a/build/tmp/test/jar_extract_3349036227503399234_tmp b/build/tmp/test/jar_extract_3349036227503399234_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3349036227503399234_tmp differ
    diff --git a/build/tmp/test/jar_extract_3352668001913078311_tmp b/build/tmp/test/jar_extract_3352668001913078311_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3352668001913078311_tmp differ
    diff --git a/build/tmp/test/jar_extract_3356855969695843613_tmp b/build/tmp/test/jar_extract_3356855969695843613_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3356855969695843613_tmp differ
    diff --git a/build/tmp/test/jar_extract_3362104723698371565_tmp b/build/tmp/test/jar_extract_3362104723698371565_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3362104723698371565_tmp differ
    diff --git a/build/tmp/test/jar_extract_3365838514128547863_tmp b/build/tmp/test/jar_extract_3365838514128547863_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3365838514128547863_tmp differ
    diff --git a/build/tmp/test/jar_extract_3376372258542273691_tmp b/build/tmp/test/jar_extract_3376372258542273691_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3376372258542273691_tmp differ
    diff --git a/build/tmp/test/jar_extract_3382358631626398289_tmp b/build/tmp/test/jar_extract_3382358631626398289_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3382358631626398289_tmp differ
    diff --git a/build/tmp/test/jar_extract_3386850456475431338_tmp b/build/tmp/test/jar_extract_3386850456475431338_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3386850456475431338_tmp differ
    diff --git a/build/tmp/test/jar_extract_3390258161618632684_tmp b/build/tmp/test/jar_extract_3390258161618632684_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3390258161618632684_tmp differ
    diff --git a/build/tmp/test/jar_extract_3399242911744913094_tmp b/build/tmp/test/jar_extract_3399242911744913094_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3399242911744913094_tmp differ
    diff --git a/build/tmp/test/jar_extract_3408856485449066341_tmp b/build/tmp/test/jar_extract_3408856485449066341_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3408856485449066341_tmp differ
    diff --git a/build/tmp/test/jar_extract_3424483197790939988_tmp b/build/tmp/test/jar_extract_3424483197790939988_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3424483197790939988_tmp differ
    diff --git a/build/tmp/test/jar_extract_3427519686325805992_tmp b/build/tmp/test/jar_extract_3427519686325805992_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3427519686325805992_tmp differ
    diff --git a/build/tmp/test/jar_extract_3430459314676149000_tmp b/build/tmp/test/jar_extract_3430459314676149000_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3430459314676149000_tmp differ
    diff --git a/build/tmp/test/jar_extract_3435332477507124981_tmp b/build/tmp/test/jar_extract_3435332477507124981_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3435332477507124981_tmp differ
    diff --git a/build/tmp/test/jar_extract_3437083150416015281_tmp b/build/tmp/test/jar_extract_3437083150416015281_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3437083150416015281_tmp differ
    diff --git a/build/tmp/test/jar_extract_3446631379996015053_tmp b/build/tmp/test/jar_extract_3446631379996015053_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3446631379996015053_tmp differ
    diff --git a/build/tmp/test/jar_extract_3452609728873505748_tmp b/build/tmp/test/jar_extract_3452609728873505748_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3452609728873505748_tmp differ
    diff --git a/build/tmp/test/jar_extract_3473004984393611592_tmp b/build/tmp/test/jar_extract_3473004984393611592_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3473004984393611592_tmp differ
    diff --git a/build/tmp/test/jar_extract_3491302286240970295_tmp b/build/tmp/test/jar_extract_3491302286240970295_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3491302286240970295_tmp differ
    diff --git a/build/tmp/test/jar_extract_3505022175069782042_tmp b/build/tmp/test/jar_extract_3505022175069782042_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3505022175069782042_tmp differ
    diff --git a/build/tmp/test/jar_extract_3511291478490069959_tmp b/build/tmp/test/jar_extract_3511291478490069959_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3511291478490069959_tmp differ
    diff --git a/build/tmp/test/jar_extract_3520900161228022703_tmp b/build/tmp/test/jar_extract_3520900161228022703_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3520900161228022703_tmp differ
    diff --git a/build/tmp/test/jar_extract_3540321429439554480_tmp b/build/tmp/test/jar_extract_3540321429439554480_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_3540321429439554480_tmp differ
    diff --git a/build/tmp/test/jar_extract_3543117679924508642_tmp b/build/tmp/test/jar_extract_3543117679924508642_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3543117679924508642_tmp differ
    diff --git a/build/tmp/test/jar_extract_3553659148114975081_tmp b/build/tmp/test/jar_extract_3553659148114975081_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3553659148114975081_tmp differ
    diff --git a/build/tmp/test/jar_extract_3567953152198045957_tmp b/build/tmp/test/jar_extract_3567953152198045957_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3567953152198045957_tmp differ
    diff --git a/build/tmp/test/jar_extract_3573004150934707316_tmp b/build/tmp/test/jar_extract_3573004150934707316_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3573004150934707316_tmp differ
    diff --git a/build/tmp/test/jar_extract_3577638616053348294_tmp b/build/tmp/test/jar_extract_3577638616053348294_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3577638616053348294_tmp differ
    diff --git a/build/tmp/test/jar_extract_3578893722428753204_tmp b/build/tmp/test/jar_extract_3578893722428753204_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3578893722428753204_tmp differ
    diff --git a/build/tmp/test/jar_extract_3585327851312205119_tmp b/build/tmp/test/jar_extract_3585327851312205119_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3585327851312205119_tmp differ
    diff --git a/build/tmp/test/jar_extract_3588814033226917791_tmp b/build/tmp/test/jar_extract_3588814033226917791_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3588814033226917791_tmp differ
    diff --git a/build/tmp/test/jar_extract_3589185278145957038_tmp b/build/tmp/test/jar_extract_3589185278145957038_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3589185278145957038_tmp differ
    diff --git a/build/tmp/test/jar_extract_3604301840038446303_tmp b/build/tmp/test/jar_extract_3604301840038446303_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3604301840038446303_tmp differ
    diff --git a/build/tmp/test/jar_extract_3610669655385663487_tmp b/build/tmp/test/jar_extract_3610669655385663487_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3610669655385663487_tmp differ
    diff --git a/build/tmp/test/jar_extract_3612081769602667941_tmp b/build/tmp/test/jar_extract_3612081769602667941_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3612081769602667941_tmp differ
    diff --git a/build/tmp/test/jar_extract_361527111224615815_tmp b/build/tmp/test/jar_extract_361527111224615815_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_361527111224615815_tmp differ
    diff --git a/build/tmp/test/jar_extract_3630118763661916589_tmp b/build/tmp/test/jar_extract_3630118763661916589_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3630118763661916589_tmp differ
    diff --git a/build/tmp/test/jar_extract_363277775175491316_tmp b/build/tmp/test/jar_extract_363277775175491316_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_363277775175491316_tmp differ
    diff --git a/build/tmp/test/jar_extract_3636708751258039752_tmp b/build/tmp/test/jar_extract_3636708751258039752_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3636708751258039752_tmp differ
    diff --git a/build/tmp/test/jar_extract_3651249366161879613_tmp b/build/tmp/test/jar_extract_3651249366161879613_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3651249366161879613_tmp differ
    diff --git a/build/tmp/test/jar_extract_3656153991883298204_tmp b/build/tmp/test/jar_extract_3656153991883298204_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3656153991883298204_tmp differ
    diff --git a/build/tmp/test/jar_extract_3663870613050665781_tmp b/build/tmp/test/jar_extract_3663870613050665781_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3663870613050665781_tmp differ
    diff --git a/build/tmp/test/jar_extract_3669352064846086393_tmp b/build/tmp/test/jar_extract_3669352064846086393_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3669352064846086393_tmp differ
    diff --git a/build/tmp/test/jar_extract_3669926808533401867_tmp b/build/tmp/test/jar_extract_3669926808533401867_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3669926808533401867_tmp differ
    diff --git a/build/tmp/test/jar_extract_3681451462508841010_tmp b/build/tmp/test/jar_extract_3681451462508841010_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3681451462508841010_tmp differ
    diff --git a/build/tmp/test/jar_extract_368963893055527754_tmp b/build/tmp/test/jar_extract_368963893055527754_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_368963893055527754_tmp differ
    diff --git a/build/tmp/test/jar_extract_369478605009977174_tmp b/build/tmp/test/jar_extract_369478605009977174_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_369478605009977174_tmp differ
    diff --git a/build/tmp/test/jar_extract_3698933264661475949_tmp b/build/tmp/test/jar_extract_3698933264661475949_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3698933264661475949_tmp differ
    diff --git a/build/tmp/test/jar_extract_3722078500321063183_tmp b/build/tmp/test/jar_extract_3722078500321063183_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3722078500321063183_tmp differ
    diff --git a/build/tmp/test/jar_extract_3730175376037018162_tmp b/build/tmp/test/jar_extract_3730175376037018162_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3730175376037018162_tmp differ
    diff --git a/build/tmp/test/jar_extract_3733122227406791725_tmp b/build/tmp/test/jar_extract_3733122227406791725_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3733122227406791725_tmp differ
    diff --git a/build/tmp/test/jar_extract_3746112004476265059_tmp b/build/tmp/test/jar_extract_3746112004476265059_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3746112004476265059_tmp differ
    diff --git a/build/tmp/test/jar_extract_3747669185746427354_tmp b/build/tmp/test/jar_extract_3747669185746427354_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3747669185746427354_tmp differ
    diff --git a/build/tmp/test/jar_extract_3765050301487581606_tmp b/build/tmp/test/jar_extract_3765050301487581606_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3765050301487581606_tmp differ
    diff --git a/build/tmp/test/jar_extract_3771255528437294232_tmp b/build/tmp/test/jar_extract_3771255528437294232_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3771255528437294232_tmp differ
    diff --git a/build/tmp/test/jar_extract_3774607492781074676_tmp b/build/tmp/test/jar_extract_3774607492781074676_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3774607492781074676_tmp differ
    diff --git a/build/tmp/test/jar_extract_3774875358157145665_tmp b/build/tmp/test/jar_extract_3774875358157145665_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3774875358157145665_tmp differ
    diff --git a/build/tmp/test/jar_extract_3777857214999044218_tmp b/build/tmp/test/jar_extract_3777857214999044218_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3777857214999044218_tmp differ
    diff --git a/build/tmp/test/jar_extract_3779945180462888012_tmp b/build/tmp/test/jar_extract_3779945180462888012_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3779945180462888012_tmp differ
    diff --git a/build/tmp/test/jar_extract_378194940717876258_tmp b/build/tmp/test/jar_extract_378194940717876258_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_378194940717876258_tmp differ
    diff --git a/build/tmp/test/jar_extract_3783711183025610112_tmp b/build/tmp/test/jar_extract_3783711183025610112_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3783711183025610112_tmp differ
    diff --git a/build/tmp/test/jar_extract_3785866361259094395_tmp b/build/tmp/test/jar_extract_3785866361259094395_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3785866361259094395_tmp differ
    diff --git a/build/tmp/test/jar_extract_3794659848072921650_tmp b/build/tmp/test/jar_extract_3794659848072921650_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3794659848072921650_tmp differ
    diff --git a/build/tmp/test/jar_extract_3800776471900871014_tmp b/build/tmp/test/jar_extract_3800776471900871014_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3800776471900871014_tmp differ
    diff --git a/build/tmp/test/jar_extract_3812936242896913917_tmp b/build/tmp/test/jar_extract_3812936242896913917_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3812936242896913917_tmp differ
    diff --git a/build/tmp/test/jar_extract_3818294711166157623_tmp b/build/tmp/test/jar_extract_3818294711166157623_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3818294711166157623_tmp differ
    diff --git a/build/tmp/test/jar_extract_3831440650205597466_tmp b/build/tmp/test/jar_extract_3831440650205597466_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3831440650205597466_tmp differ
    diff --git a/build/tmp/test/jar_extract_3834878990333807779_tmp b/build/tmp/test/jar_extract_3834878990333807779_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3834878990333807779_tmp differ
    diff --git a/build/tmp/test/jar_extract_3836895529167174860_tmp b/build/tmp/test/jar_extract_3836895529167174860_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3836895529167174860_tmp differ
    diff --git a/build/tmp/test/jar_extract_3840508511835186027_tmp b/build/tmp/test/jar_extract_3840508511835186027_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3840508511835186027_tmp differ
    diff --git a/build/tmp/test/jar_extract_3853477639726759319_tmp b/build/tmp/test/jar_extract_3853477639726759319_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3853477639726759319_tmp differ
    diff --git a/build/tmp/test/jar_extract_3864459721824223911_tmp b/build/tmp/test/jar_extract_3864459721824223911_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3864459721824223911_tmp differ
    diff --git a/build/tmp/test/jar_extract_3865821136501246229_tmp b/build/tmp/test/jar_extract_3865821136501246229_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3865821136501246229_tmp differ
    diff --git a/build/tmp/test/jar_extract_3870265861188024670_tmp b/build/tmp/test/jar_extract_3870265861188024670_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3870265861188024670_tmp differ
    diff --git a/build/tmp/test/jar_extract_3874079159653628917_tmp b/build/tmp/test/jar_extract_3874079159653628917_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3874079159653628917_tmp differ
    diff --git a/build/tmp/test/jar_extract_3874730700981653284_tmp b/build/tmp/test/jar_extract_3874730700981653284_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3874730700981653284_tmp differ
    diff --git a/build/tmp/test/jar_extract_3880288034790999843_tmp b/build/tmp/test/jar_extract_3880288034790999843_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3880288034790999843_tmp differ
    diff --git a/build/tmp/test/jar_extract_3880915890131984618_tmp b/build/tmp/test/jar_extract_3880915890131984618_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3880915890131984618_tmp differ
    diff --git a/build/tmp/test/jar_extract_3884002435843455152_tmp b/build/tmp/test/jar_extract_3884002435843455152_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3884002435843455152_tmp differ
    diff --git a/build/tmp/test/jar_extract_388883624410203978_tmp b/build/tmp/test/jar_extract_388883624410203978_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_388883624410203978_tmp differ
    diff --git a/build/tmp/test/jar_extract_3896218855756637542_tmp b/build/tmp/test/jar_extract_3896218855756637542_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3896218855756637542_tmp differ
    diff --git a/build/tmp/test/jar_extract_3897078279512469474_tmp b/build/tmp/test/jar_extract_3897078279512469474_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3897078279512469474_tmp differ
    diff --git a/build/tmp/test/jar_extract_3905242679635303799_tmp b/build/tmp/test/jar_extract_3905242679635303799_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3905242679635303799_tmp differ
    diff --git a/build/tmp/test/jar_extract_3932739572951614522_tmp b/build/tmp/test/jar_extract_3932739572951614522_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3932739572951614522_tmp differ
    diff --git a/build/tmp/test/jar_extract_3944961466105419078_tmp b/build/tmp/test/jar_extract_3944961466105419078_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3944961466105419078_tmp differ
    diff --git a/build/tmp/test/jar_extract_3956703640562422572_tmp b/build/tmp/test/jar_extract_3956703640562422572_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3956703640562422572_tmp differ
    diff --git a/build/tmp/test/jar_extract_3965751795822345889_tmp b/build/tmp/test/jar_extract_3965751795822345889_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3965751795822345889_tmp differ
    diff --git a/build/tmp/test/jar_extract_396786696071046743_tmp b/build/tmp/test/jar_extract_396786696071046743_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_396786696071046743_tmp differ
    diff --git a/build/tmp/test/jar_extract_3987573322017159959_tmp b/build/tmp/test/jar_extract_3987573322017159959_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_3987573322017159959_tmp differ
    diff --git a/build/tmp/test/jar_extract_4002607641720358954_tmp b/build/tmp/test/jar_extract_4002607641720358954_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4002607641720358954_tmp differ
    diff --git a/build/tmp/test/jar_extract_4008517792606084219_tmp b/build/tmp/test/jar_extract_4008517792606084219_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4008517792606084219_tmp differ
    diff --git a/build/tmp/test/jar_extract_400856292850267778_tmp b/build/tmp/test/jar_extract_400856292850267778_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_400856292850267778_tmp differ
    diff --git a/build/tmp/test/jar_extract_4016955477783161800_tmp b/build/tmp/test/jar_extract_4016955477783161800_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4016955477783161800_tmp differ
    diff --git a/build/tmp/test/jar_extract_4026984577009773037_tmp b/build/tmp/test/jar_extract_4026984577009773037_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4026984577009773037_tmp differ
    diff --git a/build/tmp/test/jar_extract_4037177349916284139_tmp b/build/tmp/test/jar_extract_4037177349916284139_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4037177349916284139_tmp differ
    diff --git a/build/tmp/test/jar_extract_404005120794536826_tmp b/build/tmp/test/jar_extract_404005120794536826_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_404005120794536826_tmp differ
    diff --git a/build/tmp/test/jar_extract_4042262173275009099_tmp b/build/tmp/test/jar_extract_4042262173275009099_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4042262173275009099_tmp differ
    diff --git a/build/tmp/test/jar_extract_4053939029293996165_tmp b/build/tmp/test/jar_extract_4053939029293996165_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4053939029293996165_tmp differ
    diff --git a/build/tmp/test/jar_extract_4058412957294536791_tmp b/build/tmp/test/jar_extract_4058412957294536791_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4058412957294536791_tmp differ
    diff --git a/build/tmp/test/jar_extract_4059362537159403111_tmp b/build/tmp/test/jar_extract_4059362537159403111_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4059362537159403111_tmp differ
    diff --git a/build/tmp/test/jar_extract_4083272942671570932_tmp b/build/tmp/test/jar_extract_4083272942671570932_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4083272942671570932_tmp differ
    diff --git a/build/tmp/test/jar_extract_4086405968909551695_tmp b/build/tmp/test/jar_extract_4086405968909551695_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4086405968909551695_tmp differ
    diff --git a/build/tmp/test/jar_extract_4095170882751530839_tmp b/build/tmp/test/jar_extract_4095170882751530839_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4095170882751530839_tmp differ
    diff --git a/build/tmp/test/jar_extract_409553347477392246_tmp b/build/tmp/test/jar_extract_409553347477392246_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_409553347477392246_tmp differ
    diff --git a/build/tmp/test/jar_extract_4099211706178924836_tmp b/build/tmp/test/jar_extract_4099211706178924836_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4099211706178924836_tmp differ
    diff --git a/build/tmp/test/jar_extract_4107014408664628132_tmp b/build/tmp/test/jar_extract_4107014408664628132_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4107014408664628132_tmp differ
    diff --git a/build/tmp/test/jar_extract_4123334634995003913_tmp b/build/tmp/test/jar_extract_4123334634995003913_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4123334634995003913_tmp differ
    diff --git a/build/tmp/test/jar_extract_4124667388675093385_tmp b/build/tmp/test/jar_extract_4124667388675093385_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4124667388675093385_tmp differ
    diff --git a/build/tmp/test/jar_extract_413024905139550621_tmp b/build/tmp/test/jar_extract_413024905139550621_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_413024905139550621_tmp differ
    diff --git a/build/tmp/test/jar_extract_4143336897748465156_tmp b/build/tmp/test/jar_extract_4143336897748465156_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4143336897748465156_tmp differ
    diff --git a/build/tmp/test/jar_extract_4154851720019158690_tmp b/build/tmp/test/jar_extract_4154851720019158690_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4154851720019158690_tmp differ
    diff --git a/build/tmp/test/jar_extract_4159862929279322365_tmp b/build/tmp/test/jar_extract_4159862929279322365_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4159862929279322365_tmp differ
    diff --git a/build/tmp/test/jar_extract_4165256006510656683_tmp b/build/tmp/test/jar_extract_4165256006510656683_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4165256006510656683_tmp differ
    diff --git a/build/tmp/test/jar_extract_4167423034155741365_tmp b/build/tmp/test/jar_extract_4167423034155741365_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4167423034155741365_tmp differ
    diff --git a/build/tmp/test/jar_extract_417135258491540408_tmp b/build/tmp/test/jar_extract_417135258491540408_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_417135258491540408_tmp differ
    diff --git a/build/tmp/test/jar_extract_4171787229694175490_tmp b/build/tmp/test/jar_extract_4171787229694175490_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4171787229694175490_tmp differ
    diff --git a/build/tmp/test/jar_extract_4175760764350384820_tmp b/build/tmp/test/jar_extract_4175760764350384820_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4175760764350384820_tmp differ
    diff --git a/build/tmp/test/jar_extract_4188200951673649299_tmp b/build/tmp/test/jar_extract_4188200951673649299_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4188200951673649299_tmp differ
    diff --git a/build/tmp/test/jar_extract_4198464047998551640_tmp b/build/tmp/test/jar_extract_4198464047998551640_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4198464047998551640_tmp differ
    diff --git a/build/tmp/test/jar_extract_4211970848150437496_tmp b/build/tmp/test/jar_extract_4211970848150437496_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4211970848150437496_tmp differ
    diff --git a/build/tmp/test/jar_extract_4213000903243179988_tmp b/build/tmp/test/jar_extract_4213000903243179988_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4213000903243179988_tmp differ
    diff --git a/build/tmp/test/jar_extract_4224228684512303276_tmp b/build/tmp/test/jar_extract_4224228684512303276_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4224228684512303276_tmp differ
    diff --git a/build/tmp/test/jar_extract_4232537965273667296_tmp b/build/tmp/test/jar_extract_4232537965273667296_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4232537965273667296_tmp differ
    diff --git a/build/tmp/test/jar_extract_423824776949663073_tmp b/build/tmp/test/jar_extract_423824776949663073_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_423824776949663073_tmp differ
    diff --git a/build/tmp/test/jar_extract_4241512356537057115_tmp b/build/tmp/test/jar_extract_4241512356537057115_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4241512356537057115_tmp differ
    diff --git a/build/tmp/test/jar_extract_4249196738042380001_tmp b/build/tmp/test/jar_extract_4249196738042380001_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4249196738042380001_tmp differ
    diff --git a/build/tmp/test/jar_extract_4257084778464104686_tmp b/build/tmp/test/jar_extract_4257084778464104686_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4257084778464104686_tmp differ
    diff --git a/build/tmp/test/jar_extract_4274219209299745206_tmp b/build/tmp/test/jar_extract_4274219209299745206_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4274219209299745206_tmp differ
    diff --git a/build/tmp/test/jar_extract_4278717050686886234_tmp b/build/tmp/test/jar_extract_4278717050686886234_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4278717050686886234_tmp differ
    diff --git a/build/tmp/test/jar_extract_4284595193562532035_tmp b/build/tmp/test/jar_extract_4284595193562532035_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4284595193562532035_tmp differ
    diff --git a/build/tmp/test/jar_extract_4294191881320421805_tmp b/build/tmp/test/jar_extract_4294191881320421805_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4294191881320421805_tmp differ
    diff --git a/build/tmp/test/jar_extract_430034849958385644_tmp b/build/tmp/test/jar_extract_430034849958385644_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_430034849958385644_tmp differ
    diff --git a/build/tmp/test/jar_extract_4312493413729174278_tmp b/build/tmp/test/jar_extract_4312493413729174278_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4312493413729174278_tmp differ
    diff --git a/build/tmp/test/jar_extract_4313414109324024625_tmp b/build/tmp/test/jar_extract_4313414109324024625_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4313414109324024625_tmp differ
    diff --git a/build/tmp/test/jar_extract_4325481973317087935_tmp b/build/tmp/test/jar_extract_4325481973317087935_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4325481973317087935_tmp differ
    diff --git a/build/tmp/test/jar_extract_4328481091330179523_tmp b/build/tmp/test/jar_extract_4328481091330179523_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4328481091330179523_tmp differ
    diff --git a/build/tmp/test/jar_extract_4329797886696040323_tmp b/build/tmp/test/jar_extract_4329797886696040323_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4329797886696040323_tmp differ
    diff --git a/build/tmp/test/jar_extract_4330588293483698455_tmp b/build/tmp/test/jar_extract_4330588293483698455_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4330588293483698455_tmp differ
    diff --git a/build/tmp/test/jar_extract_4336295749648905153_tmp b/build/tmp/test/jar_extract_4336295749648905153_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4336295749648905153_tmp differ
    diff --git a/build/tmp/test/jar_extract_4337474078157429162_tmp b/build/tmp/test/jar_extract_4337474078157429162_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4337474078157429162_tmp differ
    diff --git a/build/tmp/test/jar_extract_4338910353284812632_tmp b/build/tmp/test/jar_extract_4338910353284812632_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4338910353284812632_tmp differ
    diff --git a/build/tmp/test/jar_extract_4339193803925288582_tmp b/build/tmp/test/jar_extract_4339193803925288582_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4339193803925288582_tmp differ
    diff --git a/build/tmp/test/jar_extract_4340356601386943745_tmp b/build/tmp/test/jar_extract_4340356601386943745_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4340356601386943745_tmp differ
    diff --git a/build/tmp/test/jar_extract_434791427797022651_tmp b/build/tmp/test/jar_extract_434791427797022651_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_434791427797022651_tmp differ
    diff --git a/build/tmp/test/jar_extract_434816376869378579_tmp b/build/tmp/test/jar_extract_434816376869378579_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_434816376869378579_tmp differ
    diff --git a/build/tmp/test/jar_extract_436630184934520861_tmp b/build/tmp/test/jar_extract_436630184934520861_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_436630184934520861_tmp differ
    diff --git a/build/tmp/test/jar_extract_4370664702798475701_tmp b/build/tmp/test/jar_extract_4370664702798475701_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4370664702798475701_tmp differ
    diff --git a/build/tmp/test/jar_extract_4374702407252223286_tmp b/build/tmp/test/jar_extract_4374702407252223286_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4374702407252223286_tmp differ
    diff --git a/build/tmp/test/jar_extract_4375573383107176708_tmp b/build/tmp/test/jar_extract_4375573383107176708_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4375573383107176708_tmp differ
    diff --git a/build/tmp/test/jar_extract_4376668602431408171_tmp b/build/tmp/test/jar_extract_4376668602431408171_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4376668602431408171_tmp differ
    diff --git a/build/tmp/test/jar_extract_438216330015618844_tmp b/build/tmp/test/jar_extract_438216330015618844_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_438216330015618844_tmp differ
    diff --git a/build/tmp/test/jar_extract_4387571099860878164_tmp b/build/tmp/test/jar_extract_4387571099860878164_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4387571099860878164_tmp differ
    diff --git a/build/tmp/test/jar_extract_4392965784208485634_tmp b/build/tmp/test/jar_extract_4392965784208485634_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4392965784208485634_tmp differ
    diff --git a/build/tmp/test/jar_extract_4394979429881694875_tmp b/build/tmp/test/jar_extract_4394979429881694875_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4394979429881694875_tmp differ
    diff --git a/build/tmp/test/jar_extract_4409588924947389421_tmp b/build/tmp/test/jar_extract_4409588924947389421_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4409588924947389421_tmp differ
    diff --git a/build/tmp/test/jar_extract_4418226333698937920_tmp b/build/tmp/test/jar_extract_4418226333698937920_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4418226333698937920_tmp differ
    diff --git a/build/tmp/test/jar_extract_4423203469644357034_tmp b/build/tmp/test/jar_extract_4423203469644357034_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4423203469644357034_tmp differ
    diff --git a/build/tmp/test/jar_extract_4423679602649609968_tmp b/build/tmp/test/jar_extract_4423679602649609968_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4423679602649609968_tmp differ
    diff --git a/build/tmp/test/jar_extract_4424766638382872485_tmp b/build/tmp/test/jar_extract_4424766638382872485_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4424766638382872485_tmp differ
    diff --git a/build/tmp/test/jar_extract_4435648424490177817_tmp b/build/tmp/test/jar_extract_4435648424490177817_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4435648424490177817_tmp differ
    diff --git a/build/tmp/test/jar_extract_4436406983644492302_tmp b/build/tmp/test/jar_extract_4436406983644492302_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4436406983644492302_tmp differ
    diff --git a/build/tmp/test/jar_extract_4447784011163667125_tmp b/build/tmp/test/jar_extract_4447784011163667125_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4447784011163667125_tmp differ
    diff --git a/build/tmp/test/jar_extract_4449957518670206116_tmp b/build/tmp/test/jar_extract_4449957518670206116_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4449957518670206116_tmp differ
    diff --git a/build/tmp/test/jar_extract_4454868374510021243_tmp b/build/tmp/test/jar_extract_4454868374510021243_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4454868374510021243_tmp differ
    diff --git a/build/tmp/test/jar_extract_4456117837642983917_tmp b/build/tmp/test/jar_extract_4456117837642983917_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4456117837642983917_tmp differ
    diff --git a/build/tmp/test/jar_extract_446038940536475967_tmp b/build/tmp/test/jar_extract_446038940536475967_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_446038940536475967_tmp differ
    diff --git a/build/tmp/test/jar_extract_4461553743811980908_tmp b/build/tmp/test/jar_extract_4461553743811980908_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4461553743811980908_tmp differ
    diff --git a/build/tmp/test/jar_extract_4476456597986676762_tmp b/build/tmp/test/jar_extract_4476456597986676762_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4476456597986676762_tmp differ
    diff --git a/build/tmp/test/jar_extract_4476711389432112199_tmp b/build/tmp/test/jar_extract_4476711389432112199_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4476711389432112199_tmp differ
    diff --git a/build/tmp/test/jar_extract_4479495475832676000_tmp b/build/tmp/test/jar_extract_4479495475832676000_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4479495475832676000_tmp differ
    diff --git a/build/tmp/test/jar_extract_4485219118663845950_tmp b/build/tmp/test/jar_extract_4485219118663845950_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4485219118663845950_tmp differ
    diff --git a/build/tmp/test/jar_extract_4497044272253374378_tmp b/build/tmp/test/jar_extract_4497044272253374378_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4497044272253374378_tmp differ
    diff --git a/build/tmp/test/jar_extract_4498918798765309155_tmp b/build/tmp/test/jar_extract_4498918798765309155_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4498918798765309155_tmp differ
    diff --git a/build/tmp/test/jar_extract_4503899605397066497_tmp b/build/tmp/test/jar_extract_4503899605397066497_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4503899605397066497_tmp differ
    diff --git a/build/tmp/test/jar_extract_4509319732322506038_tmp b/build/tmp/test/jar_extract_4509319732322506038_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4509319732322506038_tmp differ
    diff --git a/build/tmp/test/jar_extract_4519237553782026610_tmp b/build/tmp/test/jar_extract_4519237553782026610_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4519237553782026610_tmp differ
    diff --git a/build/tmp/test/jar_extract_4519601457711751942_tmp b/build/tmp/test/jar_extract_4519601457711751942_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4519601457711751942_tmp differ
    diff --git a/build/tmp/test/jar_extract_4535974671081325249_tmp b/build/tmp/test/jar_extract_4535974671081325249_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4535974671081325249_tmp differ
    diff --git a/build/tmp/test/jar_extract_4536057460848160284_tmp b/build/tmp/test/jar_extract_4536057460848160284_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4536057460848160284_tmp differ
    diff --git a/build/tmp/test/jar_extract_4537857493615076304_tmp b/build/tmp/test/jar_extract_4537857493615076304_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4537857493615076304_tmp differ
    diff --git a/build/tmp/test/jar_extract_4537877954540401708_tmp b/build/tmp/test/jar_extract_4537877954540401708_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4537877954540401708_tmp differ
    diff --git a/build/tmp/test/jar_extract_4541315653312474760_tmp b/build/tmp/test/jar_extract_4541315653312474760_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4541315653312474760_tmp differ
    diff --git a/build/tmp/test/jar_extract_4558247331321191104_tmp b/build/tmp/test/jar_extract_4558247331321191104_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4558247331321191104_tmp differ
    diff --git a/build/tmp/test/jar_extract_4559160699825123611_tmp b/build/tmp/test/jar_extract_4559160699825123611_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4559160699825123611_tmp differ
    diff --git a/build/tmp/test/jar_extract_4560404058004730182_tmp b/build/tmp/test/jar_extract_4560404058004730182_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4560404058004730182_tmp differ
    diff --git a/build/tmp/test/jar_extract_4562946342965617908_tmp b/build/tmp/test/jar_extract_4562946342965617908_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4562946342965617908_tmp differ
    diff --git a/build/tmp/test/jar_extract_4567227593788950411_tmp b/build/tmp/test/jar_extract_4567227593788950411_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4567227593788950411_tmp differ
    diff --git a/build/tmp/test/jar_extract_4573188295437102875_tmp b/build/tmp/test/jar_extract_4573188295437102875_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4573188295437102875_tmp differ
    diff --git a/build/tmp/test/jar_extract_4582442862798899404_tmp b/build/tmp/test/jar_extract_4582442862798899404_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4582442862798899404_tmp differ
    diff --git a/build/tmp/test/jar_extract_4600302210701123991_tmp b/build/tmp/test/jar_extract_4600302210701123991_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4600302210701123991_tmp differ
    diff --git a/build/tmp/test/jar_extract_4609140773170519217_tmp b/build/tmp/test/jar_extract_4609140773170519217_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4609140773170519217_tmp differ
    diff --git a/build/tmp/test/jar_extract_4623402860974510616_tmp b/build/tmp/test/jar_extract_4623402860974510616_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4623402860974510616_tmp differ
    diff --git a/build/tmp/test/jar_extract_4624509392764865061_tmp b/build/tmp/test/jar_extract_4624509392764865061_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4624509392764865061_tmp differ
    diff --git a/build/tmp/test/jar_extract_4635674432112811442_tmp b/build/tmp/test/jar_extract_4635674432112811442_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4635674432112811442_tmp differ
    diff --git a/build/tmp/test/jar_extract_465885271691066892_tmp b/build/tmp/test/jar_extract_465885271691066892_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_465885271691066892_tmp differ
    diff --git a/build/tmp/test/jar_extract_4668618378373967411_tmp b/build/tmp/test/jar_extract_4668618378373967411_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4668618378373967411_tmp differ
    diff --git a/build/tmp/test/jar_extract_4685576310664420337_tmp b/build/tmp/test/jar_extract_4685576310664420337_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4685576310664420337_tmp differ
    diff --git a/build/tmp/test/jar_extract_4687643739957180704_tmp b/build/tmp/test/jar_extract_4687643739957180704_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4687643739957180704_tmp differ
    diff --git a/build/tmp/test/jar_extract_4689943156151062173_tmp b/build/tmp/test/jar_extract_4689943156151062173_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4689943156151062173_tmp differ
    diff --git a/build/tmp/test/jar_extract_470347270186313627_tmp b/build/tmp/test/jar_extract_470347270186313627_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_470347270186313627_tmp differ
    diff --git a/build/tmp/test/jar_extract_4706251356768280853_tmp b/build/tmp/test/jar_extract_4706251356768280853_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4706251356768280853_tmp differ
    diff --git a/build/tmp/test/jar_extract_4707603833759094950_tmp b/build/tmp/test/jar_extract_4707603833759094950_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4707603833759094950_tmp differ
    diff --git a/build/tmp/test/jar_extract_4711382045127355444_tmp b/build/tmp/test/jar_extract_4711382045127355444_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4711382045127355444_tmp differ
    diff --git a/build/tmp/test/jar_extract_4722678749674557191_tmp b/build/tmp/test/jar_extract_4722678749674557191_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4722678749674557191_tmp differ
    diff --git a/build/tmp/test/jar_extract_4730069933859807704_tmp b/build/tmp/test/jar_extract_4730069933859807704_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4730069933859807704_tmp differ
    diff --git a/build/tmp/test/jar_extract_4734512895366842609_tmp b/build/tmp/test/jar_extract_4734512895366842609_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4734512895366842609_tmp differ
    diff --git a/build/tmp/test/jar_extract_4755340340435373823_tmp b/build/tmp/test/jar_extract_4755340340435373823_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4755340340435373823_tmp differ
    diff --git a/build/tmp/test/jar_extract_4758802236723679233_tmp b/build/tmp/test/jar_extract_4758802236723679233_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4758802236723679233_tmp differ
    diff --git a/build/tmp/test/jar_extract_4758956645524805581_tmp b/build/tmp/test/jar_extract_4758956645524805581_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4758956645524805581_tmp differ
    diff --git a/build/tmp/test/jar_extract_4763601701960459968_tmp b/build/tmp/test/jar_extract_4763601701960459968_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4763601701960459968_tmp differ
    diff --git a/build/tmp/test/jar_extract_4763976642102795970_tmp b/build/tmp/test/jar_extract_4763976642102795970_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4763976642102795970_tmp differ
    diff --git a/build/tmp/test/jar_extract_4765157674797372549_tmp b/build/tmp/test/jar_extract_4765157674797372549_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4765157674797372549_tmp differ
    diff --git a/build/tmp/test/jar_extract_4768833440840571820_tmp b/build/tmp/test/jar_extract_4768833440840571820_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_4768833440840571820_tmp differ
    diff --git a/build/tmp/test/jar_extract_4769175357942600905_tmp b/build/tmp/test/jar_extract_4769175357942600905_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4769175357942600905_tmp differ
    diff --git a/build/tmp/test/jar_extract_4772995770587229266_tmp b/build/tmp/test/jar_extract_4772995770587229266_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4772995770587229266_tmp differ
    diff --git a/build/tmp/test/jar_extract_4777656081084371754_tmp b/build/tmp/test/jar_extract_4777656081084371754_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4777656081084371754_tmp differ
    diff --git a/build/tmp/test/jar_extract_4778294891430201998_tmp b/build/tmp/test/jar_extract_4778294891430201998_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4778294891430201998_tmp differ
    diff --git a/build/tmp/test/jar_extract_478865221948674289_tmp b/build/tmp/test/jar_extract_478865221948674289_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_478865221948674289_tmp differ
    diff --git a/build/tmp/test/jar_extract_4795039185639153038_tmp b/build/tmp/test/jar_extract_4795039185639153038_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4795039185639153038_tmp differ
    diff --git a/build/tmp/test/jar_extract_4821372806442880810_tmp b/build/tmp/test/jar_extract_4821372806442880810_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4821372806442880810_tmp differ
    diff --git a/build/tmp/test/jar_extract_4832091118646519016_tmp b/build/tmp/test/jar_extract_4832091118646519016_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4832091118646519016_tmp differ
    diff --git a/build/tmp/test/jar_extract_4832568751285063832_tmp b/build/tmp/test/jar_extract_4832568751285063832_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4832568751285063832_tmp differ
    diff --git a/build/tmp/test/jar_extract_4846224904001096276_tmp b/build/tmp/test/jar_extract_4846224904001096276_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4846224904001096276_tmp differ
    diff --git a/build/tmp/test/jar_extract_4858924190908271557_tmp b/build/tmp/test/jar_extract_4858924190908271557_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4858924190908271557_tmp differ
    diff --git a/build/tmp/test/jar_extract_4860694662851213519_tmp b/build/tmp/test/jar_extract_4860694662851213519_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4860694662851213519_tmp differ
    diff --git a/build/tmp/test/jar_extract_4867569062429751187_tmp b/build/tmp/test/jar_extract_4867569062429751187_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4867569062429751187_tmp differ
    diff --git a/build/tmp/test/jar_extract_4870067621746434862_tmp b/build/tmp/test/jar_extract_4870067621746434862_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_4870067621746434862_tmp differ
    diff --git a/build/tmp/test/jar_extract_487502677915809599_tmp b/build/tmp/test/jar_extract_487502677915809599_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_487502677915809599_tmp differ
    diff --git a/build/tmp/test/jar_extract_4875249260224084901_tmp b/build/tmp/test/jar_extract_4875249260224084901_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4875249260224084901_tmp differ
    diff --git a/build/tmp/test/jar_extract_4890359854582688145_tmp b/build/tmp/test/jar_extract_4890359854582688145_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4890359854582688145_tmp differ
    diff --git a/build/tmp/test/jar_extract_4893024033617749165_tmp b/build/tmp/test/jar_extract_4893024033617749165_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4893024033617749165_tmp differ
    diff --git a/build/tmp/test/jar_extract_4921187996410858261_tmp b/build/tmp/test/jar_extract_4921187996410858261_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4921187996410858261_tmp differ
    diff --git a/build/tmp/test/jar_extract_4924668814357582893_tmp b/build/tmp/test/jar_extract_4924668814357582893_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4924668814357582893_tmp differ
    diff --git a/build/tmp/test/jar_extract_4925279087888811014_tmp b/build/tmp/test/jar_extract_4925279087888811014_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4925279087888811014_tmp differ
    diff --git a/build/tmp/test/jar_extract_4930689349081092341_tmp b/build/tmp/test/jar_extract_4930689349081092341_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4930689349081092341_tmp differ
    diff --git a/build/tmp/test/jar_extract_4940227079843724335_tmp b/build/tmp/test/jar_extract_4940227079843724335_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4940227079843724335_tmp differ
    diff --git a/build/tmp/test/jar_extract_4946965964875254587_tmp b/build/tmp/test/jar_extract_4946965964875254587_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4946965964875254587_tmp differ
    diff --git a/build/tmp/test/jar_extract_4954888658247361159_tmp b/build/tmp/test/jar_extract_4954888658247361159_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4954888658247361159_tmp differ
    diff --git a/build/tmp/test/jar_extract_4960365172113234527_tmp b/build/tmp/test/jar_extract_4960365172113234527_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4960365172113234527_tmp differ
    diff --git a/build/tmp/test/jar_extract_4962762252303354980_tmp b/build/tmp/test/jar_extract_4962762252303354980_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4962762252303354980_tmp differ
    diff --git a/build/tmp/test/jar_extract_4965216228364342610_tmp b/build/tmp/test/jar_extract_4965216228364342610_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4965216228364342610_tmp differ
    diff --git a/build/tmp/test/jar_extract_4971299813323444398_tmp b/build/tmp/test/jar_extract_4971299813323444398_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4971299813323444398_tmp differ
    diff --git a/build/tmp/test/jar_extract_498349328905756691_tmp b/build/tmp/test/jar_extract_498349328905756691_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_498349328905756691_tmp differ
    diff --git a/build/tmp/test/jar_extract_4984879068154361377_tmp b/build/tmp/test/jar_extract_4984879068154361377_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_4984879068154361377_tmp differ
    diff --git a/build/tmp/test/jar_extract_4997190993451414809_tmp b/build/tmp/test/jar_extract_4997190993451414809_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_4997190993451414809_tmp differ
    diff --git a/build/tmp/test/jar_extract_5006797631724534974_tmp b/build/tmp/test/jar_extract_5006797631724534974_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5006797631724534974_tmp differ
    diff --git a/build/tmp/test/jar_extract_5007744454253453665_tmp b/build/tmp/test/jar_extract_5007744454253453665_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5007744454253453665_tmp differ
    diff --git a/build/tmp/test/jar_extract_5016736936433703927_tmp b/build/tmp/test/jar_extract_5016736936433703927_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5016736936433703927_tmp differ
    diff --git a/build/tmp/test/jar_extract_5028407821451425918_tmp b/build/tmp/test/jar_extract_5028407821451425918_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5028407821451425918_tmp differ
    diff --git a/build/tmp/test/jar_extract_5044266257275222479_tmp b/build/tmp/test/jar_extract_5044266257275222479_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5044266257275222479_tmp differ
    diff --git a/build/tmp/test/jar_extract_5052976637770615914_tmp b/build/tmp/test/jar_extract_5052976637770615914_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5052976637770615914_tmp differ
    diff --git a/build/tmp/test/jar_extract_5056126550263224394_tmp b/build/tmp/test/jar_extract_5056126550263224394_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5056126550263224394_tmp differ
    diff --git a/build/tmp/test/jar_extract_5071574532929710916_tmp b/build/tmp/test/jar_extract_5071574532929710916_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5071574532929710916_tmp differ
    diff --git a/build/tmp/test/jar_extract_5082066306897956802_tmp b/build/tmp/test/jar_extract_5082066306897956802_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5082066306897956802_tmp differ
    diff --git a/build/tmp/test/jar_extract_5092387286680840949_tmp b/build/tmp/test/jar_extract_5092387286680840949_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5092387286680840949_tmp differ
    diff --git a/build/tmp/test/jar_extract_5097097298578138570_tmp b/build/tmp/test/jar_extract_5097097298578138570_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5097097298578138570_tmp differ
    diff --git a/build/tmp/test/jar_extract_5097477659263192503_tmp b/build/tmp/test/jar_extract_5097477659263192503_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5097477659263192503_tmp differ
    diff --git a/build/tmp/test/jar_extract_5098177959556443317_tmp b/build/tmp/test/jar_extract_5098177959556443317_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5098177959556443317_tmp differ
    diff --git a/build/tmp/test/jar_extract_5108186279577691372_tmp b/build/tmp/test/jar_extract_5108186279577691372_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5108186279577691372_tmp differ
    diff --git a/build/tmp/test/jar_extract_5114856620250384970_tmp b/build/tmp/test/jar_extract_5114856620250384970_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5114856620250384970_tmp differ
    diff --git a/build/tmp/test/jar_extract_5119127855083863719_tmp b/build/tmp/test/jar_extract_5119127855083863719_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5119127855083863719_tmp differ
    diff --git a/build/tmp/test/jar_extract_5121016950717307903_tmp b/build/tmp/test/jar_extract_5121016950717307903_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5121016950717307903_tmp differ
    diff --git a/build/tmp/test/jar_extract_5126425710984543556_tmp b/build/tmp/test/jar_extract_5126425710984543556_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5126425710984543556_tmp differ
    diff --git a/build/tmp/test/jar_extract_5131095200471771800_tmp b/build/tmp/test/jar_extract_5131095200471771800_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5131095200471771800_tmp differ
    diff --git a/build/tmp/test/jar_extract_5159460847560344858_tmp b/build/tmp/test/jar_extract_5159460847560344858_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5159460847560344858_tmp differ
    diff --git a/build/tmp/test/jar_extract_5163947724019852179_tmp b/build/tmp/test/jar_extract_5163947724019852179_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5163947724019852179_tmp differ
    diff --git a/build/tmp/test/jar_extract_5164148103650049427_tmp b/build/tmp/test/jar_extract_5164148103650049427_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5164148103650049427_tmp differ
    diff --git a/build/tmp/test/jar_extract_518103652642354841_tmp b/build/tmp/test/jar_extract_518103652642354841_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_518103652642354841_tmp differ
    diff --git a/build/tmp/test/jar_extract_5181863684886504305_tmp b/build/tmp/test/jar_extract_5181863684886504305_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5181863684886504305_tmp differ
    diff --git a/build/tmp/test/jar_extract_5182046646970662168_tmp b/build/tmp/test/jar_extract_5182046646970662168_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5182046646970662168_tmp differ
    diff --git a/build/tmp/test/jar_extract_5202983566631446991_tmp b/build/tmp/test/jar_extract_5202983566631446991_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5202983566631446991_tmp differ
    diff --git a/build/tmp/test/jar_extract_5205546785796908057_tmp b/build/tmp/test/jar_extract_5205546785796908057_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5205546785796908057_tmp differ
    diff --git a/build/tmp/test/jar_extract_5218458768294913809_tmp b/build/tmp/test/jar_extract_5218458768294913809_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5218458768294913809_tmp differ
    diff --git a/build/tmp/test/jar_extract_5234390843158594186_tmp b/build/tmp/test/jar_extract_5234390843158594186_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5234390843158594186_tmp differ
    diff --git a/build/tmp/test/jar_extract_5241158181565936641_tmp b/build/tmp/test/jar_extract_5241158181565936641_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5241158181565936641_tmp differ
    diff --git a/build/tmp/test/jar_extract_5248489214262041141_tmp b/build/tmp/test/jar_extract_5248489214262041141_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5248489214262041141_tmp differ
    diff --git a/build/tmp/test/jar_extract_5258799017162440081_tmp b/build/tmp/test/jar_extract_5258799017162440081_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5258799017162440081_tmp differ
    diff --git a/build/tmp/test/jar_extract_5259984594062773396_tmp b/build/tmp/test/jar_extract_5259984594062773396_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5259984594062773396_tmp differ
    diff --git a/build/tmp/test/jar_extract_5271209353205448668_tmp b/build/tmp/test/jar_extract_5271209353205448668_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5271209353205448668_tmp differ
    diff --git a/build/tmp/test/jar_extract_528422984825273819_tmp b/build/tmp/test/jar_extract_528422984825273819_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_528422984825273819_tmp differ
    diff --git a/build/tmp/test/jar_extract_5287280790818720747_tmp b/build/tmp/test/jar_extract_5287280790818720747_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5287280790818720747_tmp differ
    diff --git a/build/tmp/test/jar_extract_5291603405055138991_tmp b/build/tmp/test/jar_extract_5291603405055138991_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5291603405055138991_tmp differ
    diff --git a/build/tmp/test/jar_extract_5307428554320053356_tmp b/build/tmp/test/jar_extract_5307428554320053356_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5307428554320053356_tmp differ
    diff --git a/build/tmp/test/jar_extract_5316007887669892415_tmp b/build/tmp/test/jar_extract_5316007887669892415_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5316007887669892415_tmp differ
    diff --git a/build/tmp/test/jar_extract_5324468218952704101_tmp b/build/tmp/test/jar_extract_5324468218952704101_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5324468218952704101_tmp differ
    diff --git a/build/tmp/test/jar_extract_5324617547527997283_tmp b/build/tmp/test/jar_extract_5324617547527997283_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5324617547527997283_tmp differ
    diff --git a/build/tmp/test/jar_extract_5328273517813628922_tmp b/build/tmp/test/jar_extract_5328273517813628922_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5328273517813628922_tmp differ
    diff --git a/build/tmp/test/jar_extract_5328334074299943822_tmp b/build/tmp/test/jar_extract_5328334074299943822_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5328334074299943822_tmp differ
    diff --git a/build/tmp/test/jar_extract_5328811131964177183_tmp b/build/tmp/test/jar_extract_5328811131964177183_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_5328811131964177183_tmp differ
    diff --git a/build/tmp/test/jar_extract_5329576730552972426_tmp b/build/tmp/test/jar_extract_5329576730552972426_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5329576730552972426_tmp differ
    diff --git a/build/tmp/test/jar_extract_5330745767715973366_tmp b/build/tmp/test/jar_extract_5330745767715973366_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5330745767715973366_tmp differ
    diff --git a/build/tmp/test/jar_extract_5344640810930951941_tmp b/build/tmp/test/jar_extract_5344640810930951941_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5344640810930951941_tmp differ
    diff --git a/build/tmp/test/jar_extract_5345668438752777423_tmp b/build/tmp/test/jar_extract_5345668438752777423_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5345668438752777423_tmp differ
    diff --git a/build/tmp/test/jar_extract_5345951663288905219_tmp b/build/tmp/test/jar_extract_5345951663288905219_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5345951663288905219_tmp differ
    diff --git a/build/tmp/test/jar_extract_534871250012305121_tmp b/build/tmp/test/jar_extract_534871250012305121_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_534871250012305121_tmp differ
    diff --git a/build/tmp/test/jar_extract_5350654383139295805_tmp b/build/tmp/test/jar_extract_5350654383139295805_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5350654383139295805_tmp differ
    diff --git a/build/tmp/test/jar_extract_5362506130041063053_tmp b/build/tmp/test/jar_extract_5362506130041063053_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5362506130041063053_tmp differ
    diff --git a/build/tmp/test/jar_extract_5375333077582949407_tmp b/build/tmp/test/jar_extract_5375333077582949407_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5375333077582949407_tmp differ
    diff --git a/build/tmp/test/jar_extract_5386524236086962265_tmp b/build/tmp/test/jar_extract_5386524236086962265_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5386524236086962265_tmp differ
    diff --git a/build/tmp/test/jar_extract_5393699641758878335_tmp b/build/tmp/test/jar_extract_5393699641758878335_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5393699641758878335_tmp differ
    diff --git a/build/tmp/test/jar_extract_541722282755910001_tmp b/build/tmp/test/jar_extract_541722282755910001_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_541722282755910001_tmp differ
    diff --git a/build/tmp/test/jar_extract_5420777884800751252_tmp b/build/tmp/test/jar_extract_5420777884800751252_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5420777884800751252_tmp differ
    diff --git a/build/tmp/test/jar_extract_5429007682920829010_tmp b/build/tmp/test/jar_extract_5429007682920829010_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5429007682920829010_tmp differ
    diff --git a/build/tmp/test/jar_extract_543488525138703472_tmp b/build/tmp/test/jar_extract_543488525138703472_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_543488525138703472_tmp differ
    diff --git a/build/tmp/test/jar_extract_5453465607276409438_tmp b/build/tmp/test/jar_extract_5453465607276409438_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5453465607276409438_tmp differ
    diff --git a/build/tmp/test/jar_extract_5466284524750806590_tmp b/build/tmp/test/jar_extract_5466284524750806590_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5466284524750806590_tmp differ
    diff --git a/build/tmp/test/jar_extract_5475668278663553871_tmp b/build/tmp/test/jar_extract_5475668278663553871_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5475668278663553871_tmp differ
    diff --git a/build/tmp/test/jar_extract_5491217461823852067_tmp b/build/tmp/test/jar_extract_5491217461823852067_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5491217461823852067_tmp differ
    diff --git a/build/tmp/test/jar_extract_5497324779457713281_tmp b/build/tmp/test/jar_extract_5497324779457713281_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5497324779457713281_tmp differ
    diff --git a/build/tmp/test/jar_extract_5500988371647017258_tmp b/build/tmp/test/jar_extract_5500988371647017258_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5500988371647017258_tmp differ
    diff --git a/build/tmp/test/jar_extract_5505362629649607778_tmp b/build/tmp/test/jar_extract_5505362629649607778_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5505362629649607778_tmp differ
    diff --git a/build/tmp/test/jar_extract_5542221603275948975_tmp b/build/tmp/test/jar_extract_5542221603275948975_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5542221603275948975_tmp differ
    diff --git a/build/tmp/test/jar_extract_5547666170542903984_tmp b/build/tmp/test/jar_extract_5547666170542903984_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5547666170542903984_tmp differ
    diff --git a/build/tmp/test/jar_extract_5556854556658578771_tmp b/build/tmp/test/jar_extract_5556854556658578771_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5556854556658578771_tmp differ
    diff --git a/build/tmp/test/jar_extract_5561877789758151970_tmp b/build/tmp/test/jar_extract_5561877789758151970_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5561877789758151970_tmp differ
    diff --git a/build/tmp/test/jar_extract_5562194538034937506_tmp b/build/tmp/test/jar_extract_5562194538034937506_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5562194538034937506_tmp differ
    diff --git a/build/tmp/test/jar_extract_5564378299476576955_tmp b/build/tmp/test/jar_extract_5564378299476576955_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5564378299476576955_tmp differ
    diff --git a/build/tmp/test/jar_extract_5568488843885147647_tmp b/build/tmp/test/jar_extract_5568488843885147647_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5568488843885147647_tmp differ
    diff --git a/build/tmp/test/jar_extract_557771515121294760_tmp b/build/tmp/test/jar_extract_557771515121294760_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_557771515121294760_tmp differ
    diff --git a/build/tmp/test/jar_extract_5584820096806863342_tmp b/build/tmp/test/jar_extract_5584820096806863342_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5584820096806863342_tmp differ
    diff --git a/build/tmp/test/jar_extract_5587257082191210398_tmp b/build/tmp/test/jar_extract_5587257082191210398_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5587257082191210398_tmp differ
    diff --git a/build/tmp/test/jar_extract_5594454598354418707_tmp b/build/tmp/test/jar_extract_5594454598354418707_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5594454598354418707_tmp differ
    diff --git a/build/tmp/test/jar_extract_5609429268295768396_tmp b/build/tmp/test/jar_extract_5609429268295768396_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5609429268295768396_tmp differ
    diff --git a/build/tmp/test/jar_extract_5620634959635510658_tmp b/build/tmp/test/jar_extract_5620634959635510658_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5620634959635510658_tmp differ
    diff --git a/build/tmp/test/jar_extract_5620931868422429535_tmp b/build/tmp/test/jar_extract_5620931868422429535_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5620931868422429535_tmp differ
    diff --git a/build/tmp/test/jar_extract_5638838203548873736_tmp b/build/tmp/test/jar_extract_5638838203548873736_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5638838203548873736_tmp differ
    diff --git a/build/tmp/test/jar_extract_5640057719279611292_tmp b/build/tmp/test/jar_extract_5640057719279611292_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5640057719279611292_tmp differ
    diff --git a/build/tmp/test/jar_extract_5640248989599764426_tmp b/build/tmp/test/jar_extract_5640248989599764426_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5640248989599764426_tmp differ
    diff --git a/build/tmp/test/jar_extract_5640560965092488302_tmp b/build/tmp/test/jar_extract_5640560965092488302_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5640560965092488302_tmp differ
    diff --git a/build/tmp/test/jar_extract_5641440191731464877_tmp b/build/tmp/test/jar_extract_5641440191731464877_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5641440191731464877_tmp differ
    diff --git a/build/tmp/test/jar_extract_5649218954534060559_tmp b/build/tmp/test/jar_extract_5649218954534060559_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5649218954534060559_tmp differ
    diff --git a/build/tmp/test/jar_extract_5654688460938364815_tmp b/build/tmp/test/jar_extract_5654688460938364815_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5654688460938364815_tmp differ
    diff --git a/build/tmp/test/jar_extract_5684303534175699897_tmp b/build/tmp/test/jar_extract_5684303534175699897_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5684303534175699897_tmp differ
    diff --git a/build/tmp/test/jar_extract_5688810566274302306_tmp b/build/tmp/test/jar_extract_5688810566274302306_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5688810566274302306_tmp differ
    diff --git a/build/tmp/test/jar_extract_5695549907208813664_tmp b/build/tmp/test/jar_extract_5695549907208813664_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5695549907208813664_tmp differ
    diff --git a/build/tmp/test/jar_extract_5708468257306498905_tmp b/build/tmp/test/jar_extract_5708468257306498905_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5708468257306498905_tmp differ
    diff --git a/build/tmp/test/jar_extract_5715679183430970156_tmp b/build/tmp/test/jar_extract_5715679183430970156_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5715679183430970156_tmp differ
    diff --git a/build/tmp/test/jar_extract_5719750263979781441_tmp b/build/tmp/test/jar_extract_5719750263979781441_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5719750263979781441_tmp differ
    diff --git a/build/tmp/test/jar_extract_5720519851059061469_tmp b/build/tmp/test/jar_extract_5720519851059061469_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5720519851059061469_tmp differ
    diff --git a/build/tmp/test/jar_extract_5722797767953244365_tmp b/build/tmp/test/jar_extract_5722797767953244365_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5722797767953244365_tmp differ
    diff --git a/build/tmp/test/jar_extract_5727687715111090204_tmp b/build/tmp/test/jar_extract_5727687715111090204_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5727687715111090204_tmp differ
    diff --git a/build/tmp/test/jar_extract_5731414835522104220_tmp b/build/tmp/test/jar_extract_5731414835522104220_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5731414835522104220_tmp differ
    diff --git a/build/tmp/test/jar_extract_5731887711692060660_tmp b/build/tmp/test/jar_extract_5731887711692060660_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5731887711692060660_tmp differ
    diff --git a/build/tmp/test/jar_extract_573877955439788016_tmp b/build/tmp/test/jar_extract_573877955439788016_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_573877955439788016_tmp differ
    diff --git a/build/tmp/test/jar_extract_5742330404642270313_tmp b/build/tmp/test/jar_extract_5742330404642270313_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5742330404642270313_tmp differ
    diff --git a/build/tmp/test/jar_extract_5743653238456769569_tmp b/build/tmp/test/jar_extract_5743653238456769569_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5743653238456769569_tmp differ
    diff --git a/build/tmp/test/jar_extract_5746341805514049317_tmp b/build/tmp/test/jar_extract_5746341805514049317_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5746341805514049317_tmp differ
    diff --git a/build/tmp/test/jar_extract_5747395260147498949_tmp b/build/tmp/test/jar_extract_5747395260147498949_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5747395260147498949_tmp differ
    diff --git a/build/tmp/test/jar_extract_5758087494293679581_tmp b/build/tmp/test/jar_extract_5758087494293679581_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5758087494293679581_tmp differ
    diff --git a/build/tmp/test/jar_extract_5768991626604394300_tmp b/build/tmp/test/jar_extract_5768991626604394300_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_5768991626604394300_tmp differ
    diff --git a/build/tmp/test/jar_extract_5772718916389053815_tmp b/build/tmp/test/jar_extract_5772718916389053815_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5772718916389053815_tmp differ
    diff --git a/build/tmp/test/jar_extract_5774593260987408906_tmp b/build/tmp/test/jar_extract_5774593260987408906_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5774593260987408906_tmp differ
    diff --git a/build/tmp/test/jar_extract_5779515382262434048_tmp b/build/tmp/test/jar_extract_5779515382262434048_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5779515382262434048_tmp differ
    diff --git a/build/tmp/test/jar_extract_5786729468103897783_tmp b/build/tmp/test/jar_extract_5786729468103897783_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5786729468103897783_tmp differ
    diff --git a/build/tmp/test/jar_extract_579012043304483367_tmp b/build/tmp/test/jar_extract_579012043304483367_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_579012043304483367_tmp differ
    diff --git a/build/tmp/test/jar_extract_5798851444429164120_tmp b/build/tmp/test/jar_extract_5798851444429164120_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5798851444429164120_tmp differ
    diff --git a/build/tmp/test/jar_extract_5807632070612302607_tmp b/build/tmp/test/jar_extract_5807632070612302607_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5807632070612302607_tmp differ
    diff --git a/build/tmp/test/jar_extract_5825316120778360614_tmp b/build/tmp/test/jar_extract_5825316120778360614_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5825316120778360614_tmp differ
    diff --git a/build/tmp/test/jar_extract_5827859617075682184_tmp b/build/tmp/test/jar_extract_5827859617075682184_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5827859617075682184_tmp differ
    diff --git a/build/tmp/test/jar_extract_583387144227092716_tmp b/build/tmp/test/jar_extract_583387144227092716_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_583387144227092716_tmp differ
    diff --git a/build/tmp/test/jar_extract_5837054474697265480_tmp b/build/tmp/test/jar_extract_5837054474697265480_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5837054474697265480_tmp differ
    diff --git a/build/tmp/test/jar_extract_5838638178251532427_tmp b/build/tmp/test/jar_extract_5838638178251532427_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5838638178251532427_tmp differ
    diff --git a/build/tmp/test/jar_extract_5844991409628791554_tmp b/build/tmp/test/jar_extract_5844991409628791554_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5844991409628791554_tmp differ
    diff --git a/build/tmp/test/jar_extract_5847524159058832615_tmp b/build/tmp/test/jar_extract_5847524159058832615_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5847524159058832615_tmp differ
    diff --git a/build/tmp/test/jar_extract_58485365910009776_tmp b/build/tmp/test/jar_extract_58485365910009776_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_58485365910009776_tmp differ
    diff --git a/build/tmp/test/jar_extract_5850543558153728045_tmp b/build/tmp/test/jar_extract_5850543558153728045_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5850543558153728045_tmp differ
    diff --git a/build/tmp/test/jar_extract_5856628094155566160_tmp b/build/tmp/test/jar_extract_5856628094155566160_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5856628094155566160_tmp differ
    diff --git a/build/tmp/test/jar_extract_5875703624293664797_tmp b/build/tmp/test/jar_extract_5875703624293664797_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5875703624293664797_tmp differ
    diff --git a/build/tmp/test/jar_extract_5876823477073722616_tmp b/build/tmp/test/jar_extract_5876823477073722616_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5876823477073722616_tmp differ
    diff --git a/build/tmp/test/jar_extract_5877949621119403581_tmp b/build/tmp/test/jar_extract_5877949621119403581_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5877949621119403581_tmp differ
    diff --git a/build/tmp/test/jar_extract_5885884724984753216_tmp b/build/tmp/test/jar_extract_5885884724984753216_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5885884724984753216_tmp differ
    diff --git a/build/tmp/test/jar_extract_5906965115330612384_tmp b/build/tmp/test/jar_extract_5906965115330612384_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5906965115330612384_tmp differ
    diff --git a/build/tmp/test/jar_extract_5907324265395933459_tmp b/build/tmp/test/jar_extract_5907324265395933459_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5907324265395933459_tmp differ
    diff --git a/build/tmp/test/jar_extract_5912370580069704633_tmp b/build/tmp/test/jar_extract_5912370580069704633_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5912370580069704633_tmp differ
    diff --git a/build/tmp/test/jar_extract_5934888563803703912_tmp b/build/tmp/test/jar_extract_5934888563803703912_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5934888563803703912_tmp differ
    diff --git a/build/tmp/test/jar_extract_5936261697112067664_tmp b/build/tmp/test/jar_extract_5936261697112067664_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5936261697112067664_tmp differ
    diff --git a/build/tmp/test/jar_extract_5949596055387899819_tmp b/build/tmp/test/jar_extract_5949596055387899819_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5949596055387899819_tmp differ
    diff --git a/build/tmp/test/jar_extract_5972464732682499079_tmp b/build/tmp/test/jar_extract_5972464732682499079_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5972464732682499079_tmp differ
    diff --git a/build/tmp/test/jar_extract_5972695577152270312_tmp b/build/tmp/test/jar_extract_5972695577152270312_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5972695577152270312_tmp differ
    diff --git a/build/tmp/test/jar_extract_5976275180861156458_tmp b/build/tmp/test/jar_extract_5976275180861156458_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5976275180861156458_tmp differ
    diff --git a/build/tmp/test/jar_extract_5983469644787544554_tmp b/build/tmp/test/jar_extract_5983469644787544554_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5983469644787544554_tmp differ
    diff --git a/build/tmp/test/jar_extract_5997597824000281530_tmp b/build/tmp/test/jar_extract_5997597824000281530_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_5997597824000281530_tmp differ
    diff --git a/build/tmp/test/jar_extract_6004320198941072520_tmp b/build/tmp/test/jar_extract_6004320198941072520_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6004320198941072520_tmp differ
    diff --git a/build/tmp/test/jar_extract_6005809747034001142_tmp b/build/tmp/test/jar_extract_6005809747034001142_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6005809747034001142_tmp differ
    diff --git a/build/tmp/test/jar_extract_6006809313943475194_tmp b/build/tmp/test/jar_extract_6006809313943475194_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6006809313943475194_tmp differ
    diff --git a/build/tmp/test/jar_extract_6008388247997168706_tmp b/build/tmp/test/jar_extract_6008388247997168706_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6008388247997168706_tmp differ
    diff --git a/build/tmp/test/jar_extract_6011923602412559668_tmp b/build/tmp/test/jar_extract_6011923602412559668_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6011923602412559668_tmp differ
    diff --git a/build/tmp/test/jar_extract_6025319099573439464_tmp b/build/tmp/test/jar_extract_6025319099573439464_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6025319099573439464_tmp differ
    diff --git a/build/tmp/test/jar_extract_6026940615405269786_tmp b/build/tmp/test/jar_extract_6026940615405269786_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6026940615405269786_tmp differ
    diff --git a/build/tmp/test/jar_extract_60366970577134469_tmp b/build/tmp/test/jar_extract_60366970577134469_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_60366970577134469_tmp differ
    diff --git a/build/tmp/test/jar_extract_6062018809651242192_tmp b/build/tmp/test/jar_extract_6062018809651242192_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6062018809651242192_tmp differ
    diff --git a/build/tmp/test/jar_extract_6079795036967798167_tmp b/build/tmp/test/jar_extract_6079795036967798167_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6079795036967798167_tmp differ
    diff --git a/build/tmp/test/jar_extract_608167104895399308_tmp b/build/tmp/test/jar_extract_608167104895399308_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_608167104895399308_tmp differ
    diff --git a/build/tmp/test/jar_extract_6085901115761673172_tmp b/build/tmp/test/jar_extract_6085901115761673172_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6085901115761673172_tmp differ
    diff --git a/build/tmp/test/jar_extract_6087684912665783364_tmp b/build/tmp/test/jar_extract_6087684912665783364_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6087684912665783364_tmp differ
    diff --git a/build/tmp/test/jar_extract_6108257309832775419_tmp b/build/tmp/test/jar_extract_6108257309832775419_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6108257309832775419_tmp differ
    diff --git a/build/tmp/test/jar_extract_6109300711162029566_tmp b/build/tmp/test/jar_extract_6109300711162029566_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6109300711162029566_tmp differ
    diff --git a/build/tmp/test/jar_extract_6114060256714842224_tmp b/build/tmp/test/jar_extract_6114060256714842224_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6114060256714842224_tmp differ
    diff --git a/build/tmp/test/jar_extract_6132827993981877189_tmp b/build/tmp/test/jar_extract_6132827993981877189_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6132827993981877189_tmp differ
    diff --git a/build/tmp/test/jar_extract_6143009083251498909_tmp b/build/tmp/test/jar_extract_6143009083251498909_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6143009083251498909_tmp differ
    diff --git a/build/tmp/test/jar_extract_6145507323241406490_tmp b/build/tmp/test/jar_extract_6145507323241406490_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6145507323241406490_tmp differ
    diff --git a/build/tmp/test/jar_extract_6146607261778676178_tmp b/build/tmp/test/jar_extract_6146607261778676178_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6146607261778676178_tmp differ
    diff --git a/build/tmp/test/jar_extract_615401483661973950_tmp b/build/tmp/test/jar_extract_615401483661973950_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_615401483661973950_tmp differ
    diff --git a/build/tmp/test/jar_extract_6161061419303601051_tmp b/build/tmp/test/jar_extract_6161061419303601051_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6161061419303601051_tmp differ
    diff --git a/build/tmp/test/jar_extract_6162123193906302619_tmp b/build/tmp/test/jar_extract_6162123193906302619_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6162123193906302619_tmp differ
    diff --git a/build/tmp/test/jar_extract_6166684904251475460_tmp b/build/tmp/test/jar_extract_6166684904251475460_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6166684904251475460_tmp differ
    diff --git a/build/tmp/test/jar_extract_6169488122765705660_tmp b/build/tmp/test/jar_extract_6169488122765705660_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6169488122765705660_tmp differ
    diff --git a/build/tmp/test/jar_extract_6172916474018824302_tmp b/build/tmp/test/jar_extract_6172916474018824302_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6172916474018824302_tmp differ
    diff --git a/build/tmp/test/jar_extract_6176646093406863734_tmp b/build/tmp/test/jar_extract_6176646093406863734_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6176646093406863734_tmp differ
    diff --git a/build/tmp/test/jar_extract_6177839640737127277_tmp b/build/tmp/test/jar_extract_6177839640737127277_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6177839640737127277_tmp differ
    diff --git a/build/tmp/test/jar_extract_6196112502066039227_tmp b/build/tmp/test/jar_extract_6196112502066039227_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6196112502066039227_tmp differ
    diff --git a/build/tmp/test/jar_extract_6205212225433654188_tmp b/build/tmp/test/jar_extract_6205212225433654188_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6205212225433654188_tmp differ
    diff --git a/build/tmp/test/jar_extract_6218566304697931998_tmp b/build/tmp/test/jar_extract_6218566304697931998_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6218566304697931998_tmp differ
    diff --git a/build/tmp/test/jar_extract_6224352642683624870_tmp b/build/tmp/test/jar_extract_6224352642683624870_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6224352642683624870_tmp differ
    diff --git a/build/tmp/test/jar_extract_6226454237063654114_tmp b/build/tmp/test/jar_extract_6226454237063654114_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6226454237063654114_tmp differ
    diff --git a/build/tmp/test/jar_extract_6230192072996185041_tmp b/build/tmp/test/jar_extract_6230192072996185041_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6230192072996185041_tmp differ
    diff --git a/build/tmp/test/jar_extract_6233318720381290812_tmp b/build/tmp/test/jar_extract_6233318720381290812_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6233318720381290812_tmp differ
    diff --git a/build/tmp/test/jar_extract_6241451843979746037_tmp b/build/tmp/test/jar_extract_6241451843979746037_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6241451843979746037_tmp differ
    diff --git a/build/tmp/test/jar_extract_6253437222424302701_tmp b/build/tmp/test/jar_extract_6253437222424302701_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6253437222424302701_tmp differ
    diff --git a/build/tmp/test/jar_extract_6261989104231588195_tmp b/build/tmp/test/jar_extract_6261989104231588195_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6261989104231588195_tmp differ
    diff --git a/build/tmp/test/jar_extract_6264889177421044851_tmp b/build/tmp/test/jar_extract_6264889177421044851_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6264889177421044851_tmp differ
    diff --git a/build/tmp/test/jar_extract_6286074018327400014_tmp b/build/tmp/test/jar_extract_6286074018327400014_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6286074018327400014_tmp differ
    diff --git a/build/tmp/test/jar_extract_629673642010711724_tmp b/build/tmp/test/jar_extract_629673642010711724_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_629673642010711724_tmp differ
    diff --git a/build/tmp/test/jar_extract_6298470885895166005_tmp b/build/tmp/test/jar_extract_6298470885895166005_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6298470885895166005_tmp differ
    diff --git a/build/tmp/test/jar_extract_6301107097834813766_tmp b/build/tmp/test/jar_extract_6301107097834813766_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6301107097834813766_tmp differ
    diff --git a/build/tmp/test/jar_extract_6302873630786778882_tmp b/build/tmp/test/jar_extract_6302873630786778882_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6302873630786778882_tmp differ
    diff --git a/build/tmp/test/jar_extract_6304128729707493351_tmp b/build/tmp/test/jar_extract_6304128729707493351_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6304128729707493351_tmp differ
    diff --git a/build/tmp/test/jar_extract_6306496927682648146_tmp b/build/tmp/test/jar_extract_6306496927682648146_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6306496927682648146_tmp differ
    diff --git a/build/tmp/test/jar_extract_6314872230100779138_tmp b/build/tmp/test/jar_extract_6314872230100779138_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6314872230100779138_tmp differ
    diff --git a/build/tmp/test/jar_extract_6320199552583817745_tmp b/build/tmp/test/jar_extract_6320199552583817745_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6320199552583817745_tmp differ
    diff --git a/build/tmp/test/jar_extract_6320733461130613276_tmp b/build/tmp/test/jar_extract_6320733461130613276_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6320733461130613276_tmp differ
    diff --git a/build/tmp/test/jar_extract_6322488948303559495_tmp b/build/tmp/test/jar_extract_6322488948303559495_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6322488948303559495_tmp differ
    diff --git a/build/tmp/test/jar_extract_6325335802296377177_tmp b/build/tmp/test/jar_extract_6325335802296377177_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6325335802296377177_tmp differ
    diff --git a/build/tmp/test/jar_extract_6328938330893074974_tmp b/build/tmp/test/jar_extract_6328938330893074974_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6328938330893074974_tmp differ
    diff --git a/build/tmp/test/jar_extract_6330066703032931572_tmp b/build/tmp/test/jar_extract_6330066703032931572_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6330066703032931572_tmp differ
    diff --git a/build/tmp/test/jar_extract_6342868379872309354_tmp b/build/tmp/test/jar_extract_6342868379872309354_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6342868379872309354_tmp differ
    diff --git a/build/tmp/test/jar_extract_6349488291777804547_tmp b/build/tmp/test/jar_extract_6349488291777804547_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6349488291777804547_tmp differ
    diff --git a/build/tmp/test/jar_extract_6362659908013499362_tmp b/build/tmp/test/jar_extract_6362659908013499362_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6362659908013499362_tmp differ
    diff --git a/build/tmp/test/jar_extract_6362935640221719182_tmp b/build/tmp/test/jar_extract_6362935640221719182_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6362935640221719182_tmp differ
    diff --git a/build/tmp/test/jar_extract_6365537970084910913_tmp b/build/tmp/test/jar_extract_6365537970084910913_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6365537970084910913_tmp differ
    diff --git a/build/tmp/test/jar_extract_6374008177977100048_tmp b/build/tmp/test/jar_extract_6374008177977100048_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6374008177977100048_tmp differ
    diff --git a/build/tmp/test/jar_extract_6387465887377654611_tmp b/build/tmp/test/jar_extract_6387465887377654611_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6387465887377654611_tmp differ
    diff --git a/build/tmp/test/jar_extract_6390456704249414805_tmp b/build/tmp/test/jar_extract_6390456704249414805_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6390456704249414805_tmp differ
    diff --git a/build/tmp/test/jar_extract_6392090675889174415_tmp b/build/tmp/test/jar_extract_6392090675889174415_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6392090675889174415_tmp differ
    diff --git a/build/tmp/test/jar_extract_6397519312045917908_tmp b/build/tmp/test/jar_extract_6397519312045917908_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6397519312045917908_tmp differ
    diff --git a/build/tmp/test/jar_extract_6398833939558518767_tmp b/build/tmp/test/jar_extract_6398833939558518767_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6398833939558518767_tmp differ
    diff --git a/build/tmp/test/jar_extract_6400844921185302288_tmp b/build/tmp/test/jar_extract_6400844921185302288_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6400844921185302288_tmp differ
    diff --git a/build/tmp/test/jar_extract_6406683646939673331_tmp b/build/tmp/test/jar_extract_6406683646939673331_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6406683646939673331_tmp differ
    diff --git a/build/tmp/test/jar_extract_6414529796581452841_tmp b/build/tmp/test/jar_extract_6414529796581452841_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6414529796581452841_tmp differ
    diff --git a/build/tmp/test/jar_extract_6416807874091702921_tmp b/build/tmp/test/jar_extract_6416807874091702921_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6416807874091702921_tmp differ
    diff --git a/build/tmp/test/jar_extract_6419424057292690762_tmp b/build/tmp/test/jar_extract_6419424057292690762_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6419424057292690762_tmp differ
    diff --git a/build/tmp/test/jar_extract_6426070327312762048_tmp b/build/tmp/test/jar_extract_6426070327312762048_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6426070327312762048_tmp differ
    diff --git a/build/tmp/test/jar_extract_6426704499860835919_tmp b/build/tmp/test/jar_extract_6426704499860835919_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6426704499860835919_tmp differ
    diff --git a/build/tmp/test/jar_extract_645071408885461169_tmp b/build/tmp/test/jar_extract_645071408885461169_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_645071408885461169_tmp differ
    diff --git a/build/tmp/test/jar_extract_6457271392914978946_tmp b/build/tmp/test/jar_extract_6457271392914978946_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6457271392914978946_tmp differ
    diff --git a/build/tmp/test/jar_extract_6460982043939962033_tmp b/build/tmp/test/jar_extract_6460982043939962033_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6460982043939962033_tmp differ
    diff --git a/build/tmp/test/jar_extract_6467823658751743066_tmp b/build/tmp/test/jar_extract_6467823658751743066_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6467823658751743066_tmp differ
    diff --git a/build/tmp/test/jar_extract_6468660751790886885_tmp b/build/tmp/test/jar_extract_6468660751790886885_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6468660751790886885_tmp differ
    diff --git a/build/tmp/test/jar_extract_6469926204144736872_tmp b/build/tmp/test/jar_extract_6469926204144736872_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6469926204144736872_tmp differ
    diff --git a/build/tmp/test/jar_extract_647040894928580518_tmp b/build/tmp/test/jar_extract_647040894928580518_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_647040894928580518_tmp differ
    diff --git a/build/tmp/test/jar_extract_6472093307743877897_tmp b/build/tmp/test/jar_extract_6472093307743877897_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6472093307743877897_tmp differ
    diff --git a/build/tmp/test/jar_extract_6472616451495714761_tmp b/build/tmp/test/jar_extract_6472616451495714761_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6472616451495714761_tmp differ
    diff --git a/build/tmp/test/jar_extract_6481669576602075099_tmp b/build/tmp/test/jar_extract_6481669576602075099_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6481669576602075099_tmp differ
    diff --git a/build/tmp/test/jar_extract_6484612191467975235_tmp b/build/tmp/test/jar_extract_6484612191467975235_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6484612191467975235_tmp differ
    diff --git a/build/tmp/test/jar_extract_6501708361833997216_tmp b/build/tmp/test/jar_extract_6501708361833997216_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6501708361833997216_tmp differ
    diff --git a/build/tmp/test/jar_extract_6502981218376314714_tmp b/build/tmp/test/jar_extract_6502981218376314714_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6502981218376314714_tmp differ
    diff --git a/build/tmp/test/jar_extract_6510367513221174095_tmp b/build/tmp/test/jar_extract_6510367513221174095_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6510367513221174095_tmp differ
    diff --git a/build/tmp/test/jar_extract_6515646682213212051_tmp b/build/tmp/test/jar_extract_6515646682213212051_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6515646682213212051_tmp differ
    diff --git a/build/tmp/test/jar_extract_6518115786292391225_tmp b/build/tmp/test/jar_extract_6518115786292391225_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6518115786292391225_tmp differ
    diff --git a/build/tmp/test/jar_extract_6524463946651701364_tmp b/build/tmp/test/jar_extract_6524463946651701364_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6524463946651701364_tmp differ
    diff --git a/build/tmp/test/jar_extract_6525400131806234141_tmp b/build/tmp/test/jar_extract_6525400131806234141_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6525400131806234141_tmp differ
    diff --git a/build/tmp/test/jar_extract_6527890636315732134_tmp b/build/tmp/test/jar_extract_6527890636315732134_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6527890636315732134_tmp differ
    diff --git a/build/tmp/test/jar_extract_6534473372219915608_tmp b/build/tmp/test/jar_extract_6534473372219915608_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6534473372219915608_tmp differ
    diff --git a/build/tmp/test/jar_extract_6535673206842091484_tmp b/build/tmp/test/jar_extract_6535673206842091484_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6535673206842091484_tmp differ
    diff --git a/build/tmp/test/jar_extract_6537655760912456994_tmp b/build/tmp/test/jar_extract_6537655760912456994_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6537655760912456994_tmp differ
    diff --git a/build/tmp/test/jar_extract_6543972204994741653_tmp b/build/tmp/test/jar_extract_6543972204994741653_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6543972204994741653_tmp differ
    diff --git a/build/tmp/test/jar_extract_6550978252541488902_tmp b/build/tmp/test/jar_extract_6550978252541488902_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6550978252541488902_tmp differ
    diff --git a/build/tmp/test/jar_extract_6558795694449397661_tmp b/build/tmp/test/jar_extract_6558795694449397661_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6558795694449397661_tmp differ
    diff --git a/build/tmp/test/jar_extract_6593285125215007372_tmp b/build/tmp/test/jar_extract_6593285125215007372_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6593285125215007372_tmp differ
    diff --git a/build/tmp/test/jar_extract_6598776682016349140_tmp b/build/tmp/test/jar_extract_6598776682016349140_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6598776682016349140_tmp differ
    diff --git a/build/tmp/test/jar_extract_6603953397811387758_tmp b/build/tmp/test/jar_extract_6603953397811387758_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6603953397811387758_tmp differ
    diff --git a/build/tmp/test/jar_extract_6609334499143720082_tmp b/build/tmp/test/jar_extract_6609334499143720082_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6609334499143720082_tmp differ
    diff --git a/build/tmp/test/jar_extract_6612579541366299766_tmp b/build/tmp/test/jar_extract_6612579541366299766_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6612579541366299766_tmp differ
    diff --git a/build/tmp/test/jar_extract_6613032686843959168_tmp b/build/tmp/test/jar_extract_6613032686843959168_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6613032686843959168_tmp differ
    diff --git a/build/tmp/test/jar_extract_6615809463086414413_tmp b/build/tmp/test/jar_extract_6615809463086414413_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6615809463086414413_tmp differ
    diff --git a/build/tmp/test/jar_extract_6628400615568864356_tmp b/build/tmp/test/jar_extract_6628400615568864356_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6628400615568864356_tmp differ
    diff --git a/build/tmp/test/jar_extract_6640780107138982751_tmp b/build/tmp/test/jar_extract_6640780107138982751_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6640780107138982751_tmp differ
    diff --git a/build/tmp/test/jar_extract_6651164692809031020_tmp b/build/tmp/test/jar_extract_6651164692809031020_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6651164692809031020_tmp differ
    diff --git a/build/tmp/test/jar_extract_6666983834669130670_tmp b/build/tmp/test/jar_extract_6666983834669130670_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6666983834669130670_tmp differ
    diff --git a/build/tmp/test/jar_extract_6668170133963349014_tmp b/build/tmp/test/jar_extract_6668170133963349014_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6668170133963349014_tmp differ
    diff --git a/build/tmp/test/jar_extract_6677146186294960503_tmp b/build/tmp/test/jar_extract_6677146186294960503_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6677146186294960503_tmp differ
    diff --git a/build/tmp/test/jar_extract_6700096790220020179_tmp b/build/tmp/test/jar_extract_6700096790220020179_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6700096790220020179_tmp differ
    diff --git a/build/tmp/test/jar_extract_6701091247649130492_tmp b/build/tmp/test/jar_extract_6701091247649130492_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6701091247649130492_tmp differ
    diff --git a/build/tmp/test/jar_extract_6708851050636443026_tmp b/build/tmp/test/jar_extract_6708851050636443026_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6708851050636443026_tmp differ
    diff --git a/build/tmp/test/jar_extract_671005143904712956_tmp b/build/tmp/test/jar_extract_671005143904712956_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_671005143904712956_tmp differ
    diff --git a/build/tmp/test/jar_extract_6717054603310770350_tmp b/build/tmp/test/jar_extract_6717054603310770350_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6717054603310770350_tmp differ
    diff --git a/build/tmp/test/jar_extract_6720761759082653341_tmp b/build/tmp/test/jar_extract_6720761759082653341_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6720761759082653341_tmp differ
    diff --git a/build/tmp/test/jar_extract_6735963966064803691_tmp b/build/tmp/test/jar_extract_6735963966064803691_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6735963966064803691_tmp differ
    diff --git a/build/tmp/test/jar_extract_6737525151625732970_tmp b/build/tmp/test/jar_extract_6737525151625732970_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6737525151625732970_tmp differ
    diff --git a/build/tmp/test/jar_extract_6738394850621014925_tmp b/build/tmp/test/jar_extract_6738394850621014925_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6738394850621014925_tmp differ
    diff --git a/build/tmp/test/jar_extract_6742278430012176775_tmp b/build/tmp/test/jar_extract_6742278430012176775_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6742278430012176775_tmp differ
    diff --git a/build/tmp/test/jar_extract_6747921591052045009_tmp b/build/tmp/test/jar_extract_6747921591052045009_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6747921591052045009_tmp differ
    diff --git a/build/tmp/test/jar_extract_6749136934008832486_tmp b/build/tmp/test/jar_extract_6749136934008832486_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6749136934008832486_tmp differ
    diff --git a/build/tmp/test/jar_extract_6751651139594546668_tmp b/build/tmp/test/jar_extract_6751651139594546668_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6751651139594546668_tmp differ
    diff --git a/build/tmp/test/jar_extract_6791600795763171563_tmp b/build/tmp/test/jar_extract_6791600795763171563_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6791600795763171563_tmp differ
    diff --git a/build/tmp/test/jar_extract_6797733309670197609_tmp b/build/tmp/test/jar_extract_6797733309670197609_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6797733309670197609_tmp differ
    diff --git a/build/tmp/test/jar_extract_6801034746978484973_tmp b/build/tmp/test/jar_extract_6801034746978484973_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6801034746978484973_tmp differ
    diff --git a/build/tmp/test/jar_extract_6803394618654032207_tmp b/build/tmp/test/jar_extract_6803394618654032207_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6803394618654032207_tmp differ
    diff --git a/build/tmp/test/jar_extract_6803991394786138721_tmp b/build/tmp/test/jar_extract_6803991394786138721_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6803991394786138721_tmp differ
    diff --git a/build/tmp/test/jar_extract_681413341549055306_tmp b/build/tmp/test/jar_extract_681413341549055306_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_681413341549055306_tmp differ
    diff --git a/build/tmp/test/jar_extract_6818023167288081155_tmp b/build/tmp/test/jar_extract_6818023167288081155_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6818023167288081155_tmp differ
    diff --git a/build/tmp/test/jar_extract_6818531849505673377_tmp b/build/tmp/test/jar_extract_6818531849505673377_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6818531849505673377_tmp differ
    diff --git a/build/tmp/test/jar_extract_682762185186807689_tmp b/build/tmp/test/jar_extract_682762185186807689_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_682762185186807689_tmp differ
    diff --git a/build/tmp/test/jar_extract_6828766033383698652_tmp b/build/tmp/test/jar_extract_6828766033383698652_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6828766033383698652_tmp differ
    diff --git a/build/tmp/test/jar_extract_6838021279249328686_tmp b/build/tmp/test/jar_extract_6838021279249328686_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6838021279249328686_tmp differ
    diff --git a/build/tmp/test/jar_extract_6845488271405720510_tmp b/build/tmp/test/jar_extract_6845488271405720510_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6845488271405720510_tmp differ
    diff --git a/build/tmp/test/jar_extract_6845682089331222432_tmp b/build/tmp/test/jar_extract_6845682089331222432_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6845682089331222432_tmp differ
    diff --git a/build/tmp/test/jar_extract_6848924191908819183_tmp b/build/tmp/test/jar_extract_6848924191908819183_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6848924191908819183_tmp differ
    diff --git a/build/tmp/test/jar_extract_6849367726272211290_tmp b/build/tmp/test/jar_extract_6849367726272211290_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6849367726272211290_tmp differ
    diff --git a/build/tmp/test/jar_extract_6864985226128923878_tmp b/build/tmp/test/jar_extract_6864985226128923878_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6864985226128923878_tmp differ
    diff --git a/build/tmp/test/jar_extract_6876473441866565589_tmp b/build/tmp/test/jar_extract_6876473441866565589_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6876473441866565589_tmp differ
    diff --git a/build/tmp/test/jar_extract_688458213309542657_tmp b/build/tmp/test/jar_extract_688458213309542657_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_688458213309542657_tmp differ
    diff --git a/build/tmp/test/jar_extract_6898480327824886577_tmp b/build/tmp/test/jar_extract_6898480327824886577_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6898480327824886577_tmp differ
    diff --git a/build/tmp/test/jar_extract_690483306663806385_tmp b/build/tmp/test/jar_extract_690483306663806385_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_690483306663806385_tmp differ
    diff --git a/build/tmp/test/jar_extract_691449995102768031_tmp b/build/tmp/test/jar_extract_691449995102768031_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_691449995102768031_tmp differ
    diff --git a/build/tmp/test/jar_extract_6914675609645308297_tmp b/build/tmp/test/jar_extract_6914675609645308297_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6914675609645308297_tmp differ
    diff --git a/build/tmp/test/jar_extract_6916693131611171774_tmp b/build/tmp/test/jar_extract_6916693131611171774_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6916693131611171774_tmp differ
    diff --git a/build/tmp/test/jar_extract_6929776369147869383_tmp b/build/tmp/test/jar_extract_6929776369147869383_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6929776369147869383_tmp differ
    diff --git a/build/tmp/test/jar_extract_6950405747270974863_tmp b/build/tmp/test/jar_extract_6950405747270974863_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6950405747270974863_tmp differ
    diff --git a/build/tmp/test/jar_extract_6951551916404983463_tmp b/build/tmp/test/jar_extract_6951551916404983463_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6951551916404983463_tmp differ
    diff --git a/build/tmp/test/jar_extract_6961354858392602364_tmp b/build/tmp/test/jar_extract_6961354858392602364_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6961354858392602364_tmp differ
    diff --git a/build/tmp/test/jar_extract_6964986244440589928_tmp b/build/tmp/test/jar_extract_6964986244440589928_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6964986244440589928_tmp differ
    diff --git a/build/tmp/test/jar_extract_6977696453495726343_tmp b/build/tmp/test/jar_extract_6977696453495726343_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6977696453495726343_tmp differ
    diff --git a/build/tmp/test/jar_extract_698400607997170480_tmp b/build/tmp/test/jar_extract_698400607997170480_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_698400607997170480_tmp differ
    diff --git a/build/tmp/test/jar_extract_6991579668889624507_tmp b/build/tmp/test/jar_extract_6991579668889624507_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6991579668889624507_tmp differ
    diff --git a/build/tmp/test/jar_extract_6994664288539376013_tmp b/build/tmp/test/jar_extract_6994664288539376013_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_6994664288539376013_tmp differ
    diff --git a/build/tmp/test/jar_extract_7001225892727698487_tmp b/build/tmp/test/jar_extract_7001225892727698487_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7001225892727698487_tmp differ
    diff --git a/build/tmp/test/jar_extract_7002019898421443451_tmp b/build/tmp/test/jar_extract_7002019898421443451_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7002019898421443451_tmp differ
    diff --git a/build/tmp/test/jar_extract_7027725267237289196_tmp b/build/tmp/test/jar_extract_7027725267237289196_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7027725267237289196_tmp differ
    diff --git a/build/tmp/test/jar_extract_7037651614905268653_tmp b/build/tmp/test/jar_extract_7037651614905268653_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7037651614905268653_tmp differ
    diff --git a/build/tmp/test/jar_extract_7037710177439888452_tmp b/build/tmp/test/jar_extract_7037710177439888452_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7037710177439888452_tmp differ
    diff --git a/build/tmp/test/jar_extract_7039834434103780772_tmp b/build/tmp/test/jar_extract_7039834434103780772_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7039834434103780772_tmp differ
    diff --git a/build/tmp/test/jar_extract_7042949988237900933_tmp b/build/tmp/test/jar_extract_7042949988237900933_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7042949988237900933_tmp differ
    diff --git a/build/tmp/test/jar_extract_7061940414923123249_tmp b/build/tmp/test/jar_extract_7061940414923123249_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7061940414923123249_tmp differ
    diff --git a/build/tmp/test/jar_extract_7066872443616344833_tmp b/build/tmp/test/jar_extract_7066872443616344833_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7066872443616344833_tmp differ
    diff --git a/build/tmp/test/jar_extract_7070899138409061528_tmp b/build/tmp/test/jar_extract_7070899138409061528_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7070899138409061528_tmp differ
    diff --git a/build/tmp/test/jar_extract_7077648572909099433_tmp b/build/tmp/test/jar_extract_7077648572909099433_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7077648572909099433_tmp differ
    diff --git a/build/tmp/test/jar_extract_7087897739022529935_tmp b/build/tmp/test/jar_extract_7087897739022529935_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7087897739022529935_tmp differ
    diff --git a/build/tmp/test/jar_extract_7098673564159131731_tmp b/build/tmp/test/jar_extract_7098673564159131731_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7098673564159131731_tmp differ
    diff --git a/build/tmp/test/jar_extract_710244474660517348_tmp b/build/tmp/test/jar_extract_710244474660517348_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_710244474660517348_tmp differ
    diff --git a/build/tmp/test/jar_extract_7104810910908298714_tmp b/build/tmp/test/jar_extract_7104810910908298714_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7104810910908298714_tmp differ
    diff --git a/build/tmp/test/jar_extract_7107837318329377743_tmp b/build/tmp/test/jar_extract_7107837318329377743_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7107837318329377743_tmp differ
    diff --git a/build/tmp/test/jar_extract_7114628085211448138_tmp b/build/tmp/test/jar_extract_7114628085211448138_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7114628085211448138_tmp differ
    diff --git a/build/tmp/test/jar_extract_7117574991770482744_tmp b/build/tmp/test/jar_extract_7117574991770482744_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7117574991770482744_tmp differ
    diff --git a/build/tmp/test/jar_extract_7118794366617938108_tmp b/build/tmp/test/jar_extract_7118794366617938108_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7118794366617938108_tmp differ
    diff --git a/build/tmp/test/jar_extract_713148311533866273_tmp b/build/tmp/test/jar_extract_713148311533866273_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_713148311533866273_tmp differ
    diff --git a/build/tmp/test/jar_extract_7135735764636128521_tmp b/build/tmp/test/jar_extract_7135735764636128521_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7135735764636128521_tmp differ
    diff --git a/build/tmp/test/jar_extract_7142362576504053204_tmp b/build/tmp/test/jar_extract_7142362576504053204_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7142362576504053204_tmp differ
    diff --git a/build/tmp/test/jar_extract_715237030209967498_tmp b/build/tmp/test/jar_extract_715237030209967498_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_715237030209967498_tmp differ
    diff --git a/build/tmp/test/jar_extract_7157945190595911963_tmp b/build/tmp/test/jar_extract_7157945190595911963_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7157945190595911963_tmp differ
    diff --git a/build/tmp/test/jar_extract_7168246629767720179_tmp b/build/tmp/test/jar_extract_7168246629767720179_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7168246629767720179_tmp differ
    diff --git a/build/tmp/test/jar_extract_7172881170431688746_tmp b/build/tmp/test/jar_extract_7172881170431688746_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7172881170431688746_tmp differ
    diff --git a/build/tmp/test/jar_extract_7181821760937367284_tmp b/build/tmp/test/jar_extract_7181821760937367284_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7181821760937367284_tmp differ
    diff --git a/build/tmp/test/jar_extract_7196643841666710628_tmp b/build/tmp/test/jar_extract_7196643841666710628_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7196643841666710628_tmp differ
    diff --git a/build/tmp/test/jar_extract_720376358599042428_tmp b/build/tmp/test/jar_extract_720376358599042428_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_720376358599042428_tmp differ
    diff --git a/build/tmp/test/jar_extract_721447394163891534_tmp b/build/tmp/test/jar_extract_721447394163891534_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_721447394163891534_tmp differ
    diff --git a/build/tmp/test/jar_extract_7217534271567737269_tmp b/build/tmp/test/jar_extract_7217534271567737269_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7217534271567737269_tmp differ
    diff --git a/build/tmp/test/jar_extract_7220386182904366260_tmp b/build/tmp/test/jar_extract_7220386182904366260_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7220386182904366260_tmp differ
    diff --git a/build/tmp/test/jar_extract_7228488343076417748_tmp b/build/tmp/test/jar_extract_7228488343076417748_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7228488343076417748_tmp differ
    diff --git a/build/tmp/test/jar_extract_7229760912866713979_tmp b/build/tmp/test/jar_extract_7229760912866713979_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7229760912866713979_tmp differ
    diff --git a/build/tmp/test/jar_extract_7247948605566309274_tmp b/build/tmp/test/jar_extract_7247948605566309274_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7247948605566309274_tmp differ
    diff --git a/build/tmp/test/jar_extract_7248832498028386729_tmp b/build/tmp/test/jar_extract_7248832498028386729_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7248832498028386729_tmp differ
    diff --git a/build/tmp/test/jar_extract_7250569040015435300_tmp b/build/tmp/test/jar_extract_7250569040015435300_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7250569040015435300_tmp differ
    diff --git a/build/tmp/test/jar_extract_7263064997731835349_tmp b/build/tmp/test/jar_extract_7263064997731835349_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7263064997731835349_tmp differ
    diff --git a/build/tmp/test/jar_extract_726861726446409885_tmp b/build/tmp/test/jar_extract_726861726446409885_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_726861726446409885_tmp differ
    diff --git a/build/tmp/test/jar_extract_7270309494583017779_tmp b/build/tmp/test/jar_extract_7270309494583017779_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7270309494583017779_tmp differ
    diff --git a/build/tmp/test/jar_extract_7277262471993683405_tmp b/build/tmp/test/jar_extract_7277262471993683405_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7277262471993683405_tmp differ
    diff --git a/build/tmp/test/jar_extract_72829992527668349_tmp b/build/tmp/test/jar_extract_72829992527668349_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_72829992527668349_tmp differ
    diff --git a/build/tmp/test/jar_extract_7288145150651882424_tmp b/build/tmp/test/jar_extract_7288145150651882424_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7288145150651882424_tmp differ
    diff --git a/build/tmp/test/jar_extract_7312839185644446217_tmp b/build/tmp/test/jar_extract_7312839185644446217_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7312839185644446217_tmp differ
    diff --git a/build/tmp/test/jar_extract_7317162144816512816_tmp b/build/tmp/test/jar_extract_7317162144816512816_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7317162144816512816_tmp differ
    diff --git a/build/tmp/test/jar_extract_7336320753715233190_tmp b/build/tmp/test/jar_extract_7336320753715233190_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7336320753715233190_tmp differ
    diff --git a/build/tmp/test/jar_extract_7339610431512761262_tmp b/build/tmp/test/jar_extract_7339610431512761262_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7339610431512761262_tmp differ
    diff --git a/build/tmp/test/jar_extract_7340742760121145544_tmp b/build/tmp/test/jar_extract_7340742760121145544_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7340742760121145544_tmp differ
    diff --git a/build/tmp/test/jar_extract_7341954441621496343_tmp b/build/tmp/test/jar_extract_7341954441621496343_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7341954441621496343_tmp differ
    diff --git a/build/tmp/test/jar_extract_7346482087618622635_tmp b/build/tmp/test/jar_extract_7346482087618622635_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7346482087618622635_tmp differ
    diff --git a/build/tmp/test/jar_extract_7350581002438693509_tmp b/build/tmp/test/jar_extract_7350581002438693509_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7350581002438693509_tmp differ
    diff --git a/build/tmp/test/jar_extract_7355228449392573374_tmp b/build/tmp/test/jar_extract_7355228449392573374_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7355228449392573374_tmp differ
    diff --git a/build/tmp/test/jar_extract_7356883347428109843_tmp b/build/tmp/test/jar_extract_7356883347428109843_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7356883347428109843_tmp differ
    diff --git a/build/tmp/test/jar_extract_7373512076066256318_tmp b/build/tmp/test/jar_extract_7373512076066256318_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7373512076066256318_tmp differ
    diff --git a/build/tmp/test/jar_extract_7373760832294096433_tmp b/build/tmp/test/jar_extract_7373760832294096433_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7373760832294096433_tmp differ
    diff --git a/build/tmp/test/jar_extract_7381930549321832221_tmp b/build/tmp/test/jar_extract_7381930549321832221_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7381930549321832221_tmp differ
    diff --git a/build/tmp/test/jar_extract_7385463481128081654_tmp b/build/tmp/test/jar_extract_7385463481128081654_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7385463481128081654_tmp differ
    diff --git a/build/tmp/test/jar_extract_7387961405523190758_tmp b/build/tmp/test/jar_extract_7387961405523190758_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7387961405523190758_tmp differ
    diff --git a/build/tmp/test/jar_extract_7394958613075690167_tmp b/build/tmp/test/jar_extract_7394958613075690167_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7394958613075690167_tmp differ
    diff --git a/build/tmp/test/jar_extract_7395045389306474999_tmp b/build/tmp/test/jar_extract_7395045389306474999_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7395045389306474999_tmp differ
    diff --git a/build/tmp/test/jar_extract_7395447828245168734_tmp b/build/tmp/test/jar_extract_7395447828245168734_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7395447828245168734_tmp differ
    diff --git a/build/tmp/test/jar_extract_7402074198321666925_tmp b/build/tmp/test/jar_extract_7402074198321666925_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7402074198321666925_tmp differ
    diff --git a/build/tmp/test/jar_extract_7406414492165801539_tmp b/build/tmp/test/jar_extract_7406414492165801539_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7406414492165801539_tmp differ
    diff --git a/build/tmp/test/jar_extract_7412697128331256467_tmp b/build/tmp/test/jar_extract_7412697128331256467_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_7412697128331256467_tmp differ
    diff --git a/build/tmp/test/jar_extract_7413228664266910481_tmp b/build/tmp/test/jar_extract_7413228664266910481_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7413228664266910481_tmp differ
    diff --git a/build/tmp/test/jar_extract_7419371205651098973_tmp b/build/tmp/test/jar_extract_7419371205651098973_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7419371205651098973_tmp differ
    diff --git a/build/tmp/test/jar_extract_7422640231988839647_tmp b/build/tmp/test/jar_extract_7422640231988839647_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7422640231988839647_tmp differ
    diff --git a/build/tmp/test/jar_extract_7431308510248471463_tmp b/build/tmp/test/jar_extract_7431308510248471463_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7431308510248471463_tmp differ
    diff --git a/build/tmp/test/jar_extract_7432931365114628267_tmp b/build/tmp/test/jar_extract_7432931365114628267_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7432931365114628267_tmp differ
    diff --git a/build/tmp/test/jar_extract_7447332737884307818_tmp b/build/tmp/test/jar_extract_7447332737884307818_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7447332737884307818_tmp differ
    diff --git a/build/tmp/test/jar_extract_7457155913779733539_tmp b/build/tmp/test/jar_extract_7457155913779733539_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7457155913779733539_tmp differ
    diff --git a/build/tmp/test/jar_extract_746351740964382533_tmp b/build/tmp/test/jar_extract_746351740964382533_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_746351740964382533_tmp differ
    diff --git a/build/tmp/test/jar_extract_7470661639587595377_tmp b/build/tmp/test/jar_extract_7470661639587595377_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7470661639587595377_tmp differ
    diff --git a/build/tmp/test/jar_extract_7474694433798335437_tmp b/build/tmp/test/jar_extract_7474694433798335437_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7474694433798335437_tmp differ
    diff --git a/build/tmp/test/jar_extract_7495831857683174524_tmp b/build/tmp/test/jar_extract_7495831857683174524_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7495831857683174524_tmp differ
    diff --git a/build/tmp/test/jar_extract_7509700982860250202_tmp b/build/tmp/test/jar_extract_7509700982860250202_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7509700982860250202_tmp differ
    diff --git a/build/tmp/test/jar_extract_7510172946745067291_tmp b/build/tmp/test/jar_extract_7510172946745067291_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7510172946745067291_tmp differ
    diff --git a/build/tmp/test/jar_extract_7512087075399932911_tmp b/build/tmp/test/jar_extract_7512087075399932911_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7512087075399932911_tmp differ
    diff --git a/build/tmp/test/jar_extract_7515926872361085088_tmp b/build/tmp/test/jar_extract_7515926872361085088_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7515926872361085088_tmp differ
    diff --git a/build/tmp/test/jar_extract_752271716699489236_tmp b/build/tmp/test/jar_extract_752271716699489236_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_752271716699489236_tmp differ
    diff --git a/build/tmp/test/jar_extract_7528738005483048986_tmp b/build/tmp/test/jar_extract_7528738005483048986_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7528738005483048986_tmp differ
    diff --git a/build/tmp/test/jar_extract_7534376090542591318_tmp b/build/tmp/test/jar_extract_7534376090542591318_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7534376090542591318_tmp differ
    diff --git a/build/tmp/test/jar_extract_7536978347299179795_tmp b/build/tmp/test/jar_extract_7536978347299179795_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7536978347299179795_tmp differ
    diff --git a/build/tmp/test/jar_extract_7539734699223476714_tmp b/build/tmp/test/jar_extract_7539734699223476714_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_7539734699223476714_tmp differ
    diff --git a/build/tmp/test/jar_extract_7544043965613577180_tmp b/build/tmp/test/jar_extract_7544043965613577180_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7544043965613577180_tmp differ
    diff --git a/build/tmp/test/jar_extract_7545238858978912148_tmp b/build/tmp/test/jar_extract_7545238858978912148_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7545238858978912148_tmp differ
    diff --git a/build/tmp/test/jar_extract_7547746635495324773_tmp b/build/tmp/test/jar_extract_7547746635495324773_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7547746635495324773_tmp differ
    diff --git a/build/tmp/test/jar_extract_7553775100397641273_tmp b/build/tmp/test/jar_extract_7553775100397641273_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7553775100397641273_tmp differ
    diff --git a/build/tmp/test/jar_extract_7566917579688838584_tmp b/build/tmp/test/jar_extract_7566917579688838584_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7566917579688838584_tmp differ
    diff --git a/build/tmp/test/jar_extract_7578240255847255901_tmp b/build/tmp/test/jar_extract_7578240255847255901_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_7578240255847255901_tmp differ
    diff --git a/build/tmp/test/jar_extract_7578598766938504710_tmp b/build/tmp/test/jar_extract_7578598766938504710_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7578598766938504710_tmp differ
    diff --git a/build/tmp/test/jar_extract_7584271128973468783_tmp b/build/tmp/test/jar_extract_7584271128973468783_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7584271128973468783_tmp differ
    diff --git a/build/tmp/test/jar_extract_7585215618448824909_tmp b/build/tmp/test/jar_extract_7585215618448824909_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7585215618448824909_tmp differ
    diff --git a/build/tmp/test/jar_extract_7594460380774708650_tmp b/build/tmp/test/jar_extract_7594460380774708650_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7594460380774708650_tmp differ
    diff --git a/build/tmp/test/jar_extract_760383878104644347_tmp b/build/tmp/test/jar_extract_760383878104644347_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_760383878104644347_tmp differ
    diff --git a/build/tmp/test/jar_extract_7608423807077677540_tmp b/build/tmp/test/jar_extract_7608423807077677540_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7608423807077677540_tmp differ
    diff --git a/build/tmp/test/jar_extract_760931814881908180_tmp b/build/tmp/test/jar_extract_760931814881908180_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_760931814881908180_tmp differ
    diff --git a/build/tmp/test/jar_extract_7619286857444440195_tmp b/build/tmp/test/jar_extract_7619286857444440195_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7619286857444440195_tmp differ
    diff --git a/build/tmp/test/jar_extract_762121298673528887_tmp b/build/tmp/test/jar_extract_762121298673528887_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_762121298673528887_tmp differ
    diff --git a/build/tmp/test/jar_extract_7630724906221065737_tmp b/build/tmp/test/jar_extract_7630724906221065737_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7630724906221065737_tmp differ
    diff --git a/build/tmp/test/jar_extract_7637312496958166637_tmp b/build/tmp/test/jar_extract_7637312496958166637_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7637312496958166637_tmp differ
    diff --git a/build/tmp/test/jar_extract_764275183751039887_tmp b/build/tmp/test/jar_extract_764275183751039887_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_764275183751039887_tmp differ
    diff --git a/build/tmp/test/jar_extract_7645880580396439964_tmp b/build/tmp/test/jar_extract_7645880580396439964_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7645880580396439964_tmp differ
    diff --git a/build/tmp/test/jar_extract_7668035510918153485_tmp b/build/tmp/test/jar_extract_7668035510918153485_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7668035510918153485_tmp differ
    diff --git a/build/tmp/test/jar_extract_7670395794108317434_tmp b/build/tmp/test/jar_extract_7670395794108317434_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_7670395794108317434_tmp differ
    diff --git a/build/tmp/test/jar_extract_7671081182062367142_tmp b/build/tmp/test/jar_extract_7671081182062367142_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7671081182062367142_tmp differ
    diff --git a/build/tmp/test/jar_extract_7690693047886836535_tmp b/build/tmp/test/jar_extract_7690693047886836535_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7690693047886836535_tmp differ
    diff --git a/build/tmp/test/jar_extract_769254153766592146_tmp b/build/tmp/test/jar_extract_769254153766592146_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_769254153766592146_tmp differ
    diff --git a/build/tmp/test/jar_extract_7704050226403091805_tmp b/build/tmp/test/jar_extract_7704050226403091805_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7704050226403091805_tmp differ
    diff --git a/build/tmp/test/jar_extract_7705829403742413256_tmp b/build/tmp/test/jar_extract_7705829403742413256_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7705829403742413256_tmp differ
    diff --git a/build/tmp/test/jar_extract_7708895333972939362_tmp b/build/tmp/test/jar_extract_7708895333972939362_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7708895333972939362_tmp differ
    diff --git a/build/tmp/test/jar_extract_771294844739434377_tmp b/build/tmp/test/jar_extract_771294844739434377_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_771294844739434377_tmp differ
    diff --git a/build/tmp/test/jar_extract_7714931349932567323_tmp b/build/tmp/test/jar_extract_7714931349932567323_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7714931349932567323_tmp differ
    diff --git a/build/tmp/test/jar_extract_7716146303766063903_tmp b/build/tmp/test/jar_extract_7716146303766063903_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7716146303766063903_tmp differ
    diff --git a/build/tmp/test/jar_extract_7718423941271452546_tmp b/build/tmp/test/jar_extract_7718423941271452546_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7718423941271452546_tmp differ
    diff --git a/build/tmp/test/jar_extract_771958815138752636_tmp b/build/tmp/test/jar_extract_771958815138752636_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_771958815138752636_tmp differ
    diff --git a/build/tmp/test/jar_extract_7728798108844081914_tmp b/build/tmp/test/jar_extract_7728798108844081914_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7728798108844081914_tmp differ
    diff --git a/build/tmp/test/jar_extract_7728799015805280004_tmp b/build/tmp/test/jar_extract_7728799015805280004_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7728799015805280004_tmp differ
    diff --git a/build/tmp/test/jar_extract_7741527402308852122_tmp b/build/tmp/test/jar_extract_7741527402308852122_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7741527402308852122_tmp differ
    diff --git a/build/tmp/test/jar_extract_774465087418155118_tmp b/build/tmp/test/jar_extract_774465087418155118_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_774465087418155118_tmp differ
    diff --git a/build/tmp/test/jar_extract_7745019891131738781_tmp b/build/tmp/test/jar_extract_7745019891131738781_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7745019891131738781_tmp differ
    diff --git a/build/tmp/test/jar_extract_7745830610153536609_tmp b/build/tmp/test/jar_extract_7745830610153536609_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7745830610153536609_tmp differ
    diff --git a/build/tmp/test/jar_extract_7754363588424208779_tmp b/build/tmp/test/jar_extract_7754363588424208779_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7754363588424208779_tmp differ
    diff --git a/build/tmp/test/jar_extract_775747988942431560_tmp b/build/tmp/test/jar_extract_775747988942431560_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_775747988942431560_tmp differ
    diff --git a/build/tmp/test/jar_extract_7768148844534561717_tmp b/build/tmp/test/jar_extract_7768148844534561717_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7768148844534561717_tmp differ
    diff --git a/build/tmp/test/jar_extract_7770142239534081501_tmp b/build/tmp/test/jar_extract_7770142239534081501_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7770142239534081501_tmp differ
    diff --git a/build/tmp/test/jar_extract_7776934383426175362_tmp b/build/tmp/test/jar_extract_7776934383426175362_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7776934383426175362_tmp differ
    diff --git a/build/tmp/test/jar_extract_7779252290344754618_tmp b/build/tmp/test/jar_extract_7779252290344754618_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7779252290344754618_tmp differ
    diff --git a/build/tmp/test/jar_extract_7786710880933204687_tmp b/build/tmp/test/jar_extract_7786710880933204687_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7786710880933204687_tmp differ
    diff --git a/build/tmp/test/jar_extract_7789547962524903506_tmp b/build/tmp/test/jar_extract_7789547962524903506_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7789547962524903506_tmp differ
    diff --git a/build/tmp/test/jar_extract_7810248618298817502_tmp b/build/tmp/test/jar_extract_7810248618298817502_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7810248618298817502_tmp differ
    diff --git a/build/tmp/test/jar_extract_7814272303771852732_tmp b/build/tmp/test/jar_extract_7814272303771852732_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7814272303771852732_tmp differ
    diff --git a/build/tmp/test/jar_extract_7814945610396782582_tmp b/build/tmp/test/jar_extract_7814945610396782582_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7814945610396782582_tmp differ
    diff --git a/build/tmp/test/jar_extract_7815458214929149073_tmp b/build/tmp/test/jar_extract_7815458214929149073_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7815458214929149073_tmp differ
    diff --git a/build/tmp/test/jar_extract_7830037026287209375_tmp b/build/tmp/test/jar_extract_7830037026287209375_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7830037026287209375_tmp differ
    diff --git a/build/tmp/test/jar_extract_7833763275867186190_tmp b/build/tmp/test/jar_extract_7833763275867186190_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7833763275867186190_tmp differ
    diff --git a/build/tmp/test/jar_extract_7847543017665772143_tmp b/build/tmp/test/jar_extract_7847543017665772143_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7847543017665772143_tmp differ
    diff --git a/build/tmp/test/jar_extract_7848311206627412491_tmp b/build/tmp/test/jar_extract_7848311206627412491_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7848311206627412491_tmp differ
    diff --git a/build/tmp/test/jar_extract_7852725668509402502_tmp b/build/tmp/test/jar_extract_7852725668509402502_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7852725668509402502_tmp differ
    diff --git a/build/tmp/test/jar_extract_7894600261711397705_tmp b/build/tmp/test/jar_extract_7894600261711397705_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7894600261711397705_tmp differ
    diff --git a/build/tmp/test/jar_extract_7897683560914838569_tmp b/build/tmp/test/jar_extract_7897683560914838569_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7897683560914838569_tmp differ
    diff --git a/build/tmp/test/jar_extract_7901029177160472693_tmp b/build/tmp/test/jar_extract_7901029177160472693_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7901029177160472693_tmp differ
    diff --git a/build/tmp/test/jar_extract_7906698280318530276_tmp b/build/tmp/test/jar_extract_7906698280318530276_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7906698280318530276_tmp differ
    diff --git a/build/tmp/test/jar_extract_7920713459078301184_tmp b/build/tmp/test/jar_extract_7920713459078301184_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7920713459078301184_tmp differ
    diff --git a/build/tmp/test/jar_extract_7922264843364450977_tmp b/build/tmp/test/jar_extract_7922264843364450977_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7922264843364450977_tmp differ
    diff --git a/build/tmp/test/jar_extract_7928255686729113636_tmp b/build/tmp/test/jar_extract_7928255686729113636_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7928255686729113636_tmp differ
    diff --git a/build/tmp/test/jar_extract_7931227763017977080_tmp b/build/tmp/test/jar_extract_7931227763017977080_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7931227763017977080_tmp differ
    diff --git a/build/tmp/test/jar_extract_7937619792496765048_tmp b/build/tmp/test/jar_extract_7937619792496765048_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7937619792496765048_tmp differ
    diff --git a/build/tmp/test/jar_extract_7943420061290975413_tmp b/build/tmp/test/jar_extract_7943420061290975413_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7943420061290975413_tmp differ
    diff --git a/build/tmp/test/jar_extract_7944669539709456119_tmp b/build/tmp/test/jar_extract_7944669539709456119_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7944669539709456119_tmp differ
    diff --git a/build/tmp/test/jar_extract_7949212102516418859_tmp b/build/tmp/test/jar_extract_7949212102516418859_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7949212102516418859_tmp differ
    diff --git a/build/tmp/test/jar_extract_795333842314936414_tmp b/build/tmp/test/jar_extract_795333842314936414_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_795333842314936414_tmp differ
    diff --git a/build/tmp/test/jar_extract_7977353652784236509_tmp b/build/tmp/test/jar_extract_7977353652784236509_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_7977353652784236509_tmp differ
    diff --git a/build/tmp/test/jar_extract_799808739092885809_tmp b/build/tmp/test/jar_extract_799808739092885809_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_799808739092885809_tmp differ
    diff --git a/build/tmp/test/jar_extract_8001637232217395136_tmp b/build/tmp/test/jar_extract_8001637232217395136_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8001637232217395136_tmp differ
    diff --git a/build/tmp/test/jar_extract_8002087870668305677_tmp b/build/tmp/test/jar_extract_8002087870668305677_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8002087870668305677_tmp differ
    diff --git a/build/tmp/test/jar_extract_8006404834464726368_tmp b/build/tmp/test/jar_extract_8006404834464726368_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8006404834464726368_tmp differ
    diff --git a/build/tmp/test/jar_extract_8006829707624563609_tmp b/build/tmp/test/jar_extract_8006829707624563609_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8006829707624563609_tmp differ
    diff --git a/build/tmp/test/jar_extract_8008214685376832987_tmp b/build/tmp/test/jar_extract_8008214685376832987_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8008214685376832987_tmp differ
    diff --git a/build/tmp/test/jar_extract_8012672576172490741_tmp b/build/tmp/test/jar_extract_8012672576172490741_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8012672576172490741_tmp differ
    diff --git a/build/tmp/test/jar_extract_8019282213832095667_tmp b/build/tmp/test/jar_extract_8019282213832095667_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8019282213832095667_tmp differ
    diff --git a/build/tmp/test/jar_extract_8026220900831981435_tmp b/build/tmp/test/jar_extract_8026220900831981435_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8026220900831981435_tmp differ
    diff --git a/build/tmp/test/jar_extract_8030031470576962976_tmp b/build/tmp/test/jar_extract_8030031470576962976_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8030031470576962976_tmp differ
    diff --git a/build/tmp/test/jar_extract_8031337419643862013_tmp b/build/tmp/test/jar_extract_8031337419643862013_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8031337419643862013_tmp differ
    diff --git a/build/tmp/test/jar_extract_803510578058200810_tmp b/build/tmp/test/jar_extract_803510578058200810_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_803510578058200810_tmp differ
    diff --git a/build/tmp/test/jar_extract_803679565116632388_tmp b/build/tmp/test/jar_extract_803679565116632388_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_803679565116632388_tmp differ
    diff --git a/build/tmp/test/jar_extract_8037112080429154156_tmp b/build/tmp/test/jar_extract_8037112080429154156_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8037112080429154156_tmp differ
    diff --git a/build/tmp/test/jar_extract_8050961447102321625_tmp b/build/tmp/test/jar_extract_8050961447102321625_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8050961447102321625_tmp differ
    diff --git a/build/tmp/test/jar_extract_8051854139981741961_tmp b/build/tmp/test/jar_extract_8051854139981741961_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8051854139981741961_tmp differ
    diff --git a/build/tmp/test/jar_extract_8055831644205884496_tmp b/build/tmp/test/jar_extract_8055831644205884496_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8055831644205884496_tmp differ
    diff --git a/build/tmp/test/jar_extract_8058861923797720937_tmp b/build/tmp/test/jar_extract_8058861923797720937_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8058861923797720937_tmp differ
    diff --git a/build/tmp/test/jar_extract_806285690880294489_tmp b/build/tmp/test/jar_extract_806285690880294489_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_806285690880294489_tmp differ
    diff --git a/build/tmp/test/jar_extract_806469596267754925_tmp b/build/tmp/test/jar_extract_806469596267754925_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_806469596267754925_tmp differ
    diff --git a/build/tmp/test/jar_extract_806960560017711104_tmp b/build/tmp/test/jar_extract_806960560017711104_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_806960560017711104_tmp differ
    diff --git a/build/tmp/test/jar_extract_8078988110638564149_tmp b/build/tmp/test/jar_extract_8078988110638564149_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8078988110638564149_tmp differ
    diff --git a/build/tmp/test/jar_extract_8079598525704004476_tmp b/build/tmp/test/jar_extract_8079598525704004476_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8079598525704004476_tmp differ
    diff --git a/build/tmp/test/jar_extract_808374278392816963_tmp b/build/tmp/test/jar_extract_808374278392816963_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_808374278392816963_tmp differ
    diff --git a/build/tmp/test/jar_extract_808708790334863648_tmp b/build/tmp/test/jar_extract_808708790334863648_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_808708790334863648_tmp differ
    diff --git a/build/tmp/test/jar_extract_8092028483013174881_tmp b/build/tmp/test/jar_extract_8092028483013174881_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8092028483013174881_tmp differ
    diff --git a/build/tmp/test/jar_extract_8101029631428806775_tmp b/build/tmp/test/jar_extract_8101029631428806775_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8101029631428806775_tmp differ
    diff --git a/build/tmp/test/jar_extract_8104859680982799722_tmp b/build/tmp/test/jar_extract_8104859680982799722_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8104859680982799722_tmp differ
    diff --git a/build/tmp/test/jar_extract_8105052172777765088_tmp b/build/tmp/test/jar_extract_8105052172777765088_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8105052172777765088_tmp differ
    diff --git a/build/tmp/test/jar_extract_8112023449098306938_tmp b/build/tmp/test/jar_extract_8112023449098306938_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8112023449098306938_tmp differ
    diff --git a/build/tmp/test/jar_extract_8112270492412225559_tmp b/build/tmp/test/jar_extract_8112270492412225559_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8112270492412225559_tmp differ
    diff --git a/build/tmp/test/jar_extract_8119124808056308637_tmp b/build/tmp/test/jar_extract_8119124808056308637_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8119124808056308637_tmp differ
    diff --git a/build/tmp/test/jar_extract_8124630299793824752_tmp b/build/tmp/test/jar_extract_8124630299793824752_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8124630299793824752_tmp differ
    diff --git a/build/tmp/test/jar_extract_8133795286823105224_tmp b/build/tmp/test/jar_extract_8133795286823105224_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8133795286823105224_tmp differ
    diff --git a/build/tmp/test/jar_extract_8136172892774069896_tmp b/build/tmp/test/jar_extract_8136172892774069896_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8136172892774069896_tmp differ
    diff --git a/build/tmp/test/jar_extract_8143004259548009910_tmp b/build/tmp/test/jar_extract_8143004259548009910_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8143004259548009910_tmp differ
    diff --git a/build/tmp/test/jar_extract_8149678262731026536_tmp b/build/tmp/test/jar_extract_8149678262731026536_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8149678262731026536_tmp differ
    diff --git a/build/tmp/test/jar_extract_8149784175775654981_tmp b/build/tmp/test/jar_extract_8149784175775654981_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8149784175775654981_tmp differ
    diff --git a/build/tmp/test/jar_extract_8150780109171590200_tmp b/build/tmp/test/jar_extract_8150780109171590200_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8150780109171590200_tmp differ
    diff --git a/build/tmp/test/jar_extract_8155181776817791164_tmp b/build/tmp/test/jar_extract_8155181776817791164_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8155181776817791164_tmp differ
    diff --git a/build/tmp/test/jar_extract_8165860146342516571_tmp b/build/tmp/test/jar_extract_8165860146342516571_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8165860146342516571_tmp differ
    diff --git a/build/tmp/test/jar_extract_8187233333923139942_tmp b/build/tmp/test/jar_extract_8187233333923139942_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8187233333923139942_tmp differ
    diff --git a/build/tmp/test/jar_extract_8189288419778268075_tmp b/build/tmp/test/jar_extract_8189288419778268075_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8189288419778268075_tmp differ
    diff --git a/build/tmp/test/jar_extract_8191049134779880418_tmp b/build/tmp/test/jar_extract_8191049134779880418_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8191049134779880418_tmp differ
    diff --git a/build/tmp/test/jar_extract_8210831805694955582_tmp b/build/tmp/test/jar_extract_8210831805694955582_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8210831805694955582_tmp differ
    diff --git a/build/tmp/test/jar_extract_821125028252603234_tmp b/build/tmp/test/jar_extract_821125028252603234_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_821125028252603234_tmp differ
    diff --git a/build/tmp/test/jar_extract_8221393110135466959_tmp b/build/tmp/test/jar_extract_8221393110135466959_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8221393110135466959_tmp differ
    diff --git a/build/tmp/test/jar_extract_8224013476837038348_tmp b/build/tmp/test/jar_extract_8224013476837038348_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8224013476837038348_tmp differ
    diff --git a/build/tmp/test/jar_extract_8234364216271518392_tmp b/build/tmp/test/jar_extract_8234364216271518392_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8234364216271518392_tmp differ
    diff --git a/build/tmp/test/jar_extract_8241740806622569411_tmp b/build/tmp/test/jar_extract_8241740806622569411_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8241740806622569411_tmp differ
    diff --git a/build/tmp/test/jar_extract_8255558546420695057_tmp b/build/tmp/test/jar_extract_8255558546420695057_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8255558546420695057_tmp differ
    diff --git a/build/tmp/test/jar_extract_8258780948002987336_tmp b/build/tmp/test/jar_extract_8258780948002987336_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8258780948002987336_tmp differ
    diff --git a/build/tmp/test/jar_extract_8274902107906834670_tmp b/build/tmp/test/jar_extract_8274902107906834670_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8274902107906834670_tmp differ
    diff --git a/build/tmp/test/jar_extract_8282171863355875567_tmp b/build/tmp/test/jar_extract_8282171863355875567_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8282171863355875567_tmp differ
    diff --git a/build/tmp/test/jar_extract_8293090951231012544_tmp b/build/tmp/test/jar_extract_8293090951231012544_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8293090951231012544_tmp differ
    diff --git a/build/tmp/test/jar_extract_8310742534370319952_tmp b/build/tmp/test/jar_extract_8310742534370319952_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8310742534370319952_tmp differ
    diff --git a/build/tmp/test/jar_extract_831108274183034804_tmp b/build/tmp/test/jar_extract_831108274183034804_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_831108274183034804_tmp differ
    diff --git a/build/tmp/test/jar_extract_8321101336277902346_tmp b/build/tmp/test/jar_extract_8321101336277902346_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8321101336277902346_tmp differ
    diff --git a/build/tmp/test/jar_extract_8326125171182482638_tmp b/build/tmp/test/jar_extract_8326125171182482638_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8326125171182482638_tmp differ
    diff --git a/build/tmp/test/jar_extract_8343953436855896547_tmp b/build/tmp/test/jar_extract_8343953436855896547_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8343953436855896547_tmp differ
    diff --git a/build/tmp/test/jar_extract_835411581501745075_tmp b/build/tmp/test/jar_extract_835411581501745075_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_835411581501745075_tmp differ
    diff --git a/build/tmp/test/jar_extract_8357752923250350141_tmp b/build/tmp/test/jar_extract_8357752923250350141_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8357752923250350141_tmp differ
    diff --git a/build/tmp/test/jar_extract_8359361881171957791_tmp b/build/tmp/test/jar_extract_8359361881171957791_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8359361881171957791_tmp differ
    diff --git a/build/tmp/test/jar_extract_8375589216630273433_tmp b/build/tmp/test/jar_extract_8375589216630273433_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8375589216630273433_tmp differ
    diff --git a/build/tmp/test/jar_extract_8382770304655577898_tmp b/build/tmp/test/jar_extract_8382770304655577898_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8382770304655577898_tmp differ
    diff --git a/build/tmp/test/jar_extract_8386469222515745813_tmp b/build/tmp/test/jar_extract_8386469222515745813_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8386469222515745813_tmp differ
    diff --git a/build/tmp/test/jar_extract_8395288039516522507_tmp b/build/tmp/test/jar_extract_8395288039516522507_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8395288039516522507_tmp differ
    diff --git a/build/tmp/test/jar_extract_8401327854213669941_tmp b/build/tmp/test/jar_extract_8401327854213669941_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8401327854213669941_tmp differ
    diff --git a/build/tmp/test/jar_extract_84181700623958231_tmp b/build/tmp/test/jar_extract_84181700623958231_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_84181700623958231_tmp differ
    diff --git a/build/tmp/test/jar_extract_8418472514831636761_tmp b/build/tmp/test/jar_extract_8418472514831636761_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8418472514831636761_tmp differ
    diff --git a/build/tmp/test/jar_extract_8418945024089518877_tmp b/build/tmp/test/jar_extract_8418945024089518877_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8418945024089518877_tmp differ
    diff --git a/build/tmp/test/jar_extract_8424784135498876742_tmp b/build/tmp/test/jar_extract_8424784135498876742_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8424784135498876742_tmp differ
    diff --git a/build/tmp/test/jar_extract_8441397670864092484_tmp b/build/tmp/test/jar_extract_8441397670864092484_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8441397670864092484_tmp differ
    diff --git a/build/tmp/test/jar_extract_8443023276797791500_tmp b/build/tmp/test/jar_extract_8443023276797791500_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8443023276797791500_tmp differ
    diff --git a/build/tmp/test/jar_extract_8448945862757755532_tmp b/build/tmp/test/jar_extract_8448945862757755532_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8448945862757755532_tmp differ
    diff --git a/build/tmp/test/jar_extract_8451353655665470581_tmp b/build/tmp/test/jar_extract_8451353655665470581_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8451353655665470581_tmp differ
    diff --git a/build/tmp/test/jar_extract_8453209181944642565_tmp b/build/tmp/test/jar_extract_8453209181944642565_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8453209181944642565_tmp differ
    diff --git a/build/tmp/test/jar_extract_8462061587570365694_tmp b/build/tmp/test/jar_extract_8462061587570365694_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8462061587570365694_tmp differ
    diff --git a/build/tmp/test/jar_extract_846407007324288469_tmp b/build/tmp/test/jar_extract_846407007324288469_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_846407007324288469_tmp differ
    diff --git a/build/tmp/test/jar_extract_848987297918508212_tmp b/build/tmp/test/jar_extract_848987297918508212_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_848987297918508212_tmp differ
    diff --git a/build/tmp/test/jar_extract_8525969982555345198_tmp b/build/tmp/test/jar_extract_8525969982555345198_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8525969982555345198_tmp differ
    diff --git a/build/tmp/test/jar_extract_8529256976653136587_tmp b/build/tmp/test/jar_extract_8529256976653136587_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8529256976653136587_tmp differ
    diff --git a/build/tmp/test/jar_extract_8533080260909037876_tmp b/build/tmp/test/jar_extract_8533080260909037876_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8533080260909037876_tmp differ
    diff --git a/build/tmp/test/jar_extract_8543047983347833964_tmp b/build/tmp/test/jar_extract_8543047983347833964_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8543047983347833964_tmp differ
    diff --git a/build/tmp/test/jar_extract_8553144064451163655_tmp b/build/tmp/test/jar_extract_8553144064451163655_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8553144064451163655_tmp differ
    diff --git a/build/tmp/test/jar_extract_855427821678011900_tmp b/build/tmp/test/jar_extract_855427821678011900_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_855427821678011900_tmp differ
    diff --git a/build/tmp/test/jar_extract_8557327534419708137_tmp b/build/tmp/test/jar_extract_8557327534419708137_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8557327534419708137_tmp differ
    diff --git a/build/tmp/test/jar_extract_8570061193172884141_tmp b/build/tmp/test/jar_extract_8570061193172884141_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8570061193172884141_tmp differ
    diff --git a/build/tmp/test/jar_extract_8570850582706697185_tmp b/build/tmp/test/jar_extract_8570850582706697185_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8570850582706697185_tmp differ
    diff --git a/build/tmp/test/jar_extract_8589407845498787259_tmp b/build/tmp/test/jar_extract_8589407845498787259_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8589407845498787259_tmp differ
    diff --git a/build/tmp/test/jar_extract_8590894175921049676_tmp b/build/tmp/test/jar_extract_8590894175921049676_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8590894175921049676_tmp differ
    diff --git a/build/tmp/test/jar_extract_8608369017689104963_tmp b/build/tmp/test/jar_extract_8608369017689104963_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8608369017689104963_tmp differ
    diff --git a/build/tmp/test/jar_extract_8608500374789188258_tmp b/build/tmp/test/jar_extract_8608500374789188258_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8608500374789188258_tmp differ
    diff --git a/build/tmp/test/jar_extract_8609367741791812037_tmp b/build/tmp/test/jar_extract_8609367741791812037_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8609367741791812037_tmp differ
    diff --git a/build/tmp/test/jar_extract_8610997567004625234_tmp b/build/tmp/test/jar_extract_8610997567004625234_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_8610997567004625234_tmp differ
    diff --git a/build/tmp/test/jar_extract_8632538454586674000_tmp b/build/tmp/test/jar_extract_8632538454586674000_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8632538454586674000_tmp differ
    diff --git a/build/tmp/test/jar_extract_8634021754281348882_tmp b/build/tmp/test/jar_extract_8634021754281348882_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8634021754281348882_tmp differ
    diff --git a/build/tmp/test/jar_extract_8635361330290233498_tmp b/build/tmp/test/jar_extract_8635361330290233498_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8635361330290233498_tmp differ
    diff --git a/build/tmp/test/jar_extract_8635648701607431775_tmp b/build/tmp/test/jar_extract_8635648701607431775_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8635648701607431775_tmp differ
    diff --git a/build/tmp/test/jar_extract_8636335916624480848_tmp b/build/tmp/test/jar_extract_8636335916624480848_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8636335916624480848_tmp differ
    diff --git a/build/tmp/test/jar_extract_8655312186520505477_tmp b/build/tmp/test/jar_extract_8655312186520505477_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8655312186520505477_tmp differ
    diff --git a/build/tmp/test/jar_extract_8671795417721678212_tmp b/build/tmp/test/jar_extract_8671795417721678212_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8671795417721678212_tmp differ
    diff --git a/build/tmp/test/jar_extract_8680958798309279738_tmp b/build/tmp/test/jar_extract_8680958798309279738_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8680958798309279738_tmp differ
    diff --git a/build/tmp/test/jar_extract_8691683224282851280_tmp b/build/tmp/test/jar_extract_8691683224282851280_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8691683224282851280_tmp differ
    diff --git a/build/tmp/test/jar_extract_8692064385664429815_tmp b/build/tmp/test/jar_extract_8692064385664429815_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8692064385664429815_tmp differ
    diff --git a/build/tmp/test/jar_extract_8698385063549685063_tmp b/build/tmp/test/jar_extract_8698385063549685063_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8698385063549685063_tmp differ
    diff --git a/build/tmp/test/jar_extract_8705531187847575359_tmp b/build/tmp/test/jar_extract_8705531187847575359_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8705531187847575359_tmp differ
    diff --git a/build/tmp/test/jar_extract_8714473785588460884_tmp b/build/tmp/test/jar_extract_8714473785588460884_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8714473785588460884_tmp differ
    diff --git a/build/tmp/test/jar_extract_8717919466637786081_tmp b/build/tmp/test/jar_extract_8717919466637786081_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8717919466637786081_tmp differ
    diff --git a/build/tmp/test/jar_extract_8720729163197841233_tmp b/build/tmp/test/jar_extract_8720729163197841233_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8720729163197841233_tmp differ
    diff --git a/build/tmp/test/jar_extract_8724221364588401015_tmp b/build/tmp/test/jar_extract_8724221364588401015_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8724221364588401015_tmp differ
    diff --git a/build/tmp/test/jar_extract_87342038742636531_tmp b/build/tmp/test/jar_extract_87342038742636531_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_87342038742636531_tmp differ
    diff --git a/build/tmp/test/jar_extract_8736546015732140977_tmp b/build/tmp/test/jar_extract_8736546015732140977_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8736546015732140977_tmp differ
    diff --git a/build/tmp/test/jar_extract_8745321003371737602_tmp b/build/tmp/test/jar_extract_8745321003371737602_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8745321003371737602_tmp differ
    diff --git a/build/tmp/test/jar_extract_875415395625709731_tmp b/build/tmp/test/jar_extract_875415395625709731_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_875415395625709731_tmp differ
    diff --git a/build/tmp/test/jar_extract_8758117230476606228_tmp b/build/tmp/test/jar_extract_8758117230476606228_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8758117230476606228_tmp differ
    diff --git a/build/tmp/test/jar_extract_8773290239018264206_tmp b/build/tmp/test/jar_extract_8773290239018264206_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8773290239018264206_tmp differ
    diff --git a/build/tmp/test/jar_extract_8781091949093228938_tmp b/build/tmp/test/jar_extract_8781091949093228938_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8781091949093228938_tmp differ
    diff --git a/build/tmp/test/jar_extract_879638899784250526_tmp b/build/tmp/test/jar_extract_879638899784250526_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_879638899784250526_tmp differ
    diff --git a/build/tmp/test/jar_extract_8824512571126389347_tmp b/build/tmp/test/jar_extract_8824512571126389347_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8824512571126389347_tmp differ
    diff --git a/build/tmp/test/jar_extract_8836475649396426244_tmp b/build/tmp/test/jar_extract_8836475649396426244_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8836475649396426244_tmp differ
    diff --git a/build/tmp/test/jar_extract_8844396540427782773_tmp b/build/tmp/test/jar_extract_8844396540427782773_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8844396540427782773_tmp differ
    diff --git a/build/tmp/test/jar_extract_8853326631724276943_tmp b/build/tmp/test/jar_extract_8853326631724276943_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8853326631724276943_tmp differ
    diff --git a/build/tmp/test/jar_extract_8856126515423536175_tmp b/build/tmp/test/jar_extract_8856126515423536175_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8856126515423536175_tmp differ
    diff --git a/build/tmp/test/jar_extract_8861220799648246823_tmp b/build/tmp/test/jar_extract_8861220799648246823_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8861220799648246823_tmp differ
    diff --git a/build/tmp/test/jar_extract_8862385996621339631_tmp b/build/tmp/test/jar_extract_8862385996621339631_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8862385996621339631_tmp differ
    diff --git a/build/tmp/test/jar_extract_8865224033911625993_tmp b/build/tmp/test/jar_extract_8865224033911625993_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8865224033911625993_tmp differ
    diff --git a/build/tmp/test/jar_extract_8865794712312219297_tmp b/build/tmp/test/jar_extract_8865794712312219297_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8865794712312219297_tmp differ
    diff --git a/build/tmp/test/jar_extract_886938348127038634_tmp b/build/tmp/test/jar_extract_886938348127038634_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_886938348127038634_tmp differ
    diff --git a/build/tmp/test/jar_extract_8880146316556298698_tmp b/build/tmp/test/jar_extract_8880146316556298698_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8880146316556298698_tmp differ
    diff --git a/build/tmp/test/jar_extract_8881676801188459630_tmp b/build/tmp/test/jar_extract_8881676801188459630_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8881676801188459630_tmp differ
    diff --git a/build/tmp/test/jar_extract_8887358897618514219_tmp b/build/tmp/test/jar_extract_8887358897618514219_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8887358897618514219_tmp differ
    diff --git a/build/tmp/test/jar_extract_889032979955498100_tmp b/build/tmp/test/jar_extract_889032979955498100_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_889032979955498100_tmp differ
    diff --git a/build/tmp/test/jar_extract_8902001785236628806_tmp b/build/tmp/test/jar_extract_8902001785236628806_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8902001785236628806_tmp differ
    diff --git a/build/tmp/test/jar_extract_8903745736816564621_tmp b/build/tmp/test/jar_extract_8903745736816564621_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8903745736816564621_tmp differ
    diff --git a/build/tmp/test/jar_extract_890405951887391418_tmp b/build/tmp/test/jar_extract_890405951887391418_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_890405951887391418_tmp differ
    diff --git a/build/tmp/test/jar_extract_8912461755949031540_tmp b/build/tmp/test/jar_extract_8912461755949031540_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8912461755949031540_tmp differ
    diff --git a/build/tmp/test/jar_extract_8926524972646245553_tmp b/build/tmp/test/jar_extract_8926524972646245553_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8926524972646245553_tmp differ
    diff --git a/build/tmp/test/jar_extract_893982263159919527_tmp b/build/tmp/test/jar_extract_893982263159919527_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_893982263159919527_tmp differ
    diff --git a/build/tmp/test/jar_extract_8961411901215523645_tmp b/build/tmp/test/jar_extract_8961411901215523645_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8961411901215523645_tmp differ
    diff --git a/build/tmp/test/jar_extract_8964395010812472824_tmp b/build/tmp/test/jar_extract_8964395010812472824_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8964395010812472824_tmp differ
    diff --git a/build/tmp/test/jar_extract_8986740739403168840_tmp b/build/tmp/test/jar_extract_8986740739403168840_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8986740739403168840_tmp differ
    diff --git a/build/tmp/test/jar_extract_899255958662614595_tmp b/build/tmp/test/jar_extract_899255958662614595_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_899255958662614595_tmp differ
    diff --git a/build/tmp/test/jar_extract_8995661636667210441_tmp b/build/tmp/test/jar_extract_8995661636667210441_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_8995661636667210441_tmp differ
    diff --git a/build/tmp/test/jar_extract_9000252639880317099_tmp b/build/tmp/test/jar_extract_9000252639880317099_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9000252639880317099_tmp differ
    diff --git a/build/tmp/test/jar_extract_9020258555989037560_tmp b/build/tmp/test/jar_extract_9020258555989037560_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9020258555989037560_tmp differ
    diff --git a/build/tmp/test/jar_extract_9025779160413160078_tmp b/build/tmp/test/jar_extract_9025779160413160078_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9025779160413160078_tmp differ
    diff --git a/build/tmp/test/jar_extract_9044605022994973351_tmp b/build/tmp/test/jar_extract_9044605022994973351_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9044605022994973351_tmp differ
    diff --git a/build/tmp/test/jar_extract_905223834814935613_tmp b/build/tmp/test/jar_extract_905223834814935613_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_905223834814935613_tmp differ
    diff --git a/build/tmp/test/jar_extract_9063389852332752723_tmp b/build/tmp/test/jar_extract_9063389852332752723_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9063389852332752723_tmp differ
    diff --git a/build/tmp/test/jar_extract_9077499317628443302_tmp b/build/tmp/test/jar_extract_9077499317628443302_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9077499317628443302_tmp differ
    diff --git a/build/tmp/test/jar_extract_9097180622414233895_tmp b/build/tmp/test/jar_extract_9097180622414233895_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9097180622414233895_tmp differ
    diff --git a/build/tmp/test/jar_extract_9097182958744515061_tmp b/build/tmp/test/jar_extract_9097182958744515061_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9097182958744515061_tmp differ
    diff --git a/build/tmp/test/jar_extract_9100159888127510872_tmp b/build/tmp/test/jar_extract_9100159888127510872_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9100159888127510872_tmp differ
    diff --git a/build/tmp/test/jar_extract_9102402183618410228_tmp b/build/tmp/test/jar_extract_9102402183618410228_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9102402183618410228_tmp differ
    diff --git a/build/tmp/test/jar_extract_9102961568194807074_tmp b/build/tmp/test/jar_extract_9102961568194807074_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9102961568194807074_tmp differ
    diff --git a/build/tmp/test/jar_extract_9104596911632574555_tmp b/build/tmp/test/jar_extract_9104596911632574555_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9104596911632574555_tmp differ
    diff --git a/build/tmp/test/jar_extract_9105709067886906075_tmp b/build/tmp/test/jar_extract_9105709067886906075_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9105709067886906075_tmp differ
    diff --git a/build/tmp/test/jar_extract_9108645052489697646_tmp b/build/tmp/test/jar_extract_9108645052489697646_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9108645052489697646_tmp differ
    diff --git a/build/tmp/test/jar_extract_9112785307967331322_tmp b/build/tmp/test/jar_extract_9112785307967331322_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9112785307967331322_tmp differ
    diff --git a/build/tmp/test/jar_extract_9150473949843020202_tmp b/build/tmp/test/jar_extract_9150473949843020202_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9150473949843020202_tmp differ
    diff --git a/build/tmp/test/jar_extract_9150652172615995110_tmp b/build/tmp/test/jar_extract_9150652172615995110_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9150652172615995110_tmp differ
    diff --git a/build/tmp/test/jar_extract_9158950518024154061_tmp b/build/tmp/test/jar_extract_9158950518024154061_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9158950518024154061_tmp differ
    diff --git a/build/tmp/test/jar_extract_9169786215238935516_tmp b/build/tmp/test/jar_extract_9169786215238935516_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9169786215238935516_tmp differ
    diff --git a/build/tmp/test/jar_extract_9172591670056157021_tmp b/build/tmp/test/jar_extract_9172591670056157021_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9172591670056157021_tmp differ
    diff --git a/build/tmp/test/jar_extract_9174482268002056487_tmp b/build/tmp/test/jar_extract_9174482268002056487_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9174482268002056487_tmp differ
    diff --git a/build/tmp/test/jar_extract_9178985824625957618_tmp b/build/tmp/test/jar_extract_9178985824625957618_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9178985824625957618_tmp differ
    diff --git a/build/tmp/test/jar_extract_9203388737345345183_tmp b/build/tmp/test/jar_extract_9203388737345345183_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9203388737345345183_tmp differ
    diff --git a/build/tmp/test/jar_extract_9207660295342078925_tmp b/build/tmp/test/jar_extract_9207660295342078925_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9207660295342078925_tmp differ
    diff --git a/build/tmp/test/jar_extract_921460654146695031_tmp b/build/tmp/test/jar_extract_921460654146695031_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_921460654146695031_tmp differ
    diff --git a/build/tmp/test/jar_extract_9218964994969171300_tmp b/build/tmp/test/jar_extract_9218964994969171300_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9218964994969171300_tmp differ
    diff --git a/build/tmp/test/jar_extract_921983023450061924_tmp b/build/tmp/test/jar_extract_921983023450061924_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_921983023450061924_tmp differ
    diff --git a/build/tmp/test/jar_extract_9219901177718624580_tmp b/build/tmp/test/jar_extract_9219901177718624580_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_9219901177718624580_tmp differ
    diff --git a/build/tmp/test/jar_extract_924425641405604646_tmp b/build/tmp/test/jar_extract_924425641405604646_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_924425641405604646_tmp differ
    diff --git a/build/tmp/test/jar_extract_925923872038805036_tmp b/build/tmp/test/jar_extract_925923872038805036_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_925923872038805036_tmp differ
    diff --git a/build/tmp/test/jar_extract_941785649724124717_tmp b/build/tmp/test/jar_extract_941785649724124717_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_941785649724124717_tmp differ
    diff --git a/build/tmp/test/jar_extract_953448338620122234_tmp b/build/tmp/test/jar_extract_953448338620122234_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_953448338620122234_tmp differ
    diff --git a/build/tmp/test/jar_extract_961744587737686459_tmp b/build/tmp/test/jar_extract_961744587737686459_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_961744587737686459_tmp differ
    diff --git a/build/tmp/test/jar_extract_963120033770199445_tmp b/build/tmp/test/jar_extract_963120033770199445_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_963120033770199445_tmp differ
    diff --git a/build/tmp/test/jar_extract_969859706295558327_tmp b/build/tmp/test/jar_extract_969859706295558327_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_969859706295558327_tmp differ
    diff --git a/build/tmp/test/jar_extract_97330561438880594_tmp b/build/tmp/test/jar_extract_97330561438880594_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_97330561438880594_tmp differ
    diff --git a/build/tmp/test/jar_extract_976240258577324381_tmp b/build/tmp/test/jar_extract_976240258577324381_tmp
    new file mode 100644
    index 00000000..6fe65c5e
    Binary files /dev/null and b/build/tmp/test/jar_extract_976240258577324381_tmp differ
    diff --git a/build/tmp/test/jar_extract_976454718234463594_tmp b/build/tmp/test/jar_extract_976454718234463594_tmp
    new file mode 100644
    index 00000000..f9e2430b
    Binary files /dev/null and b/build/tmp/test/jar_extract_976454718234463594_tmp differ
    diff --git a/build/tmp/test/jar_extract_983891481007754754_tmp b/build/tmp/test/jar_extract_983891481007754754_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_983891481007754754_tmp differ
    diff --git a/build/tmp/test/jar_extract_98519772291726057_tmp b/build/tmp/test/jar_extract_98519772291726057_tmp
    new file mode 100644
    index 00000000..e068ae7e
    Binary files /dev/null and b/build/tmp/test/jar_extract_98519772291726057_tmp differ
    diff --git a/docs/AgentNodePlugin.md b/docs/AgentNodePlugin.md
    new file mode 100644
    index 00000000..74a72bab
    --- /dev/null
    +++ b/docs/AgentNodePlugin.md
    @@ -0,0 +1,25 @@
    +## [AgentNodePlugin](../src/AgentNodePlugin.groovy)
    +
    +This plugin allows you to run the terraform stages in a docker container. This **DOES NOT WORK WITH AWSSUME** you should be using iam_block with aws provider with terraform.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline']) _
    +
    +Jenkinsfile.init(this)
    +
    +AgentNodePlugin.withAgentDockerImage('hashicorp/terraform:0.10.2')
    +               .withAgentDockerImageOptions("--entrypoint=''")
    +               .init()
    +
    +def validate = new TerraformValidateStage()
    +
    +def deployQA = new TerraformEnvironmentStage('qa')
    +def deployUat = new TerraformEnvironmentStage('uat')
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQA)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/AnsiColorPlugin.md b/docs/AnsiColorPlugin.md
    new file mode 100644
    index 00000000..e6734141
    --- /dev/null
    +++ b/docs/AnsiColorPlugin.md
    @@ -0,0 +1,26 @@
    +## [AnsiColorPlugin](../src/AnsiColorPlugin.groovy)
    +
    +Enable this plugin to color the output for terraform plan and apply.
    +
    +One-time setup:
    +* Install the [AnsiColorPlugin](https://wiki.jenkins.io/display/JENKINS/AnsiColor+Plugin) on your Jenkins master.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v3.10']) _
    +
    +Jenkinsfile.init(this, env)
    +
    +AnsiColorPlugin.init() // Decorate your TerraformEnvironmentStages with the AnsiColor plugin
    +
    +def validate = new TerraformValidateStage()
    +
    +def deployQa = new TerraformEnvironmentStage('qa')
    +def deployUat = new TerraformEnvironmentStage('uat')
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQa)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/AwssumePlugin.md b/docs/AwssumePlugin.md
    new file mode 100644
    index 00000000..77a6cdd3
    --- /dev/null
    +++ b/docs/AwssumePlugin.md
    @@ -0,0 +1,37 @@
    +## [AwssumePlugin](./src/AwssumePlugin.groovy)
    +
    +Enable this plugin to wrap your terraform commands with the [awssume](https://github.com/manheim/awssume) gem, allowing you to assume roles across accounts.
    +
    +One-time setup:
    +* Install the awssume gem on your Jenkins slaves.
    +* Optional: Define global variables that match your environment name, to a role across all pipelines with that environment:
    +  * QA_AWS_ROLE_ARN (all 'qa' environments will assume the role specified by this variable)
    +  * UAT_AWS_ROLE_ARN (all 'uat' environments will assume the role specified by this variable)
    +  * PROD_AWS_ROLE_ARN (all 'prod' environments will assume the role specified by this variable)
    +
    +Awssume will assume the role for any environment where a `AWS_ROLE_ARN` is defined, or for any environment that matches a global `<environment>_AWS_ROLE_ARN`.  If neither variables are specified, the use of Awssume will be skipped.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v3.10']) _
    +
    +Jenkinsfile.init(this, env)
    +
    +AwssumePlugin.init() // Decorate your TerraformEnvironmentStages with the Awssume plugin
    +
    +def validate = new TerraformValidateStage()
    +
    +// Run terraform apply and plan using the AWS Role defined by either AWS_ROLE_ARN or QA_AWS_ROLE_ARN
    +def deployQA = new TerraformEnvironmentStage('qa')
    +
    +// Run terraform apply and plan using the AWS Role defined by either AWS_ROLE_ARN or UAT_AWS_ROLE_ARN
    +def deployUat = new TerraformEnvironmentStage('uat')
    +
    +// Run terraform apply and plan using the AWS Role defined by either AWS_ROLE_ARN or PROD_AWS_ROLE_ARN
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQa)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/BuildStage.md b/docs/BuildStage.md
    new file mode 100644
    index 00000000..0d49a374
    --- /dev/null
    +++ b/docs/BuildStage.md
    @@ -0,0 +1,15 @@
    +# BuildStage
    +
    +Some pipelines dealing with application code may to build deployment artifacts. The BuildStage can be used to accommodate this. Create a BuildStage then add it to your other linked stages in the appropriate position. Below is an example for building a deployment artifact which is later used to deploy to QA.
    +
    +Let terraform-pipline know which build artifacts to save and make available using the `saveArtifact` method.  Artifacts that match the pattern passed to `saveArtifact` will automatically be stashed after BuildStage, and unstashed in each subsequent TerraformEnvironmentStage.
    +
    +```
    +// Jenkinsfile
    +...
    +def build = new BuildStage().saveArtifact('*/target/MyApp.war')
    +
    +validate.then(build)
    +        .then(deployQa) // MyApp.war will be available in the working directory
    +...
    +```
    diff --git a/docs/ConditionalApplyPlugin.md b/docs/ConditionalApplyPlugin.md
    new file mode 100644
    index 00000000..e0ba167c
    --- /dev/null
    +++ b/docs/ConditionalApplyPlugin.md
    @@ -0,0 +1,6 @@
    +## [ConditionalApplyPlugin](../src/ConditionalApplyPlugin.groovy)
    +
    +This plugin is enabled by default.
    +
    +Changes should be applied through one and only one branch - master.  The ConditionalApplyPlugin enforces this by making the "Confirm" and "Apply" steps of a TerraformEnvironmentStage visible only on the master branch.  You can continue to use branches and PullRequests, however, branches and PullRequests will only run the Plan step for each environment, and skip over the Confirm/Apply steps.
    +
    diff --git a/docs/ConfirmApplyPlugin.md b/docs/ConfirmApplyPlugin.md
    new file mode 100644
    index 00000000..205a4c0d
    --- /dev/null
    +++ b/docs/ConfirmApplyPlugin.md
    @@ -0,0 +1,12 @@
    +## [ConfirmApplyPlugin](../src/ConfirmApplyPlugin.groovy)
    +
    +This plugin is enabled by default.
    +
    +It's a good practice to review the terraform plan before applying changes to any environment, to confirm that the changes that are being applied are the same changes that are expected.  The ConfirmApplyPlugin will pause your pipeline after the Plan step, allowing a human to review the changes.  A human must then manually Confirm the changes by clicking on the pipeline, before the changes are applied.
    +
    +The pipeline will pause for a limited amount of time - 15 minutes.  Once that timeout is exceeded, that particular pipeline run will be canceled.
    +
    +This functionality of this plugin can be disabled with the following configuration:
    +
    +```
    +ConfirmApplyPlugin.disable()
    diff --git a/docs/ConsulBackendPlugin.md b/docs/ConsulBackendPlugin.md
    new file mode 100644
    index 00000000..7e726d83
    --- /dev/null
    +++ b/docs/ConsulBackendPlugin.md
    @@ -0,0 +1,44 @@
    +## [ConsulBackendPlugin](../src/ConsulBackendPlugin.groovy)
    +
    +Enable this plugin to store state in Consul.
    +
    +Terraform state can be stored in consul with the following configuration:
    +
    +```
    +# main.tf
    +
    +terraform {
    +  backend "consul" { }
    +}
    +```
    +
    +See: https://www.terraform.io/docs/backends/types/consul.html
    +
    +The configuration above still requires you to tell Consul the path where environment states should be managed, but hardcoding that value into your terraform template prevents you from reusing the same template across all your environments.  Ideally, you would provide a variable for the path for each environment, but terraform treats backend configuration as special, and you can't use normal variables.  Instead terraform provides a separate `-backend-config` flag for `terraform init` to configure different backends (See: https://www.terraform.io/docs/backends/config.html#partial-configuration).
    +
    +By enabling this plugin, each environment state will automatically be given a unique consul path to store state, in the form `-backend-config=path=terraform/<GitOrg>/<GitRepo>/<environment>`.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v5.0']) _
    +
    +Jenkinsfile.init(this)
    +
    +ConsulBackendPlugin.init()
    +
    +def validate = new TerraformValidateStage()
    +
    +// terraform init -backend-config=path=/<GitOrg>/<GitRepo>/qa
    +def deployQa = new TerraformEnvironmentStage('qa')
    +
    +// terraform init -backend-config=path=/<GitOrg>/<GitRepo>/uat
    +def deployUat = new TerraformEnvironmentStage('uat')
    +
    +// terraform init -backend-config=path=/<GitOrg>/<GitRepo>/prod
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQA)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/CredentialsPlugin.md b/docs/CredentialsPlugin.md
    new file mode 100644
    index 00000000..0be81199
    --- /dev/null
    +++ b/docs/CredentialsPlugin.md
    @@ -0,0 +1,31 @@
    +## [CredentialsPlugin](../src/CredentialsPlugin.groovy)
    +
    +Enable this plugin to inject credentials into your BuildStage using the [Jenkins Credentials Plugin](https://wiki.jenkins.io/display/JENKINS/Credentials+Plugin).
    +
    +One-time setup:
    +* Install the [Jenkins Credentials Plugin](https://wiki.jenkins.io/display/JENKINS/Credentials+Plugin) on your Jenkins master.
    +* Define a credential that you want to inject.  Currently, only usernamePassword credentials are supported.
    +
    +Specify the credential that you want to inject during the BuildStage.  Optionally provide custom username/password environment variables that will contain the credential values for your use.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v5.0']) _
    +
    +Jenkinsfile.init(this)
    +
    +CredentialsPlugin.withBuildCredentials('my-credentials').init()
    +
    +def validate = new TerraformValidateStage()
    +// MY_CREDENTIALS_USERNAME and MY_CREDENTIALS_PASSWORD will contain the respective username/password values of the 'my-credentials' credential.
    +def build = new BuildStage()
    +def deployQA = new TerraformEnvironmentStage('qa')
    +def deployUat = new TerraformEnvironmentStage('uat')
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(build)
    +        .then(deployQA)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/CrqPlugin.md b/docs/CrqPlugin.md
    new file mode 100644
    index 00000000..6c494d8e
    --- /dev/null
    +++ b/docs/CrqPlugin.md
    @@ -0,0 +1,40 @@
    +## [CrqPlugin](../src/CrqPlugin.groovy)
    +
    +Enable this plugin to wrap your terraform apply step with an automated Change Request, using the manheim_remedier ruby gem.
    +
    +One-time setup:
    +* Install the manheim_remedier gem on your Jenkins slaves.
    +* Optional: Define global variables that match your environment name, to enable automated Change Requests across all pipelines with that environment:
    +  * UAT_CRQ_ENVIRONMENT = 'Cloud-CRQ' (all 'uat' environments will be assigned a CRQ_ENVIRONMENT = 'Cloud-CRQ')
    +  * PROD_CRQ_ENVIRONMENT = 'Cloud' (all 'prod' environments will be assigned a CRQ_ENVIRONMENT = 'Cloud')
    +* Define the following environment variables, which will be used when submitting a Change Request:
    +  * DEFAULT_PIPELINE_CRQ_FIRST_NAME
    +  * DEFAULT_PIPELINE_CRQ_LAST_NAME
    +  * DEFAULT_PIPELINE_CRQ_LOGIN
    +
    +An automated Change Request will only be created for environments that specify a `CRQ_ENVIRONMENT`, or match a global `<environment>_CRQ_ENVIRONMENT`.  For each such environments, a Change Request will be opened before applying the terraform plan, then closed and marked as either successful or failed, depending on the result of `terraform apply`.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v5.0']) _
    +
    +Jenkinsfile.init(this)
    +
    +CrqPlugin.init() // Enable AutoCRQ's
    +
    +def validate = new TerraformValidateStage()
    +
    +// Do not define either a CRQ_ENVIRONMENT or a QA_CRQ_ENVIRONMENT, so that a Change Request isn't created.
    +def deployQA = new TerraformEnvironmentStage('qa')
    +
    +// Define a global UAT_CRQ_ENVIRONMENT, or set a uat-specific CRQ_ENVIRONMENT variable to trigger a Change Request here
    +def deployUat = new TerraformEnvironmentStage('uat')
    +
    +// Define a global PROD_CRQ_ENVIRONMENT, or set a prod-specific CRQ_ENVIRONMENT variable to trigger a Change Request here
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQA)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/DefaultEnvironmentPlugin.md b/docs/DefaultEnvironmentPlugin.md
    new file mode 100644
    index 00000000..1dd51d3c
    --- /dev/null
    +++ b/docs/DefaultEnvironmentPlugin.md
    @@ -0,0 +1,6 @@
    +## [DefaultEnvironmentPlugin](../src/DefaultEnvironmentPlugin.groovy)
    +
    +This plugin is enabled by default.
    +
    +Provides a terraform variable `environment` to all TerraformEnvironmentStages by default, by setting an environment variable in the form `TF_VAR_environment`.  The value of `environment` is the same as the environment value that you passed when creating an instance of the TerraformEnvironmentStage.
    +
    diff --git a/docs/FileParametersPlugin.md b/docs/FileParametersPlugin.md
    new file mode 100644
    index 00000000..0cdf5f84
    --- /dev/null
    +++ b/docs/FileParametersPlugin.md
    @@ -0,0 +1,32 @@
    +## [FileParametersPlugin](../src/FileParametersPlugin.groovy)
    +
    +Enable this plugin to inject variables from a local properties file.
    +
    +The properties file should have variables in the form `KEY=VALUE`, with each variable on its own line.  Values can reference other existing environment variables defined elsewhere, using the [Jenkinsfile `env` variable](https://jenkins.io/doc/book/pipeline/jenkinsfile/#using-environment-variables), and [Groovy string interpolation](http://docs.groovy-lang.org/latest/html/documentation/#_string_interpolation).  Eg: `DATABASE_URL=${env.QA_DATABASE_URL}`.
    +
    +You should not store sensitive data in these properties files.  Instead, sensitive data should be stored with the [CredentialsPlugin](./src/CredentialsPlugin.groovy), [ParameterStoreBuildWrapperPlugin](#parameterstorebuildwrapperplugin) with encryption, or any other tool that supports safe storage.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v5.0']) _
    +
    +Jenkinsfile.init(this)
    +
    +FileParametersPlugin.init() // Enable FileParametersPlugin
    +
    +def validate = new TerraformValidateStage()
    +
    +// Inject all parameters in qa.properties
    +def deployQA = new TerraformEnvironmentStage('qa')
    +
    +// Inject all parameters in uat.properties
    +def deployUat = new TerraformEnvironmentStage('uat')
    +
    +// Inject all parameters in prod.properties
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQA)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/ParameterStoreBuildWrapperPlugin.md b/docs/ParameterStoreBuildWrapperPlugin.md
    new file mode 100644
    index 00000000..6abb9cff
    --- /dev/null
    +++ b/docs/ParameterStoreBuildWrapperPlugin.md
    @@ -0,0 +1,34 @@
    +## [ParameterStoreBuildWrapperPlugin](../src/ParameterStoreBuildWrapperPlugin.groovy)
    +
    +Enable this plugin to inject variables using the [AWS Parameter Store Build Wrapper Plugin](https://plugins.jenkins.io/aws-parameter-store)
    +
    +One-time step:
    +* Install the AWS Parameter Store Build Wrapper Plugin on your Jenkins master
    +* For cross-account deployments, create an AWS Credential with the id '&lt;ENVIRONMENT&gt;_PARAMETER_STORE_ACCESS' that provides access to ParameterStore for that account.
    +
    +By default, parameters will be retrieved from the ParameterStore path constructed from your project's Git Organization, Git Repository name, and environment.  Eg: If my terraform project were at https://github.com/Manheim/fake-terraform-project, then my 'qa' environment would receive parameters from the ParameterStore path '/Manheim/fake-terraform-project/qa'.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v5.0']) _
    +
    +Jenkinsfile.init(this)
    +
    +ParameterStoreBuildWrapperPlugin.init() // Enable ParameterStoreBuildWrapperPlugin
    +
    +def validate = new TerraformValidateStage()
    +
    +// Inject all parameters in /<GitOrg>/<GitRepo>/qa
    +def deployQA = new TerraformEnvironmentStage('qa')
    +
    +// Inject all parameters in /<GitOrg>/<GitRepo>/uat
    +def deployUat = new TerraformEnvironmentStage('uat')
    +
    +// Inject all parameters in /<GitOrg>/<GitRepo>/prod
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQA)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/ParameterStoreExecPlugin.md b/docs/ParameterStoreExecPlugin.md
    new file mode 100644
    index 00000000..32a95865
    --- /dev/null
    +++ b/docs/ParameterStoreExecPlugin.md
    @@ -0,0 +1,35 @@
    +## [ParameterStoreExecPlugin](../src/ParameterStoreExecPlugin.groovy)
    +
    +Enable this plugin to inject variables from AWS ParameterStore using [parameter-store-exec](https://github.com/cultureamp/parameter-store-exec).
    +
    +Prefer using the [ParameterStoreBuildWrapperPlugin](#ParameterStoreBuildWrapperPlugin) above if possible.
    +
    +One-time setup:
    +* Install parameter-store-exec on your Jenkins slaves.
    +
    +By default, parameters will be retrieved from the ParameterStore path constructed from your project's Git Organization, Git Repository name, and environment.  Eg: If my terraform project were at https://github.com/Manheim/fake-terraform-project, then my 'qa' environment would receive parameters from the ParameterStore path '/Manheim/fake-terraform-project/qa'.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v']) _
    +
    +Jenkinsfile.init(this)
    +
    +ParameterStoreExecPlugin.init() // Enable ParameterStoreExecPlugin
    +
    +def validate = new TerraformValidateStage()
    +
    +// Inject all parameters in /<GitOrg>/<GitRepo>/qa with parameter-store-exec
    +def deployQA = new TerraformEnvironmentStage('qa')
    +
    +// Inject all parameters in /<GitOrg>/<GitRepo>/uat with parameter-store-exec
    +def deployUat = new TerraformEnvironmentStage('uat')
    +
    +// Inject all parameters in /<GitOrg>/<GitRepo>/prod with parameter-store-exec
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQA)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/RegressionStage.md b/docs/RegressionStage.md
    new file mode 100644
    index 00000000..93c31557
    --- /dev/null
    +++ b/docs/RegressionStage.md
    @@ -0,0 +1,51 @@
    +# RegressionStage
    +
    +Some pipelines dealing with application code may need to run automation tests. The RegressionStage can be used to accommodate this. Create a RegressionStage then add it to your other linked stages in the appropriate position. Below is an example for running tests after a QA deployment:
    +```
    +// Jenkinsfile
    +...
    +def testQa = new RegressionStage()
    +
    +validate.then(deployQa)
    +        .then(testQa)
    +...
    +```
    +
    +By default, the RegressionStage will execute a `./bin/test.sh` script. If you wish to use a different path or script name, you can do so by passing it into the RegressionStage constructor:
    +```
    +// Jenkinsfile
    +...
    +def testQa = new RegressionStage('./some/other/location/some_other_test.sh')
    +
    +validate.then(deployQa)
    +        .then(testQa)
    +...
    +```
    +
    +If your test suite lives outside of the code, you can call `withScm()` and pass it the git URL of your automation test:
    +```
    +// Jenkinsfile
    +...
    +def testQa = new RegressionStage().withScm('git@SomeHost:SomeTeam/SomeAutomationRepository.git')
    +validate.then(deployQa)
    +        .then(testQa)
    +...
    +
    +```
    +
    +There could be instances where multiple repositories are required to execute automation tests (such as needing to clone application code as well as automation code). When calling `withScm()` more than once, the repositories become cumulative and it will check out all repositories into their respective subdirectories (named by the project name referenced by the git url). Below is an example of a scenario where the application repository and automation repository are both required. The test script to execute is also located in a subdirectory which we can use `changeDirectory()` so that we are in the appropriate directory.
    +
    +```
    +// Jenkinsfile
    +...
    +def testQa = new RegressionStage().withScm('git@SomeHost:SomeTeam/SomeAutomationRepository.git')
    +                                  .withScm('git@SomeHost:SomeTeam/SomeApplicationRepository.git')
    +                                  .changeDirectory('SomeAutomationRespository')
    +validate.then(deployQa)
    +        .then(testQa)
    +...
    +```
    +The above example will check out `git@SomeHost:SomeTeam/SomeAutomationRepository.git` into a subdirectory named `SomeAutomationRepository` and `git@SomeHost:SomeTeam/SomeApplicationRepository.git` into a subdirectory named `SomeApplicationRepository`.
    +
    +Note that if withScm is only called once, there will not be a subdirectory and it will check out the repository at the root.
    +
    diff --git a/docs/S3BackendPlugin.md b/docs/S3BackendPlugin.md
    new file mode 100644
    index 00000000..10a37103
    --- /dev/null
    +++ b/docs/S3BackendPlugin.md
    @@ -0,0 +1,74 @@
    +## [S3BackendPlugin](../src/S3BackendPlugin.groovy)
    +
    +Enable this plugin to store state in S3.
    +
    +One-time setup
    +
    +* Have a pre-created S3 bucket to store your state in.
    +
    +Terraform state can be stored in S3 with the following configuration, at minimum:
    +
    +```
    +# main.tf
    +
    +terraform {
    +  backend "s3" { }
    +}
    +```
    +
    +See: https://www.terraform.io/docs/backends/types/s3.html
    +
    +The configuration above still requires you to tell Terraform at minimum:
    +1. the bucket
    +2. the region of the bucket
    +3. the path to the environment-specific terraform state (an S3 Object key)
    +
    +Hardcoding these values into your terraform code would prevent you from reusing the same terraform templates across all of your environments.  Terraform allows you to parameterize these values, but they're treated differently from normal terraform variables.  A separate -backend-config flag for terraform init is used to configure individual backend variables (See: https://www.terraform.io/docs/backends/config.html#partial-configuration).  These flags will automatically be added to your terraform init command, based on the following:
    +
    +* Specify an S3 bucket to store your state, with `-backend-config=bucket=<value>` by setting any of the following:
    +    * An `S3_BACKEND_BUCKET` environment variable
    +    * An `${environment.toUpperCase()}_S3_BACKEND_BUCKET` environment variable
    +    * An `${environment}_S3_BACKEND_BUCKET` environment variable
    +* Specify the region of your S3 bucket, with `-backend-config=region=<value>` by setting any of the following:
    +    * An `S3_BACKEND_REGION` environment variable
    +    * An `${environment.toUpperCase()}_S3_BACKEND_REGION` environment variable
    +    * An `${environment}_S3_BACKEND_REGION` environment variable
    +* (Optional) Enable state locking and consistency checking via Dynamo DB, with `-backend-config=dynamodb_table=<value>` by setting any of the following:
    +    * An `S3_BACKEND_DYNAMODB_TABLE` environment
    +    * An `${environment.toUpperCase()}_S3_BACKEND_DYNAMODB_TABLE` environment
    +    * An `${environment}_S3_BACKEND_DYNAMODB_TABLE` environment
    +
    +Each environment state will automatically be given a unique path to an S3 object, in the form `-backend-config=key=terraform/<GitOrg>/<GitRepo>/<environment>`.  If you wish to use a different key, you can specify a custom environment-specific key by setting an `S3BackendPlugin.keyPattern` Closure. Eg:
    +
    +```
    +S3BackendPlugin.keyPattern = { String env -> "customPatternFor/entropy/${env}" }
    +S3BackendPlugin.init()
    +```
    +
    +Example pipeline using the S3BackedPlugin:
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v5.0']) _
    +
    +Jenkinsfile.init(this)
    +
    +S3BackendPlugin.init()
    +
    +def validate = new TerraformValidateStage()
    +
    +// terraform init -backend-config=key=terraform/<GitOrg>/<GitRepo>/qa
    +def deployQA = new TerraformEnvironmentStage('qa')
    +
    +// terraform init -backend-config=key=terraform/<GitOrg>/<GitRepo>/uat
    +def deployUat = new TerraformEnvironmentStage('uat')
    +
    +// terraform init -backend-config=key=terraform/<GitOrg>/<GitRepo>/prod
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQa)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    +
    diff --git a/docs/TerraformDirectoryPlugin.md b/docs/TerraformDirectoryPlugin.md
    new file mode 100644
    index 00000000..dbad251c
    --- /dev/null
    +++ b/docs/TerraformDirectoryPlugin.md
    @@ -0,0 +1,27 @@
    +## [TerraformDirectoryPlugin](../src/TerraformDirectoryPlugin.groovy)
    +
    +This plugin allows Terraform to run in a specific directory so that the number of files at the root of any given project can be limited.
    +
    +It works by appending the directory to the end of any Terraform command run by terraform-pipeline. You can either specify a directory when initializing the plugin, or it will default to the `./terraform/` directory.
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v5.0']) _
    +
    +Jenkinsfile.init(this)
    +
    +// Using withDirectory to initialize here would cause all terraform
    +// commands to run in the ./xyz/ directory
    +TerraformDirectoryPlugin.withDirectory('./xyz/').init()
    +
    +def validate = new TerraformValidateStage()
    +
    +def deployQA = new TerraformEnvironmentStage('qa')
    +def deployUat = new TerraformEnvironmentStage('uat')
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQA)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/docs/WithAwsPlugin.md b/docs/WithAwsPlugin.md
    new file mode 100644
    index 00000000..3ef2dc8d
    --- /dev/null
    +++ b/docs/WithAwsPlugin.md
    @@ -0,0 +1,62 @@
    +## [WithAwsPlugin](../src/WithAwsPlugin.groovy)
    +
    +Enable this plugin to manage AWS Authentication with the [pipeline-aws-plugin](https://github.com/jenkinsci/pipeline-aws-plugin).
    +
    +One-time setup
    +
    +* Have the [pipeline-aws-plugin] installed on your Jenkins instance.
    +* (Optional) Define an AWS_ROLE_ARN variable, or environment-specific `${env}_AWS_ROLE_ARN`
    +
    +Example pipeline using the WithAwsPlugin using an explicit role:
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v4.3']) _
    +
    +Jenkinsfile.init(this)
    +
    +WithAwsPlugin.withRole(MY_ROLE_ARN).init()
    +
    +def validate = new TerraformValidateStage()
    +
    +// withAws(role: MY_ROLE_ARN)
    +def deployQA = new TerraformEnvironmentStage('qa')
    +
    +// withAws(role: MY_ROLE_ARN)
    +def deployUat = new TerraformEnvironmentStage('uat')
    +
    +// withAws(role: MY_ROLE_ARN)
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQa)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    +
    +Example pipeline using the WithAwsPlugin using implicit roles:
    +
    +```
    +// Jenkinsfile
    +@Library(['terraform-pipeline@v4.3']) _
    +
    +Jenkinsfile.init(this)
    +
    +WithAwsPlugin.withRole().init()
    +
    +def validate = new TerraformValidateStage()
    +
    +// withAws(role: AWS_ROLE_ARN) or withAws(role: QA_AWS_ROLE_ARN), where either AWS_ROLE_ARN or QA_AWS_ROLE_ARN are defined.  Nothing if neither is defined.
    +def deployQA = new TerraformEnvironmentStage('qa')
    +
    +// withAws(role: AWS_ROLE_ARN) or withAws(role: UAT_AWS_ROLE_ARN), where either AWS_ROLE_ARN or UAT_AWS_ROLE_ARN are defined.  Nothing if neither is defined.
    +def deployUat = new TerraformEnvironmentStage('uat')
    +
    +// withAws(role: AWS_ROLE_ARN) or withAws(role: PROD_AWS_ROLE_ARN), where either AWS_ROLE_ARN or PROD_AWS_ROLE_ARN are defined.  Nothing if neither is defined.
    +def deployProd = new TerraformEnvironmentStage('prod')
    +
    +validate.then(deployQa)
    +        .then(deployUat)
    +        .then(deployProd)
    +        .build()
    +```
    diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
    new file mode 100644
    index 00000000..758de960
    Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
    diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
    new file mode 100644
    index 00000000..75b8c7c8
    --- /dev/null
    +++ b/gradle/wrapper/gradle-wrapper.properties
    @@ -0,0 +1,5 @@
    +distributionBase=GRADLE_USER_HOME
    +distributionPath=wrapper/dists
    +distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-bin.zip
    +zipStoreBase=GRADLE_USER_HOME
    +zipStorePath=wrapper/dists
    diff --git a/gradlew b/gradlew
    new file mode 100755
    index 00000000..cccdd3d5
    --- /dev/null
    +++ b/gradlew
    @@ -0,0 +1,172 @@
    +#!/usr/bin/env sh
    +
    +##############################################################################
    +##
    +##  Gradle start up script for UN*X
    +##
    +##############################################################################
    +
    +# Attempt to set APP_HOME
    +# Resolve links: $0 may be a link
    +PRG="$0"
    +# Need this for relative symlinks.
    +while [ -h "$PRG" ] ; do
    +    ls=`ls -ld "$PRG"`
    +    link=`expr "$ls" : '.*-> \(.*\)$'`
    +    if expr "$link" : '/.*' > /dev/null; then
    +        PRG="$link"
    +    else
    +        PRG=`dirname "$PRG"`"/$link"
    +    fi
    +done
    +SAVED="`pwd`"
    +cd "`dirname \"$PRG\"`/" >/dev/null
    +APP_HOME="`pwd -P`"
    +cd "$SAVED" >/dev/null
    +
    +APP_NAME="Gradle"
    +APP_BASE_NAME=`basename "$0"`
    +
    +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
    +DEFAULT_JVM_OPTS=""
    +
    +# Use the maximum available, or set MAX_FD != -1 to use that value.
    +MAX_FD="maximum"
    +
    +warn () {
    +    echo "$*"
    +}
    +
    +die () {
    +    echo
    +    echo "$*"
    +    echo
    +    exit 1
    +}
    +
    +# OS specific support (must be 'true' or 'false').
    +cygwin=false
    +msys=false
    +darwin=false
    +nonstop=false
    +case "`uname`" in
    +  CYGWIN* )
    +    cygwin=true
    +    ;;
    +  Darwin* )
    +    darwin=true
    +    ;;
    +  MINGW* )
    +    msys=true
    +    ;;
    +  NONSTOP* )
    +    nonstop=true
    +    ;;
    +esac
    +
    +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
    +
    +# Determine the Java command to use to start the JVM.
    +if [ -n "$JAVA_HOME" ] ; then
    +    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
    +        # IBM's JDK on AIX uses strange locations for the executables
    +        JAVACMD="$JAVA_HOME/jre/sh/java"
    +    else
    +        JAVACMD="$JAVA_HOME/bin/java"
    +    fi
    +    if [ ! -x "$JAVACMD" ] ; then
    +        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
    +
    +Please set the JAVA_HOME variable in your environment to match the
    +location of your Java installation."
    +    fi
    +else
    +    JAVACMD="java"
    +    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
    +
    +Please set the JAVA_HOME variable in your environment to match the
    +location of your Java installation."
    +fi
    +
    +# Increase the maximum file descriptors if we can.
    +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
    +    MAX_FD_LIMIT=`ulimit -H -n`
    +    if [ $? -eq 0 ] ; then
    +        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
    +            MAX_FD="$MAX_FD_LIMIT"
    +        fi
    +        ulimit -n $MAX_FD
    +        if [ $? -ne 0 ] ; then
    +            warn "Could not set maximum file descriptor limit: $MAX_FD"
    +        fi
    +    else
    +        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
    +    fi
    +fi
    +
    +# For Darwin, add options to specify how the application appears in the dock
    +if $darwin; then
    +    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
    +fi
    +
    +# For Cygwin, switch paths to Windows format before running java
    +if $cygwin ; then
    +    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
    +    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
    +    JAVACMD=`cygpath --unix "$JAVACMD"`
    +
    +    # We build the pattern for arguments to be converted via cygpath
    +    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
    +    SEP=""
    +    for dir in $ROOTDIRSRAW ; do
    +        ROOTDIRS="$ROOTDIRS$SEP$dir"
    +        SEP="|"
    +    done
    +    OURCYGPATTERN="(^($ROOTDIRS))"
    +    # Add a user-defined pattern to the cygpath arguments
    +    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
    +        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
    +    fi
    +    # Now convert the arguments - kludge to limit ourselves to /bin/sh
    +    i=0
    +    for arg in "$@" ; do
    +        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
    +        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
    +
    +        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
    +            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
    +        else
    +            eval `echo args$i`="\"$arg\""
    +        fi
    +        i=$((i+1))
    +    done
    +    case $i in
    +        (0) set -- ;;
    +        (1) set -- "$args0" ;;
    +        (2) set -- "$args0" "$args1" ;;
    +        (3) set -- "$args0" "$args1" "$args2" ;;
    +        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
    +        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
    +        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
    +        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
    +        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
    +        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
    +    esac
    +fi
    +
    +# Escape application args
    +save () {
    +    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
    +    echo " "
    +}
    +APP_ARGS=$(save "$@")
    +
    +# Collect all arguments for the java command, following the shell quoting and substitution rules
    +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
    +
    +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
    +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
    +  cd "$(dirname "$0")"
    +fi
    +
    +exec "$JAVACMD" "$@"
    diff --git a/gradlew.bat b/gradlew.bat
    new file mode 100644
    index 00000000..e95643d6
    --- /dev/null
    +++ b/gradlew.bat
    @@ -0,0 +1,84 @@
    +@if "%DEBUG%" == "" @echo off
    +@rem ##########################################################################
    +@rem
    +@rem  Gradle startup script for Windows
    +@rem
    +@rem ##########################################################################
    +
    +@rem Set local scope for the variables with windows NT shell
    +if "%OS%"=="Windows_NT" setlocal
    +
    +set DIRNAME=%~dp0
    +if "%DIRNAME%" == "" set DIRNAME=.
    +set APP_BASE_NAME=%~n0
    +set APP_HOME=%DIRNAME%
    +
    +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
    +set DEFAULT_JVM_OPTS=
    +
    +@rem Find java.exe
    +if defined JAVA_HOME goto findJavaFromJavaHome
    +
    +set JAVA_EXE=java.exe
    +%JAVA_EXE% -version >NUL 2>&1
    +if "%ERRORLEVEL%" == "0" goto init
    +
    +echo.
    +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
    +echo.
    +echo Please set the JAVA_HOME variable in your environment to match the
    +echo location of your Java installation.
    +
    +goto fail
    +
    +:findJavaFromJavaHome
    +set JAVA_HOME=%JAVA_HOME:"=%
    +set JAVA_EXE=%JAVA_HOME%/bin/java.exe
    +
    +if exist "%JAVA_EXE%" goto init
    +
    +echo.
    +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
    +echo.
    +echo Please set the JAVA_HOME variable in your environment to match the
    +echo location of your Java installation.
    +
    +goto fail
    +
    +:init
    +@rem Get command-line arguments, handling Windows variants
    +
    +if not "%OS%" == "Windows_NT" goto win9xME_args
    +
    +:win9xME_args
    +@rem Slurp the command line arguments.
    +set CMD_LINE_ARGS=
    +set _SKIP=2
    +
    +:win9xME_args_slurp
    +if "x%~1" == "x" goto execute
    +
    +set CMD_LINE_ARGS=%*
    +
    +:execute
    +@rem Setup the command line
    +
    +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
    +
    +@rem Execute Gradle
    +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
    +
    +:end
    +@rem End local scope for the variables with windows NT shell
    +if "%ERRORLEVEL%"=="0" goto mainEnd
    +
    +:fail
    +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
    +rem the _cmd.exe /c_ return code!
    +if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
    +exit /b 1
    +
    +:mainEnd
    +if "%OS%"=="Windows_NT" endlocal
    +
    +:omega
    diff --git a/images/MultibranchPipeline.png b/images/MultibranchPipeline.png
    new file mode 100644
    index 00000000..61790b46
    Binary files /dev/null and b/images/MultibranchPipeline.png differ
    diff --git a/images/NewItem.png b/images/NewItem.png
    new file mode 100644
    index 00000000..0498c485
    Binary files /dev/null and b/images/NewItem.png differ
    diff --git a/images/configure-project.png b/images/configure-project.png
    new file mode 100644
    index 00000000..15acbfe4
    Binary files /dev/null and b/images/configure-project.png differ
    diff --git a/images/custom-declarative-pipeline.png b/images/custom-declarative-pipeline.png
    new file mode 100644
    index 00000000..1bdcc5e8
    Binary files /dev/null and b/images/custom-declarative-pipeline.png differ
    diff --git a/images/declarative-pipeline.png b/images/declarative-pipeline.png
    new file mode 100644
    index 00000000..5e8086c4
    Binary files /dev/null and b/images/declarative-pipeline.png differ
    diff --git a/images/default-pipeline-success.png b/images/default-pipeline-success.png
    new file mode 100644
    index 00000000..adfaf354
    Binary files /dev/null and b/images/default-pipeline-success.png differ
    diff --git a/images/import-terraform-pipeline.png b/images/import-terraform-pipeline.png
    new file mode 100644
    index 00000000..facdc3fc
    Binary files /dev/null and b/images/import-terraform-pipeline.png differ
    diff --git a/images/restart-from-stage-numbers.png b/images/restart-from-stage-numbers.png
    new file mode 100644
    index 00000000..f61277c2
    Binary files /dev/null and b/images/restart-from-stage-numbers.png differ
    diff --git a/images/restart-from-stage.png b/images/restart-from-stage.png
    new file mode 100644
    index 00000000..da892f91
    Binary files /dev/null and b/images/restart-from-stage.png differ
    diff --git a/settings.gradle b/settings.gradle
    new file mode 100644
    index 00000000..b49a50a7
    --- /dev/null
    +++ b/settings.gradle
    @@ -0,0 +1,10 @@
    +/*
    + * This file was generated by the Gradle 'init' task.
    + *
    + * The settings file is used to specify which projects to include in your build.
    + * 
    + * Detailed information about configuring a multi-project build in Gradle can be found
    + * in the user guide at https://docs.gradle.org/4.8.1/userguide/multi_project_builds.html
    + */
    +
    +rootProject.name = 'terraform-pipeline'
    diff --git a/src/AgentNodePlugin.groovy b/src/AgentNodePlugin.groovy
    new file mode 100644
    index 00000000..4697bb15
    --- /dev/null
    +++ b/src/AgentNodePlugin.groovy
    @@ -0,0 +1,48 @@
    +import static TerraformValidateStage.ALL
    +import static TerraformEnvironmentStage.ALL
    +
    +public class AgentNodePlugin implements TerraformValidateStagePlugin, TerraformEnvironmentStagePlugin {
    +    private static String dockerImage
    +    private static String dockerOptions
    +
    +    AgentNodePlugin() {}
    +
    +    public static void init() {
    +        def plugin = new AgentNodePlugin()
    +
    +        TerraformValidateStage.addPlugin(plugin)
    +        TerraformEnvironmentStage.addPlugin(plugin)
    +    }
    +
    +    public static AgentNodePlugin withAgentDockerImage(String dockerImage) {
    +        this.dockerImage = dockerImage
    +        return this
    +    }
    +
    +    public static AgentNodePlugin withAgentDockerImageOptions(String dockerOptions) {
    +        this.dockerOptions = dockerOptions
    +        return this
    +    }
    +
    +    @Override
    +    public void apply(TerraformValidateStage stage) {
    +        stage.decorate(TerraformValidateStage.ALL, addAgent())
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        stage.decorate(TerraformEnvironmentStage.ALL, addAgent())
    +    }
    +
    +    public Closure addAgent() {
    +        return { closure ->
    +            if (dockerImage) {
    +                docker.image(this.dockerImage).inside(this.dockerOptions){
    +                    closure()
    +                }
    +            } else {
    +                closure()
    +            }
    +        }
    +    }
    +}
    diff --git a/src/AnsiColorPlugin.groovy b/src/AnsiColorPlugin.groovy
    new file mode 100644
    index 00000000..3f6210ce
    --- /dev/null
    +++ b/src/AnsiColorPlugin.groovy
    @@ -0,0 +1,20 @@
    +import static TerraformEnvironmentStage.PLAN
    +import static TerraformEnvironmentStage.APPLY
    +
    +class AnsiColorPlugin implements TerraformEnvironmentStagePlugin {
    +
    +    public static void init() {
    +        TerraformEnvironmentStage.addPlugin(new AnsiColorPlugin())
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        stage.decorate(PLAN, addColor())
    +        stage.decorate(APPLY, addColor())
    +    }
    +
    +    public static Closure addColor() {
    +        return { closure -> ansiColor('xterm') { closure() } }
    +    }
    +
    +}
    diff --git a/src/AwssumePlugin.groovy b/src/AwssumePlugin.groovy
    new file mode 100644
    index 00000000..b4a1d5d5
    --- /dev/null
    +++ b/src/AwssumePlugin.groovy
    @@ -0,0 +1,65 @@
    +class AwssumePlugin implements TerraformInitCommandPlugin, TerraformPlanCommandPlugin, TerraformApplyCommandPlugin {
    +    public static void init() {
    +        AwssumePlugin plugin = new AwssumePlugin()
    +
    +        TerraformInitCommand.addPlugin(plugin)
    +        TerraformPlanCommand.addPlugin(plugin)
    +        TerraformApplyCommand.addPlugin(plugin)
    +    }
    +
    +    @Override
    +    public void apply(TerraformInitCommand command) {
    +        applyToCommand(command)
    +    }
    +
    +    @Override
    +    public void apply(TerraformPlanCommand command) {
    +        applyToCommand(command)
    +    }
    +
    +    @Override
    +    public void apply(TerraformApplyCommand command) {
    +        applyToCommand(command)
    +    }
    +
    +    // We lost type safety here - we should have a TerraformCommand interface
    +    private void applyToCommand(command) {
    +        String environment = command.getEnvironment()
    +        String region = getRegion(environment)
    +        String iamArn = getAwsRoleArn(environment)
    +
    +        if (iamArn) {
    +            command.withPrefix("AWS_REGION=${region} AWS_ROLE_ARN=${iamArn} awssume")
    +        } else {
    +            println("No AWS_ROLE_ARN is set, so awssume will not be used for terraform in the ${environment} environment.")
    +        }
    +    }
    +
    +    public String getAwsRoleArn(String environment) {
    +        String role = Jenkinsfile.instance.getEnv()['AWS_ROLE_ARN']
    +
    +        if (role == null) {
    +            role = Jenkinsfile.instance.getEnv()["${environment.toUpperCase()}_AWS_ROLE_ARN"]
    +        }
    +
    +        if (role == null) {
    +            role = Jenkinsfile.instance.getEnv()["${environment}_AWS_ROLE_ARN"]
    +        }
    +
    +        return role
    +    }
    +
    +    public String getRegion(String environment) {
    +        String region = Jenkinsfile.instance.getEnv()['AWS_REGION']
    +
    +        if (region == null) {
    +            region = Jenkinsfile.instance.getEnv()["${environment.toUpperCase()}_AWS_REGION"]
    +        }
    +
    +        if (region == null) {
    +            region = Jenkinsfile.instance.getEnv()['AWS_DEFAULT_REGION']
    +        }
    +
    +        return region
    +    }
    +}
    diff --git a/src/BuildGraph.groovy b/src/BuildGraph.groovy
    new file mode 100644
    index 00000000..fa48cc4b
    --- /dev/null
    +++ b/src/BuildGraph.groovy
    @@ -0,0 +1,16 @@
    +class BuildGraph implements Stage {
    +    private List<Stage> stages
    +
    +    public BuildGraph(Stage start) {
    +        this.stages = [start]
    +    }
    +
    +    public Stage then(Stage nextStage) {
    +        this.stages << nextStage
    +        return this
    +    }
    +
    +    public void build() {
    +        Jenkinsfile.build(stages)
    +    }
    +}
    diff --git a/src/BuildStage.groovy b/src/BuildStage.groovy
    new file mode 100644
    index 00000000..908e63d8
    --- /dev/null
    +++ b/src/BuildStage.groovy
    @@ -0,0 +1,110 @@
    +import static TerraformEnvironmentStage.ALL
    +
    +class BuildStage implements Stage, TerraformEnvironmentStagePlugin {
    +    private final String ARTIFACT_STASH_KEY = 'buildArtifact'
    +
    +    public String buildCommand
    +
    +    private String artifactIncludePattern
    +    private Closure existingDecorations
    +
    +    private static plugins = []
    +
    +    public BuildStage() {
    +        this("./build.sh")
    +    }
    +
    +    public BuildStage(String buildCommand) {
    +        this.buildCommand = buildCommand
    +    }
    +
    +    public BuildStage saveArtifact(String artifactIncludePattern) {
    +        this.artifactIncludePattern = artifactIncludePattern
    +        TerraformEnvironmentStage.addPlugin(this)
    +        return this
    +    }
    +
    +    public Stage then(Stage nextStage) {
    +        return new BuildGraph(this).then(nextStage)
    +    }
    +
    +    public void build() {
    +        Jenkinsflie.build(pipelineConfiguration())
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        stage.decorate(ALL, unstashArtifact(ARTIFACT_STASH_KEY))
    +    }
    +
    +    private Closure unstashArtifact(String artifactStashKey) {
    +        return { closure ->
    +            unstash "${artifactStashKey}"
    +            closure()
    +        }
    +    }
    +
    +    private Closure pipelineConfiguration() {
    +        applyPlugins()
    +
    +        return {
    +            node {
    +                stage("build") {
    +                    applyDecorations(delegate) {
    +                        checkout(scm)
    +                        sh buildCommand
    +                        if (artifactIncludePattern != null) {
    +                            stash includes: artifactIncludePattern, name: ARTIFACT_STASH_KEY
    +                        }
    +                    }
    +                }
    +            }
    +        }
    +    }
    +
    +    private void applyDecorations(delegate, Closure stageClosure) {
    +        if (existingDecorations != null) {
    +            existingDecorations.delegate = delegate
    +            existingDecorations(stageClosure)
    +        } else {
    +            stageClosure.delegate = delegate
    +            stageClosure()
    +        }
    +    }
    +
    +    public static getPlugins() {
    +        return plugins
    +    }
    +
    +    public static void resetPlugins() {
    +        this.plugins = []
    +    }
    +
    +    public static void addPlugin(plugin) {
    +        plugins << plugin
    +    }
    +
    +    public void applyPlugins() {
    +        for (plugin in plugins) {
    +            plugin.apply(this)
    +        }
    +    }
    +
    +    public void decorate(Closure decoration) {
    +        if (existingDecorations == null) {
    +            existingDecorations = decoration
    +            existingDecorations.resolveStrategy = Closure.DELEGATE_FIRST
    +        } else {
    +            def newDecoration = { stage ->
    +                decoration.delegate = delegate
    +                decoration.resolveStrategy = Closure.DELEGATE_FIRST
    +                decoration() {
    +                    stage.delegate = delegate
    +                    existingDecorations.delegate = delegate
    +                    existingDecorations(stage)
    +                }
    +            }
    +            existingDecorations = newDecoration
    +        }
    +    }
    +}
    diff --git a/src/BuildStagePlugin.groovy b/src/BuildStagePlugin.groovy
    new file mode 100644
    index 00000000..04e8d30f
    --- /dev/null
    +++ b/src/BuildStagePlugin.groovy
    @@ -0,0 +1,3 @@
    +interface BuildStagePlugin {
    +    public void apply(BuildStage stage)
    +}
    diff --git a/src/ConditionalApplyPlugin.groovy b/src/ConditionalApplyPlugin.groovy
    new file mode 100644
    index 00000000..f24acbf9
    --- /dev/null
    +++ b/src/ConditionalApplyPlugin.groovy
    @@ -0,0 +1,39 @@
    +import static TerraformEnvironmentStage.CONFIRM
    +import static TerraformEnvironmentStage.APPLY
    +
    +public class ConditionalApplyPlugin implements TerraformEnvironmentStagePlugin {
    +
    +    private String branch
    +
    +    ConditionalApplyPlugin() {
    +        branch = 'master'
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        stage.decorateAround(CONFIRM, onlyOnExpectedBranch())
    +        stage.decorateAround(APPLY, onlyOnExpectedBranch())
    +    }
    +
    +    public Closure onlyOnExpectedBranch() {
    +        return  { closure ->
    +            if (shouldApply()) {
    +                closure()
    +            } else {
    +                echo "This stage can only be run on the '${branch}' branch, but this pipeline is currently running on branch '${Jenkinsfile.instance.getEnv().BRANCH_NAME}'.  Skipping stage."
    +            }
    +        }
    +    }
    +
    +    public boolean shouldApply() {
    +        if (branch == Jenkinsfile.instance.getEnv().BRANCH_NAME) {
    +            println("Current branch '${Jenkinsfile.instance.getEnv().BRANCH_NAME}' matches expected branch '${branch}', stage branch-condition is met and will run.")
    +            return true
    +        } else if (null == Jenkinsfile.instance.getEnv().BRANCH_NAME) {
    +            println("Current branch is null - you're probably using a single-branch job which doesn't make your branch name available.  Assume that apply should be enabled.")
    +            return true
    +        }
    +
    +        return false
    +    }
    +}
    diff --git a/src/ConfirmApplyPlugin.groovy b/src/ConfirmApplyPlugin.groovy
    new file mode 100644
    index 00000000..ef4fe53b
    --- /dev/null
    +++ b/src/ConfirmApplyPlugin.groovy
    @@ -0,0 +1,48 @@
    +import static TerraformEnvironmentStage.CONFIRM
    +
    +class ConfirmApplyPlugin implements TerraformEnvironmentStagePlugin {
    +
    +    public static enabled = true
    +
    +    ConfirmApplyPlugin() {
    +    }
    +
    +    public static void init() {
    +        TerraformEnvironmentStage.addPlugin(new ConfirmApplyPlugin())
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        if (enabled) {
    +            stage.decorate(CONFIRM, addConfirmation())
    +        }
    +    }
    +
    +    public static Closure addConfirmation() {
    +        return { closure ->
    +            // ask for human input
    +            try {
    +                timeout(time: 15, unit: 'MINUTES') {
    +                    input(
    +                        message: 'Are you absolutely sure the plan above is correct, and should be IMMEDIATELY DEPLOYED via "terraform apply"?',
    +                        ok: 'Run terraform APPLY now',
    +                        submitterParameter: 'approver'
    +                    )
    +                }
    +            } catch (ex) {
    +                throw ex
    +            }
    +            closure()
    +        }
    +    }
    +
    +    public static disable() {
    +        this.enabled = false
    +        return this
    +    }
    +
    +    public static enable() {
    +        this.enabled = true
    +        return this
    +    }
    +}
    diff --git a/src/ConsulBackendPlugin.groovy b/src/ConsulBackendPlugin.groovy
    new file mode 100644
    index 00000000..2583a0a7
    --- /dev/null
    +++ b/src/ConsulBackendPlugin.groovy
    @@ -0,0 +1,38 @@
    +class ConsulBackendPlugin implements TerraformInitCommandPlugin {
    +
    +    public static String defaultAddress
    +    public static Closure pathPattern
    +
    +    public static void init() {
    +        ConsulBackendPlugin plugin = new ConsulBackendPlugin()
    +
    +        TerraformInitCommand.addPlugin(plugin)
    +    }
    +
    +    @Override
    +    public void apply(TerraformInitCommand command) {
    +        String environment = command.getEnvironment()
    +        String backendPath = getBackendPath(environment)
    +        command.withBackendConfig("path=${backendPath}")
    +
    +        String consulAddress = getConsulAddress()
    +        if (consulAddress) {
    +            command.withBackendConfig("address=${consulAddress}")
    +        }
    +    }
    +
    +    public String getBackendPath(String environment) {
    +        Closure backendPathPattern = pathPattern
    +
    +        if (backendPathPattern == null)  {
    +            String repoSlug = Jenkinsfile.instance.getStandardizedRepoSlug()
    +            backendPathPattern = { String env -> "terraform/${repoSlug}_${env}" }
    +        }
    +
    +        return backendPathPattern.call(environment)
    +    }
    +
    +    public String getConsulAddress() {
    +        return defaultAddress ?: Jenkinsfile.instance.getEnv().DEFAULT_CONSUL_ADDRESS
    +    }
    +}
    diff --git a/src/CredentialsPlugin.groovy b/src/CredentialsPlugin.groovy
    new file mode 100644
    index 00000000..ee939c50
    --- /dev/null
    +++ b/src/CredentialsPlugin.groovy
    @@ -0,0 +1,61 @@
    +class CredentialsPlugin implements BuildStagePlugin {
    +    private static globalBuildCredentials = []
    +    private buildCredentials = []
    +
    +    public static void init() {
    +        def plugin = new CredentialsPlugin()
    +
    +        BuildStage.addPlugin(plugin)
    +    }
    +
    +    public CredentialsPlugin() {
    +        this.buildCredentials = globalBuildCredentials.clone()
    +    }
    +
    +    public static withBuildCredentials(Map options = [:], String credentialsId) {
    +        // Groovy is terrible
    +        Map optionsWithDefaults = populateDefaults(options, credentialsId)
    +        globalBuildCredentials << optionsWithDefaults
    +        return this
    +    }
    +
    +    @Override
    +    public void apply(BuildStage buildStage) {
    +        buildStage.decorate(addBuildCredentials())
    +    }
    +
    +    private addBuildCredentials() {
    +        def credentials = this.buildCredentials
    +        return { closure ->
    +            def results = credentials.collect { credential ->
    +                usernamePassword(credential)
    +            }
    +
    +            withCredentials(results) {
    +                closure()
    +            }
    +        }
    +    }
    +
    +    public static Map populateDefaults(Map options = [:], String credentialsId)  {
    +        def credentialsOptions = options.clone()
    +        credentialsOptions['credentialsId'] = credentialsId
    +        credentialsOptions['usernameVariable'] = credentialsOptions['usernameVariable'] ?: "${toEnvironmentVariable(credentialsId)}_USERNAME".toString()
    +        credentialsOptions['passwordVariable'] = credentialsOptions['passwordVariable'] ?: "${toEnvironmentVariable(credentialsId)}_PASSWORD".toString()
    +
    +        return credentialsOptions
    +    }
    +
    +    public static String toEnvironmentVariable(String value) {
    +        value.toUpperCase().replaceAll('-', '_')
    +    }
    +
    +    public static getBuildCredentials() {
    +        return globalBuildCredentials
    +    }
    +
    +    public static void reset() {
    +        globalBuildCredentials = []
    +    }
    +
    +}
    diff --git a/src/CrqPlugin.groovy b/src/CrqPlugin.groovy
    new file mode 100644
    index 00000000..e6fb5fcf
    --- /dev/null
    +++ b/src/CrqPlugin.groovy
    @@ -0,0 +1,81 @@
    +class CrqPlugin implements TerraformEnvironmentStagePlugin {
    +    public static defaultBau = 152
    +
    +    public static void init() {
    +        TerraformEnvironmentStage.addPlugin(new CrqPlugin())
    +    }
    +
    +    CrqPlugin() {
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        def environment = stage.getEnvironment()
    +
    +        stage.decorate(TerraformEnvironmentStage.APPLY, addCrq(environment))
    +    }
    +
    +    public String getCrqEnvironment(String environment) {
    +        String crqEnvironment = Jenkinsfile.instance.getEnv()['CRQ_ENVIRONMENT']
    +
    +        if (crqEnvironment == null) {
    +            crqEnvironment = Jenkinsfile.instance.getEnv()["${environment.toUpperCase()}_CRQ_ENVIRONMENT"]
    +        }
    +
    +        return crqEnvironment
    +    }
    +
    +    public Closure addCrq(String environment) {
    +        return { closure ->
    +            def crqEnvironment = getCrqEnvironment(environment)
    +
    +            if (crqEnvironment) {
    +                def config = [
    +                    environment: environment,
    +                    app: Jenkinsfile.instance.getRepoName(),
    +                    crqEnvironment: crqEnvironment
    +                ]
    +
    +                sh "${remedierOpen(config)}"
    +                try {
    +                    closure()
    +                    sh "${remedierClose(config)}"
    +                } catch (err) {
    +                    sh "${remedierBackout(config)}"
    +                    throw err
    +                }
    +            } else {
    +                sh "echo No CRQ_ENVIRONMENT found, set this to trigger automated CRQs"
    +                closure()
    +            }
    +        }
    +    }
    +
    +    public static String remedierOpen(config = [:]) {
    +        def app = config.app ?: "\$APP"
    +        def bau = config.bau ?: defaultBau
    +        def environment = config.environment ?: "\$ENVIRONMENT"
    +        def crqEnvironment = config.crqEnvironment ?: '$CRQ_ENVIRONMENT'
    +        def summary     = config.summary ?: "${app} - Deploy - ${environment}"
    +        def productName = config.productName ?: "Software Delivery Pipeline"
    +        def firstName   = config.firstName ?: "\$DEFAULT_PIPELINE_CRQ_FIRST_NAME"
    +        def lastName    = config.lastName ?: "\$DEFAULT_PIPELINE_CRQ_LAST_NAME"
    +        def login       = config.login ?: "\$DEFAULT_PIPELINE_CRQ_LOGIN"
    +        def tier1       = config.tier1 ?: "Software"
    +        def tier2       = config.tier2 ?: "Application"
    +        def tier3       = config.tier3 ?: "Release Management"
    +
    +        def message = "See \$BUILD_URL"
    +        return "manheim_remedy open \"${bau}\" \"${productName}\" \"${firstName}\" \"${lastName}\" \"${login}\" \"${tier1}\" \"${tier2}\" \"${tier3}\" \"${summary}\" \"${crqEnvironment}\" \"${message}\""
    +    }
    +
    +    public static String remedierClose(config = [:]) {
    +        return "manheim_remedy close `cat ChangeID.txt | sed 's/ChangeID=//g'`"
    +    }
    +
    +    public static String remedierBackout(config = [:]) {
    +        def reason = "Change failed"
    +        return "manheim_remedy error `cat ChangeID.txt | sed 's/ChangeID=//g'` \"${reason}\""
    +    }
    +
    +}
    diff --git a/src/DefaultEnvironmentPlugin.groovy b/src/DefaultEnvironmentPlugin.groovy
    new file mode 100644
    index 00000000..e473126d
    --- /dev/null
    +++ b/src/DefaultEnvironmentPlugin.groovy
    @@ -0,0 +1,16 @@
    +import static TerraformEnvironmentStage.ALL
    +
    +class DefaultEnvironmentPlugin implements TerraformEnvironmentStagePlugin {
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        String environment = stage.getEnvironment()
    +
    +        stage.decorate(ALL, addEnvironmentTerraformVariable(environment))
    +    }
    +
    +    public static Closure addEnvironmentTerraformVariable(String environment) {
    +        return { closure -> withEnv(["TF_VAR_environment=${environment}"]) { closure() } }
    +    }
    +
    +}
    diff --git a/src/EnvironmentVariablePlugin.groovy b/src/EnvironmentVariablePlugin.groovy
    new file mode 100644
    index 00000000..8d5c0ade
    --- /dev/null
    +++ b/src/EnvironmentVariablePlugin.groovy
    @@ -0,0 +1,25 @@
    +import static TerraformEnvironmentStage.ALL
    +
    +class EnvironmentVariablePlugin implements TerraformEnvironmentStagePlugin {
    +    private String key
    +    private String value
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        stage.decorate(ALL, withEnvClosure(key, value))
    +    }
    +
    +    public withEnv(String key, String value) {
    +        this.key = key
    +        this.value = value
    +    }
    +
    +    private Closure withEnvClosure(String key, String value) {
    +        return { closure ->
    +            withEnv(["${key}=${value}"]) {
    +                closure()
    +            }
    +        }
    +    }
    +
    +}
    diff --git a/src/FileParametersPlugin.groovy b/src/FileParametersPlugin.groovy
    new file mode 100644
    index 00000000..56bd4ef6
    --- /dev/null
    +++ b/src/FileParametersPlugin.groovy
    @@ -0,0 +1,43 @@
    +import groovy.text.StreamingTemplateEngine
    +
    +import static TerraformEnvironmentStage.ALL
    +
    +class FileParametersPlugin implements TerraformEnvironmentStagePlugin {
    +    public static void init() {
    +        FileParametersPlugin plugin = new FileParametersPlugin()
    +
    +        TerraformEnvironmentStage.addPlugin(plugin)
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        String environment = stage.getEnvironment()
    +
    +        stage.decorate(ALL, addEnvironmentSpecificVariables(environment))
    +    }
    +
    +    public Closure addEnvironmentSpecificVariables(String environment) {
    +        String environmentFilename = "${environment}.properties"
    +
    +        return { closure ->
    +            if (fileExists(environmentFilename)) {
    +                echo "Found file: ${environmentFilename} - loading the contents as environment variables."
    +                String fileContent = readFile(environmentFilename)
    +                List variables = getVariables(fileContent)
    +
    +                withEnv(variables) { closure() }
    +            } else {
    +                echo "No environment properties file found.  Create a ${environmentFilename} file to add environment-specific variables to this stage."
    +                closure()
    +            }
    +        }
    +    }
    +
    +    public List getVariables(String fileContent) {
    +        return fileContent.split('\\r?\\n').collect { String value -> interpolate(value) }
    +    }
    +
    +    public String interpolate(String value) {
    +        return new StreamingTemplateEngine().createTemplate(value).make([env: Jenkinsfile.instance.getEnv()]).toString()
    +    }
    +}
    diff --git a/src/Jenkinsfile.groovy b/src/Jenkinsfile.groovy
    new file mode 100644
    index 00000000..084230f1
    --- /dev/null
    +++ b/src/Jenkinsfile.groovy
    @@ -0,0 +1,130 @@
    +class Jenkinsfile {
    +    public static original
    +    public static docker
    +    public static defaultNodeName
    +    public static repoSlug = null
    +    public static instance = new Jenkinsfile()
    +    public static declarative = false
    +    public static pipelineTemplate
    +
    +    def node(Closure closure) {
    +        closure.delegate = original
    +        String label = getNodeName()
    +        if (label != null) {
    +            echo "Using node: ${label}"
    +            original.node(label, closure)
    +        } else {
    +            echo "defaultNodeName and DEFAULT_NODE_NAME environment variable are null"
    +            original.node(closure)
    +        }
    +    }
    +
    +    def invokeMethod(String name, args) {
    +        original.invokeMethod(name, args)
    +    }
    +
    +    def String getStandardizedRepoSlug() {
    +        if (repoSlug != null) {
    +            return repoSlug
    +        }
    +
    +        def scmUrl = getScmUrl()
    +        def scmMap = parseScmUrl(scmUrl)
    +        repoSlug = "${standardizeString(scmMap['organization'])}/${standardizeString(scmMap['repo'])}"
    +        return repoSlug
    +    }
    +
    +    def String getScmUrl() {
    +        def closure = {
    +            scm.getUserRemoteConfigs()[0].getUrl()
    +        }
    +        closure.delegate = original
    +        closure.call()
    +    }
    +
    +    def Map parseScmUrl(String scmUrl) {
    +        def matcher = scmUrl =~ /.*(?:\/\/|\@)[^\/:]+[\/:]([^\/]+)\/([^\/.]+)(.git)?/
    +        def Map results = new HashMap<String,String>()
    +        results.put("organization", matcher[0][1])
    +        results.put("repo", matcher[0][2])
    +        return results
    +    }
    +
    +    def String standardizeString(String original) {
    +        original.replaceAll( /-/, '_').replaceAll( /([A-Z]+)/, /_$1/ ).toLowerCase().replaceAll( /^_/, '' ).replaceAll( /_+/, '_')
    +    }
    +
    +    def String getRepoName() {
    +        def Map scmMap = parseScmUrl(getScmUrl())
    +        return scmMap['repo']
    +    }
    +
    +    def String getOrganization() {
    +        def Map scmMap = parseScmUrl(getScmUrl())
    +        return scmMap['organization']
    +    }
    +
    +    def static void init(original, Class customizations=null) {
    +        this.original = original
    +        this.docker   = original.docker
    +
    +        if (customizations != null) {
    +            customizations.init()
    +        }
    +    }
    +
    +    // Deprecate this, env should come from original
    +    def static void init(original, env, Class customizations=null) {
    +        this.original = original
    +        this.docker   = original.docker
    +
    +        if (customizations != null) {
    +            customizations.init()
    +        }
    +    }
    +
    +    def static String getNodeName() {
    +        return defaultNodeName ?: instance.getEnv().DEFAULT_NODE_NAME
    +    }
    +
    +    public static void build(Closure closure) {
    +        closure.delegate = this.instance
    +        closure.call()
    +    }
    +
    +    public static void build(List<Stage> stages) {
    +        if (!declarative) {
    +            stages.each { Stage stage -> stage.build() }
    +        } else {
    +            if (pipelineTemplate == null) {
    +                this.pipelineTemplate = getPipelineTemplate(stages)
    +            }
    +
    +            pipelineTemplate.call(stages)
    +        }
    +    }
    +
    +    public static getPipelineTemplate(List<Stage> stages) {
    +        switch (stages.size()) {
    +            case 2:
    +                return original.Pipeline2Stage
    +            case 3:
    +                return original.Pipeline3Stage
    +            case 4:
    +                return original.Pipeline4Stage
    +            case 5:
    +                return original.Pipeline5Stage
    +            case 6:
    +                return original.Pipeline6Stage
    +            case 7:
    +                return original.Pipeline7Stage
    +        }
    +
    +        throw new RuntimeException("Your pipeline has ${stages.size()} stages - the maximum supported by default is 7.  Define a custom pipeline template and assign it to Jenkinsfile.pipelineTemplate to create your pipeline.")
    +
    +    }
    +
    +    public getEnv() {
    +        return original.env
    +    }
    +}
    diff --git a/src/ParameterStoreBuildWrapperPlugin.groovy b/src/ParameterStoreBuildWrapperPlugin.groovy
    new file mode 100644
    index 00000000..9f80ee9c
    --- /dev/null
    +++ b/src/ParameterStoreBuildWrapperPlugin.groovy
    @@ -0,0 +1,43 @@
    +import static TerraformEnvironmentStage.PLAN
    +import static TerraformEnvironmentStage.APPLY
    +
    +class ParameterStoreBuildWrapperPlugin implements TerraformEnvironmentStagePlugin {
    +    public static void init() {
    +        TerraformEnvironmentStage.addPlugin(new ParameterStoreBuildWrapperPlugin())
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        def environment = stage.getEnvironment()
    +        def parameterStorePath = pathForEnvironment(environment)
    +
    +        def options = [
    +            path: parameterStorePath,
    +            credentialsId: "${environment.toUpperCase()}_PARAMETER_STORE_ACCESS"
    +        ]
    +
    +        stage.decorate(PLAN, addParameterStoreBuildWrapper(options))
    +        stage.decorate(APPLY, addParameterStoreBuildWrapper(options))
    +    }
    +
    +    String pathForEnvironment(String environment) {
    +        String organization = Jenkinsfile.instance.getOrganization()
    +        String repoName = Jenkinsfile.instance.getRepoName()
    +
    +        return "/${organization}/${repoName}/${environment}/"
    +    }
    +
    +    public static Closure addParameterStoreBuildWrapper(Map options = []) {
    +        def Map defaultOptions = [
    +            naming: 'basename'
    +        ]
    +
    +        def parameterStoreOptions = defaultOptions + options
    +
    +        return { closure ->
    +            withAWSParameterStore(parameterStoreOptions) {
    +                closure()
    +            }
    +        }
    +    }
    +}
    diff --git a/src/ParameterStoreExecPlugin.groovy b/src/ParameterStoreExecPlugin.groovy
    new file mode 100644
    index 00000000..046a57b6
    --- /dev/null
    +++ b/src/ParameterStoreExecPlugin.groovy
    @@ -0,0 +1,46 @@
    +import static TerraformEnvironmentStage.PLAN
    +import static TerraformEnvironmentStage.APPLY
    +
    +class ParameterStoreExecPlugin implements TerraformEnvironmentStagePlugin, TerraformPlanCommandPlugin, TerraformApplyCommandPlugin {
    +    public static void init() {
    +        ParameterStoreExecPlugin plugin = new ParameterStoreExecPlugin()
    +
    +        TerraformEnvironmentStage.addPlugin(plugin)
    +        TerraformPlanCommand.addPlugin(plugin)
    +        TerraformApplyCommand.addPlugin(plugin)
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        def environment = stage.getEnvironment()
    +        def parameterStorePath = pathForEnvironment(environment)
    +
    +        stage.decorate(PLAN, addEnvVariables(parameterStorePath))
    +        stage.decorate(APPLY, addEnvVariables(parameterStorePath))
    +    }
    +
    +    public String pathForEnvironment(String environment) {
    +        String organization = Jenkinsfile.instance.getOrganization()
    +        String repoName = Jenkinsfile.instance.getRepoName()
    +
    +        return "/${organization}/${repoName}/${environment}/"
    +    }
    +
    +    public static Closure addEnvVariables(String path) {
    +        return { closure ->
    +            withEnv(["PARAMETER_STORE_EXEC_PATH=${path}", "PARAMETER_STORE_EXEC_DISABLE_TRANSLATION=true", "AWS_REGION=us-east-1"]) {
    +                closure()
    +            }
    +        }
    +    }
    +
    +    @Override
    +    public void apply(TerraformPlanCommand command) {
    +        command.withPrefix('parameter-store-exec')
    +    }
    +
    +    @Override
    +    public void apply(TerraformApplyCommand command) {
    +        command.withPrefix('parameter-store-exec')
    +    }
    +}
    diff --git a/src/RegressionStage.groovy b/src/RegressionStage.groovy
    new file mode 100644
    index 00000000..075e1602
    --- /dev/null
    +++ b/src/RegressionStage.groovy
    @@ -0,0 +1,117 @@
    +class RegressionStage implements Stage {
    +
    +    public String testCommand
    +    public List automationRepoList = new ArrayList<String>()
    +    private String testCommandDirectory
    +
    +    private Closure existingDecorations
    +
    +    private static plugins = []
    +
    +    public RegressionStage() {
    +        this("./bin/test.sh")
    +    }
    +
    +    public RegressionStage(String testCommand) {
    +        this.testCommand = testCommand
    +    }
    +
    +    public RegressionStage withScm(String automationRepo) {
    +        this.automationRepoList.add(automationRepo)
    +        return this
    +    }
    +
    +    public RegressionStage changeDirectory(String directory) {
    +        this.testCommandDirectory = directory
    +        return this
    +    }
    +
    +    public Stage then(Stage nextStage) {
    +        return new BuildGraph(this).then(nextStage)
    +    }
    +
    +    public void build() {
    +        Jenkinsfile.build(pipelineConfiguration())
    +    }
    +
    +    private Closure pipelineConfiguration() {
    +        applyPlugins()
    +
    +        return {
    +            node {
    +                stage("test") {
    +                    applyDecorations(delegate) {
    +                        if (automationRepoList.isEmpty()) {
    +                            checkout scm
    +                            sh testCommand
    +                        } else if (automationRepoList.size() == 1) {
    +                            checkout resolveScm(source: [$class: 'GitSCMSource', remote: automationRepoList.first(), traits: [[$class: 'jenkins.plugins.git.traits.BranchDiscoveryTrait'], [$class: 'LocalBranchTrait']]], targets: [BRANCH_NAME, 'master'])
    +                            sh testCommand
    +                        } else {
    +                            for (url in automationRepoList) {
    +                                def dirName = url.split('/').last() - '.git'
    +                                dir(dirName) {
    +                                    checkout resolveScm(source: [$class: 'GitSCMSource', remote: url, traits: [[$class: 'jenkins.plugins.git.traits.BranchDiscoveryTrait'], [$class: 'LocalBranchTrait']]], targets: [BRANCH_NAME, 'master'])
    +                                }
    +                            }
    +
    +                            if (this.testCommandDirectory) {
    +                                dir(this.testCommandDirectory) {
    +                                    sh testCommand
    +                                }
    +                            } else {
    +                                sh testCommand
    +                            }
    +                        }
    +                    }
    +                }
    +            }
    +        }
    +    }
    +
    +    private void applyDecorations(delegate, Closure stageClosure) {
    +        if (existingDecorations != null) {
    +            existingDecorations.delegate = delegate
    +            existingDecorations(stageClosure)
    +        } else {
    +            stageClosure.delegate = delegate
    +            stageClosure()
    +        }
    +    }
    +
    +    public static getPlugins() {
    +        return plugins
    +    }
    +
    +    public static void resetPlugins() {
    +        this.plugins = []
    +    }
    +
    +    public static void addPlugin(plugin) {
    +        plugins << plugin
    +    }
    +
    +    public void applyPlugins() {
    +        for (plugin in plugins) {
    +            plugin.apply(this)
    +        }
    +    }
    +
    +    public void decorate(Closure decoration) {
    +        if (existingDecorations == null) {
    +            existingDecorations = decoration
    +            existingDecorations.resolveStrategy = Closure.DELEGATE_FIRST
    +        } else {
    +            def newDecoration = { stage ->
    +                decoration.delegate = delegate
    +                decoration.resolveStrategy = Closure.DELEGATE_FIRST
    +                decoration() {
    +                    stage.delegate = delegate
    +                    existingDecorations.delegate = delegate
    +                    existingDecorations(stage)
    +                }
    +            }
    +            existingDecorations = newDecoration
    +        }
    +    }
    +}
    diff --git a/src/RegressionStagePlugin.groovy b/src/RegressionStagePlugin.groovy
    new file mode 100644
    index 00000000..db665278
    --- /dev/null
    +++ b/src/RegressionStagePlugin.groovy
    @@ -0,0 +1,3 @@
    +interface RegressionStagePlugin {
    +    public void apply(RegressionStage stage)
    +}
    diff --git a/src/S3BackendPlugin.groovy b/src/S3BackendPlugin.groovy
    new file mode 100644
    index 00000000..7be4fb28
    --- /dev/null
    +++ b/src/S3BackendPlugin.groovy
    @@ -0,0 +1,102 @@
    +class S3BackendPlugin implements TerraformInitCommandPlugin {
    +
    +    public static Closure keyPattern
    +
    +    public static void init() {
    +        S3BackendPlugin plugin = new S3BackendPlugin()
    +
    +        TerraformInitCommand.addPlugin(plugin)
    +    }
    +
    +    @Override
    +    public void apply(TerraformInitCommand command) {
    +        String environment = command.getEnvironment()
    +
    +        def configs = [:]
    +        configs['key'] = getKey(environment)
    +        configs['bucket'] = getBucket(environment)
    +        configs['region'] = getRegion(environment)
    +        configs['dynamodb_table'] = getDynamodbTable(environment)
    +
    +        configs.each { entry ->
    +            if (entry.value?.trim()) {
    +                command.withBackendConfig("${entry.key}=${entry.value}")
    +            } else {
    +                println("No S3 backend ${entry.key} found")
    +            }
    +        }
    +    }
    +
    +    public String getKey(String environment) {
    +        Closure backendKeyPattern = keyPattern
    +
    +        if (backendKeyPattern == null)  {
    +            String repoSlug = Jenkinsfile.instance.getStandardizedRepoSlug()
    +            backendKeyPattern = { String env -> "terraform/${repoSlug}/${env}" }
    +        }
    +
    +        return backendKeyPattern.call(environment)
    +    }
    +
    +    public String getBucket(String environment) {
    +        String bucket = Jenkinsfile.instance.getEnv()["S3_BACKEND_BUCKET"]
    +
    +        if (bucket == null) {
    +            println("No S3_BACKEND_BUCKET found - checking for environment-specific bucket")
    +            bucket = Jenkinsfile.instance.getEnv()["${environment.toUpperCase()}_S3_BACKEND_BUCKET"]
    +        }
    +
    +        if (bucket == null) {
    +            bucket = Jenkinsfile.instance.getEnv()["${environment}_S3_BACKEND_BUCKET"]
    +        }
    +
    +        if (bucket == null) {
    +            println("No ${environment.toUpperCase()}_S3_BACKEND_BUCKET found either.")
    +        }
    +
    +        return bucket
    +    }
    +
    +    public String getRegion(String environment) {
    +        String region = Jenkinsfile.instance.getEnv()['S3_BACKEND_REGION']
    +
    +        if (region == null) {
    +           println("No S3_BACKEND_REGION found - checking for environment-specific region")
    +           region = Jenkinsfile.instance.getEnv()["${environment.toUpperCase()}_S3_BACKEND_REGION"]
    +        }
    +
    +        if (region == null) {
    +           region = Jenkinsfile.instance.getEnv()["${environment}_S3_BACKEND_REGION"]
    +        }
    +
    +        if (region == null) {
    +            region = Jenkinsfile.instance.getEnv()['DEFAULT_S3_BACKEND_REGION']
    +            if (region != null) {
    +                println("WARNING: DEFAULT_S3_BACKEND_REGION is deprecated, please use S3_BACKEND_REGION or ${environment.toUpperCase()}_S3_BACKEND_REGION")
    +            }
    +        }
    +
    +        return region
    +    }
    +
    +    public String getDynamodbTable(String environment) {
    +        String table = Jenkinsfile.instance.getEnv()["S3_BACKEND_DYNAMODB_TABLE"]
    +
    +        if (table == null) {
    +            table = Jenkinsfile.instance.getEnv()["${environment.toUpperCase()}_S3_BACKEND_DYNAMODB_TABLE"]
    +        }
    +
    +        if (table == null) {
    +            table = Jenkinsfile.instance.getEnv()["${environment}_S3_BACKEND_DYNAMODB_TABLE"]
    +        }
    +
    +        if (table == null) {
    +            table = Jenkinsfile.instance.getEnv()["${environment.toUpperCase()}_S3_BACKEND_DYNAMO_TABLE_LOCK"]
    +            if (table != null) {
    +                println("${environment.toUpperCase()}_S3_BACKEND_DYNAMO_TABLE_LOCK is deprecated - please use ${environment.toUpperCase()}_S3_BACKEND_DYNAMODB_TABLE instead")
    +            }
    +        }
    +
    +        return table
    +    }
    +}
    diff --git a/src/Stage.groovy b/src/Stage.groovy
    new file mode 100644
    index 00000000..a5caefad
    --- /dev/null
    +++ b/src/Stage.groovy
    @@ -0,0 +1,4 @@
    +interface Stage {
    +    public Stage then(Stage nextStage)
    +    public void build()
    +}
    diff --git a/src/TerraformApplyCommand.groovy b/src/TerraformApplyCommand.groovy
    new file mode 100644
    index 00000000..49e4f402
    --- /dev/null
    +++ b/src/TerraformApplyCommand.groovy
    @@ -0,0 +1,80 @@
    +class TerraformApplyCommand {
    +    private boolean input = false
    +    private String terraformBinary = "terraform"
    +    private String command = "apply"
    +    String environment
    +    private prefixes = []
    +    private args = []
    +    private static plugins = []
    +    private appliedPlugins = []
    +    private String directory
    +
    +    public TerraformApplyCommand(String environment) {
    +        this.environment = environment
    +    }
    +
    +    public TerraformApplyCommand withInput(boolean input) {
    +        this.input = input
    +        return this
    +    }
    +
    +    public TerraformApplyCommand withArgument(String arg) {
    +        this.args << arg
    +        return this
    +    }
    +
    +    public TerraformApplyCommand withPrefix(String prefix) {
    +        prefixes << prefix
    +        return this
    +    }
    +
    +    public TerraformApplyCommand withDirectory(String directory) {
    +        this.directory = directory
    +        return this
    +    }
    +
    +    public String toString() {
    +        applyPluginsOnce()
    +
    +        def pieces = []
    +        pieces += prefixes
    +        pieces << terraformBinary
    +        pieces << command
    +        if (!input) {
    +            pieces << "-input=false"
    +        }
    +        pieces += args
    +        if (directory) {
    +            pieces << directory
    +        }
    +
    +        return pieces.join(' ')
    +    }
    +
    +    private applyPluginsOnce() {
    +        def remainingPlugins = plugins - appliedPlugins
    +
    +        for(TerraformApplyCommandPlugin plugin in remainingPlugins) {
    +            plugin.apply(this)
    +            appliedPlugins << plugin
    +        }
    +    }
    +
    +    public static void addPlugin(TerraformApplyCommandPlugin plugin) {
    +        plugins << plugin
    +    }
    +
    +    public static TerraformApplyCommand instanceFor(String environment) {
    +        return new TerraformApplyCommand(environment)
    +            .withInput(false)
    +            .withArgument("-auto-approve")
    +    }
    +
    +    public static getPlugins() {
    +        return plugins
    +    }
    +
    +    public static resetPlugins() {
    +        this.plugins = []
    +    }
    +}
    diff --git a/src/TerraformApplyCommandPlugin.groovy b/src/TerraformApplyCommandPlugin.groovy
    new file mode 100644
    index 00000000..bfddc1c0
    --- /dev/null
    +++ b/src/TerraformApplyCommandPlugin.groovy
    @@ -0,0 +1,3 @@
    +interface TerraformApplyCommandPlugin {
    +    public void apply(TerraformApplyCommand command)
    +}
    diff --git a/src/TerraformDirectoryPlugin.groovy b/src/TerraformDirectoryPlugin.groovy
    new file mode 100644
    index 00000000..735324af
    --- /dev/null
    +++ b/src/TerraformDirectoryPlugin.groovy
    @@ -0,0 +1,38 @@
    +class TerraformDirectoryPlugin implements TerraformInitCommandPlugin, TerraformValidateCommandPlugin, TerraformPlanCommandPlugin, TerraformApplyCommandPlugin {
    +
    +    private static String directory = "./terraform/"
    +
    +    public static void init() {
    +        TerraformDirectoryPlugin plugin = new TerraformDirectoryPlugin()
    +
    +        TerraformInitCommand.addPlugin(plugin)
    +        TerraformValidateCommand.addPlugin(plugin)
    +        TerraformPlanCommand.addPlugin(plugin)
    +        TerraformApplyCommand.addPlugin(plugin)
    +    }
    +
    +    public static withDirectory(String directory) {
    +        TerraformDirectoryPlugin.directory = directory
    +        return this
    +    }
    +
    +    @Override
    +    public void apply(TerraformInitCommand command) {
    +        command.withDirectory(directory)
    +    }
    +
    +    @Override
    +    public void apply(TerraformValidateCommand command) {
    +        command.withDirectory(directory)
    +    }
    +
    +    @Override
    +    public void apply(TerraformPlanCommand command) {
    +        command.withDirectory(directory)
    +    }
    +
    +    @Override
    +    public void apply(TerraformApplyCommand command) {
    +        command.withDirectory(directory)
    +    }
    +}
    diff --git a/src/TerraformEnvironmentStage.groovy b/src/TerraformEnvironmentStage.groovy
    new file mode 100644
    index 00000000..fe83ec42
    --- /dev/null
    +++ b/src/TerraformEnvironmentStage.groovy
    @@ -0,0 +1,195 @@
    +class TerraformEnvironmentStage implements Stage {
    +    private Jenkinsfile jenkinsfile
    +    private String environment
    +    private Map<String,Closure> decorations
    +    private TerraformInitCommand initCommand
    +    private TerraformPlanCommand planCommand
    +    private TerraformApplyCommand applyCommand
    +    private localPlugins
    +
    +    private static final DEFAULT_PLUGINS = [ new ConditionalApplyPlugin(), new ConfirmApplyPlugin(), new DefaultEnvironmentPlugin() ]
    +    private static globalPlugins = DEFAULT_PLUGINS.clone()
    +
    +    public static final String ALL = 'all'
    +    public static final String PLAN = 'plan'
    +    public static final String CONFIRM = 'confirm'
    +    public static final String APPLY = 'apply'
    +
    +    TerraformEnvironmentStage(String environment) {
    +        this.environment = environment
    +        this.jenkinsfile = Jenkinsfile.instance
    +        this.decorations = new HashMap<String,Closure>()
    +    }
    +
    +    public Stage then(Stage nextStages) {
    +        return new BuildGraph(this).then(nextStage)
    +    }
    +
    +    public static withGlobalEnv(String key, String value) {
    +        def plugin = new EnvironmentVariablePlugin()
    +        plugin.withEnv(key, value)
    +        addPlugin(plugin)
    +
    +        return this
    +    }
    +
    +    public TerraformEnvironmentStage withEnv(String key, String value) {
    +        def plugin = new EnvironmentVariablePlugin()
    +        plugin.withEnv(key, value)
    +
    +        reconcileLocalAndGlobalPlugins(plugin)
    +
    +        return this
    +    }
    +
    +    public void build() {
    +        Jenkinsfile.build(pipelineConfiguration())
    +    }
    +
    +    private Closure pipelineConfiguration() {
    +        initCommand = TerraformInitCommand.instanceFor(environment)
    +        planCommand = TerraformPlanCommand.instanceFor(environment)
    +        applyCommand = TerraformApplyCommand.instanceFor(environment)
    +
    +        applyPlugins()
    +
    +        def String environment = this.environment
    +        return { ->
    +            node {
    +                deleteDir()
    +                checkout(scm)
    +
    +                applyDecorations(ALL) {
    +                    stage("${PLAN}-${environment}") {
    +                        applyDecorations(PLAN) {
    +                            sh initCommand.toString()
    +                            sh planCommand.toString()
    +                        }
    +                    }
    +
    +                    applyDecorationsAround(CONFIRM) {
    +                        stage("${CONFIRM}-${environment}") {
    +                            applyDecorations(CONFIRM) {
    +                                echo "Approved"
    +                            }
    +                        }
    +                    }
    +
    +                    applyDecorationsAround(APPLY) {
    +                        stage("${APPLY}-${environment}") {
    +                            applyDecorations(APPLY) {
    +                                sh initCommand.toString()
    +                                sh applyCommand.toString()
    +                            }
    +                        }
    +                    }
    +                }
    +            }
    +        }
    +    }
    +
    +    private void applyDecorations(String stageName, Closure stageClosure) {
    +        def stageDecorations = decorations.get(stageName) ?: { stage -> stage() }
    +        stageDecorations.delegate = jenkinsfile
    +        stageDecorations(stageClosure)
    +    }
    +
    +    public decorate(String stageName, Closure decoration) {
    +        def existingDecorations = decorations.get(stageName) ?: { stage -> stage() }
    +        def newDecoration = { stage ->
    +            decoration.delegate = delegate
    +            decoration.resolveStrategy = Closure.DELEGATE_FIRST
    +            decoration() {
    +                stage.delegate = delegate
    +                existingDecorations.delegate = delegate
    +                existingDecorations(stage)
    +            }
    +        }
    +
    +        decorations.put(stageName,newDecoration)
    +    }
    +
    +    private void applyDecorationsAround(String stageName, Closure stageClosure) {
    +        applyDecorations("Around-${stageName}", stageClosure)
    +    }
    +
    +    public decorateAround(String stageName, Closure decoration) {
    +        decorate("Around-${stageName}", decoration)
    +    }
    +
    +    public String toString() {
    +        return environment
    +    }
    +
    +    public static addPlugin(plugin) {
    +        globalPlugins << plugin
    +    }
    +
    +    public void applyPlugins() {
    +        // Apply both global and local plugins, in the correct order
    +        for(plugin in getAllPlugins()) {
    +            plugin.apply(this)
    +        }
    +    }
    +
    +    public String getEnvironment() {
    +        return environment
    +    }
    +
    +    /* Returns global globalPlugins, in addition to all
    +     * plugins that have been added to this instance
    +     */
    +    public getAllPlugins() {
    +        return reconcileLocalAndGlobalPlugins()
    +    }
    +
    +    private reconcileLocalAndGlobalPlugins(TerraformEnvironmentStagePlugin newPlugin = null) {
    +        if (localPlugins == null) {
    +            if (newPlugin == null) {
    +                // No local plugins were added - only global plugins take effect
    +                return globalPlugins
    +            }
    +
    +            // The first local plugin was added.  It takes effective *after* every current global plugin
    +            localPlugins = globalPlugins.clone()
    +            localPlugins << newPlugin
    +            return localPlugins
    +        }
    +        // We're here because a localPlugin was previously added.  Check if any new global plugins
    +        // have been added since.
    +
    +        // Start off with all global plugins
    +        def remainingGlobalPlugins = globalPlugins.clone()
    +        for (def plugin in localPlugins) {
    +            // If all global plugins are accounted for, stop
    +            if (remainingGlobalPlugins.isEmpty()) {
    +                break;
    +            }
    +            // Cross off each global plugin that has not yet been accounted for
    +            if (remainingGlobalPlugins.first() == plugin) {
    +                remainingGlobalPlugins.remove(plugin)
    +            }
    +            // If the plugin was not in remainingGlobalPlugins, it means it was added locally
    +        }
    +
    +        // Any global plugins that remain in this list have been added since the last time we checked.
    +        // Add them now.
    +        localPlugins.addAll(remainingGlobalPlugins)
    +
    +        // If we have a new plugin to add, do it now
    +        if (newPlugin != null) {
    +            localPlugins << newPlugin
    +        }
    +
    +        return localPlugins
    +    }
    +
    +    public static getPlugins() {
    +        return globalPlugins
    +    }
    +
    +    public static void resetPlugins() {
    +        this.globalPlugins = DEFAULT_PLUGINS.clone()
    +        // This totally jacks with localPlugins
    +    }
    +}
    diff --git a/src/TerraformEnvironmentStagePlugin.groovy b/src/TerraformEnvironmentStagePlugin.groovy
    new file mode 100644
    index 00000000..4694f472
    --- /dev/null
    +++ b/src/TerraformEnvironmentStagePlugin.groovy
    @@ -0,0 +1,3 @@
    +interface TerraformEnvironmentStagePlugin {
    +    public void apply(TerraformEnvironmentStage stage)
    +}
    diff --git a/src/TerraformInitCommand.groovy b/src/TerraformInitCommand.groovy
    new file mode 100644
    index 00000000..1b4d7b9c
    --- /dev/null
    +++ b/src/TerraformInitCommand.groovy
    @@ -0,0 +1,82 @@
    +class TerraformInitCommand {
    +    private boolean input = false
    +    private String terraformBinary = "terraform"
    +    private String command = "init"
    +    String environment
    +    private prefixes = []
    +    private backendConfigs = []
    +    private String directory
    +
    +    private static plugins = []
    +    private appliedPlugins = []
    +
    +    public TerraformInitCommand(String environment) {
    +        this.environment = environment
    +    }
    +
    +    public TerraformInitCommand withInput(boolean input) {
    +        this.input = input
    +        return this
    +    }
    +
    +    public TerraformInitCommand withPrefix(String prefix) {
    +        prefixes = prefix
    +        return this
    +    }
    +
    +    public TerraformInitCommand withDirectory(String directory) {
    +        this.directory = directory
    +        return this
    +    }
    +
    +    public TerraformInitCommand withBackendConfig(String backendConfig) {
    +        this.backendConfigs << backendConfig
    +        return this
    +    }
    +
    +    public String toString() {
    +        applyPluginsOnce()
    +
    +        def pieces = []
    +        pieces = pieces + prefixes
    +        pieces << terraformBinary
    +        pieces << command
    +        if (!input) {
    +            pieces << "-input=false"
    +        }
    +        backendConfigs.each { config ->
    +            pieces << "-backend-config=${config}"
    +        }
    +        if (directory) {
    +            pieces << directory
    +        }
    +
    +        return pieces.join(' ')
    +    }
    +
    +    private applyPluginsOnce() {
    +        def remainingPlugins = plugins - appliedPlugins
    +
    +        for(TerraformInitCommandPlugin plugin in remainingPlugins) {
    +            plugin.apply(this)
    +            appliedPlugins << plugin
    +        }
    +    }
    +
    +    public static void addPlugin(TerraformInitCommandPlugin plugin) {
    +        plugins << plugin
    +    }
    +
    +    public static TerraformInitCommand instanceFor(String environment) {
    +        return new TerraformInitCommand(environment)
    +    }
    +
    +    public static getPlugins() {
    +        return plugins
    +    }
    +
    +    public static resetPlugins() {
    +        this.plugins = []
    +        // This is awkward - what about the applied plugins...?
    +    }
    +}
    diff --git a/src/TerraformInitCommandPlugin.groovy b/src/TerraformInitCommandPlugin.groovy
    new file mode 100644
    index 00000000..bac96567
    --- /dev/null
    +++ b/src/TerraformInitCommandPlugin.groovy
    @@ -0,0 +1,3 @@
    +interface TerraformInitCommandPlugin {
    +    public void apply(TerraformInitCommand command)
    +}
    diff --git a/src/TerraformPlanCommand.groovy b/src/TerraformPlanCommand.groovy
    new file mode 100644
    index 00000000..ff640ad2
    --- /dev/null
    +++ b/src/TerraformPlanCommand.groovy
    @@ -0,0 +1,72 @@
    +class TerraformPlanCommand {
    +    private boolean input = false
    +    private String terraformBinary = "terraform"
    +    private String command = "plan"
    +    String environment
    +    private prefixes = []
    +    private static plugins = []
    +    private appliedPlugins = []
    +    private String directory
    +
    +    public TerraformPlanCommand(String environment) {
    +        this.environment = environment
    +    }
    +
    +    public TerraformPlanCommand withInput(boolean input) {
    +        this.input = input
    +        return this
    +    }
    +
    +    public TerraformPlanCommand withPrefix(String prefix) {
    +        prefixes << prefix
    +        return this
    +    }
    +
    +    public TerraformPlanCommand withDirectory(String directory) {
    +        this.directory = directory
    +        return this
    +    }
    +
    +    public String toString() {
    +        applyPluginsOnce()
    +
    +        def pieces = []
    +        pieces = pieces + prefixes
    +        pieces << terraformBinary
    +        pieces << command
    +        if (!input) {
    +            pieces << "-input=false"
    +        }
    +        if (directory) {
    +            pieces << directory
    +        }
    +
    +        return pieces.join(' ')
    +    }
    +
    +    private applyPluginsOnce() {
    +        def remainingPlugins = plugins - appliedPlugins
    +
    +        for(TerraformPlanCommandPlugin plugin in remainingPlugins) {
    +            plugin.apply(this)
    +            appliedPlugins << plugin
    +        }
    +    }
    +
    +    public static addPlugin(TerraformPlanCommandPlugin plugin) {
    +        plugins << plugin
    +    }
    +
    +    public static TerraformPlanCommand instanceFor(String environment) {
    +        return new TerraformPlanCommand(environment)
    +            .withInput(false)
    +    }
    +
    +    public static getPlugins() {
    +        return plugins
    +    }
    +
    +    public static resetPlugins() {
    +        this.plugins = []
    +    }
    +}
    diff --git a/src/TerraformPlanCommandPlugin.groovy b/src/TerraformPlanCommandPlugin.groovy
    new file mode 100644
    index 00000000..578d875a
    --- /dev/null
    +++ b/src/TerraformPlanCommandPlugin.groovy
    @@ -0,0 +1,3 @@
    +interface TerraformPlanCommandPlugin {
    +    public void apply(TerraformPlanCommand command)
    +}
    diff --git a/src/TerraformValidateCommand.groovy b/src/TerraformValidateCommand.groovy
    new file mode 100644
    index 00000000..3da54afb
    --- /dev/null
    +++ b/src/TerraformValidateCommand.groovy
    @@ -0,0 +1,69 @@
    +class TerraformValidateCommand {
    +    private String terraformBinary = "terraform"
    +    private String command = "validate"
    +    private arguments = []
    +    private prefixes = []
    +    private static plugins = []
    +    private appliedPlugins = []
    +    private String directory
    +
    +    public TerraformValidateCommand() {
    +    }
    +
    +    public TerraformValidateCommand withArgument(String argument) {
    +        this.arguments << argument
    +        return this
    +    }
    +
    +    public TerraformValidateCommand withPrefix(String prefix) {
    +        prefixes << prefix
    +        return this
    +    }
    +
    +    public TerraformValidateCommand withDirectory(String directory) {
    +        this.directory = directory
    +        return this
    +    }
    +
    +    public String toString() {
    +        applyPluginsOnce()
    +        def pieces = []
    +        pieces = pieces + prefixes
    +        pieces << terraformBinary
    +        pieces << command
    +        for(String argument in arguments)
    +        {
    +            pieces << argument
    +        }
    +        if (directory) {
    +            pieces << directory
    +        }
    +        return pieces.join(' ')
    +    }
    +
    +    private applyPluginsOnce() {
    +        def remainingPlugins = plugins - appliedPlugins
    +
    +        for(TerraformValidateCommandPlugin plugin in remainingPlugins) {
    +            plugin.apply(this)
    +            appliedPlugins << plugin
    +        }
    +    }
    +
    +    public static addPlugin(TerraformValidateCommandPlugin plugin) {
    +        plugins << plugin
    +    }
    +
    +    public static TerraformValidateCommand instance() {
    +        return new TerraformValidateCommand()
    +            .withArgument('-check-variables=false')
    +    }
    +
    +    public static getPlugins() {
    +        return plugins
    +    }
    +
    +    public static resetPlugins() {
    +        this.plugins = []
    +    }
    +}
    diff --git a/src/TerraformValidateCommandPlugin.groovy b/src/TerraformValidateCommandPlugin.groovy
    new file mode 100644
    index 00000000..dbaf7b26
    --- /dev/null
    +++ b/src/TerraformValidateCommandPlugin.groovy
    @@ -0,0 +1,3 @@
    +interface TerraformValidateCommandPlugin {
    +    public void apply(TerraformValidateCommand command)
    +}
    diff --git a/src/TerraformValidateStage.groovy b/src/TerraformValidateStage.groovy
    new file mode 100644
    index 00000000..dcd3917a
    --- /dev/null
    +++ b/src/TerraformValidateStage.groovy
    @@ -0,0 +1,89 @@
    +class TerraformValidateStage implements Stage {
    +
    +    private Jenkinsfile jenkinsfile
    +    private TerraformValidateCommand validateCommand
    +    private Map<String,Closure> decorations
    +
    +    private static plugins = []
    +
    +    public static final String ALL = 'all'
    +
    +    public TerraformValidateStage() {
    +        this.jenkinsfile = Jenkinsfile.instance
    +        this.decorations = new HashMap<String,Closure>()
    +    }
    +
    +    public Stage then(Stage nextStage) {
    +        return new BuildGraph(this).then(nextStage)
    +    }
    +
    +    public void build() {
    +        Jenkinsfile.build(pipelineConfiguration())
    +    }
    +
    +    private Closure pipelineConfiguration() {
    +        applyPlugins()
    +
    +        def validateCommand = TerraformValidateCommand.instance()
    +
    +        return {
    +            node {
    +                applyDecorations(ALL) {
    +                    stage("validate") {
    +                        deleteDir()
    +                        checkout(scm)
    +                        sh validateCommand.toString()
    +                    }
    +                }
    +            }
    +        }
    +    }
    +
    +    private void applyDecorations(String stageName, Closure stageClosure) {
    +        def stageDecorations = decorations.get(stageName) ?: { stage -> stage() }
    +        stageDecorations.delegate = jenkinsfile
    +        stageDecorations(stageClosure)
    +    }
    +
    +    public decorate(String stageName, Closure decoration) {
    +        def existingDecorations = decorations.get(stageName) ?: { stage -> stage() }
    +
    +        def newDecoration = { stage ->
    +            decoration.delegate = delegate
    +            decoration.resolveStrategy = Closure.DELEGATE_FIRST
    +            decoration() {
    +                stage.delegate = delegate
    +                existingDecorations.delegate = delegate
    +                existingDecorations(stage)
    +            }
    +        }
    +
    +        decorations.put(stageName,newDecoration)
    +    }
    +
    +    private void applyDecorationsAround(String stageName, Closure stageClosure) {
    +        applyDecorations("Around-${stageName}", stageClosure)
    +    }
    +
    +    public decorateAround(String stageName, Closure decoration) {
    +        decorate("Around-${stageName}", decoration)
    +    }
    +
    +    public static addPlugin(plugin) {
    +        plugins << plugin
    +    }
    +
    +    public void applyPlugins() {
    +        for(plugin in plugins) {
    +            plugin.apply(this)
    +        }
    +    }
    +
    +    public static getPlugins() {
    +        return plugins
    +    }
    +
    +    public static void resetPlugins() {
    +        this.plugins = []
    +    }
    +}
    diff --git a/src/TerraformValidateStagePlugin.groovy b/src/TerraformValidateStagePlugin.groovy
    new file mode 100644
    index 00000000..1f2c02dd
    --- /dev/null
    +++ b/src/TerraformValidateStagePlugin.groovy
    @@ -0,0 +1,3 @@
    +interface TerraformValidateStagePlugin {
    +    public void apply(TerraformValidateStage stage)
    +}
    diff --git a/src/WithAwsPlugin.groovy b/src/WithAwsPlugin.groovy
    new file mode 100644
    index 00000000..8d18cfd0
    --- /dev/null
    +++ b/src/WithAwsPlugin.groovy
    @@ -0,0 +1,62 @@
    +import static TerraformEnvironmentStage.ALL
    +
    +class WithAwsPlugin implements TerraformEnvironmentStagePlugin {
    +    private static role
    +
    +    public static void init() {
    +        WithAwsPlugin plugin = new WithAwsPlugin()
    +
    +        TerraformEnvironmentStage.addPlugin(plugin)
    +    }
    +
    +    @Override
    +    public void apply(TerraformEnvironmentStage stage) {
    +        String environment = stage.getEnvironment()
    +
    +        stage.decorate(ALL, addWithAwsRole(environment))
    +    }
    +
    +    public Closure addWithAwsRole(String environment) {
    +        return { closure ->
    +            String iamRole = getRole(environment)
    +
    +            if (iamRole != null) {
    +                withAWS(role: iamRole) {
    +                    sh "echo Running AWS commands under the role: ${iamRole}"
    +                    closure()
    +                }
    +            } else {
    +                sh "echo no role found. Skipping withAWS"
    +                closure()
    +            }
    +        }
    +    }
    +
    +    public static withRole(String role = null) {
    +        this.role = role
    +
    +        return this
    +    }
    +
    +    public String getRole(String environment) {
    +        def tempRole = this.role
    +
    +        if (tempRole == null) {
    +            tempRole = Jenkinsfile.instance.getEnv()['AWS_ROLE_ARN']
    +        }
    +
    +        if (tempRole == null) {
    +            tempRole = Jenkinsfile.instance.getEnv()["${environment.toUpperCase()}_AWS_ROLE_ARN"]
    +        }
    +
    +        if (tempRole == null) {
    +            tempRole = Jenkinsfile.instance.getEnv()["${environment}_AWS_ROLE_ARN"]
    +        }
    +
    +        return tempRole
    +    }
    +
    +    public static void reset() {
    +        this.role = null
    +    }
    +}
    diff --git a/test/AnsiColorPluginTest.groovy b/test/AnsiColorPluginTest.groovy
    new file mode 100644
    index 00000000..00004bb3
    --- /dev/null
    +++ b/test/AnsiColorPluginTest.groovy
    @@ -0,0 +1,25 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class AnsiColorPluginTest {
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            TerraformEnvironmentStage.resetPlugins()
    +        }
    +
    +        @Test
    +        void modifiesTerraformEnvironmentStage() {
    +            AnsiColorPlugin.init()
    +
    +            Collection actualPlugins = TerraformEnvironmentStage.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(AnsiColorPlugin.class)))
    +        }
    +    }
    +}
    +
    diff --git a/test/AwssumePluginTest.groovy b/test/AwssumePluginTest.groovy
    new file mode 100644
    index 00000000..9728c33d
    --- /dev/null
    +++ b/test/AwssumePluginTest.groovy
    @@ -0,0 +1,256 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.mockito.Mockito.when;
    +import static org.mockito.Mockito.mock;
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class AwssumePluginTest {
    +    @Before
    +    void resetJenkinsEnv() {
    +        Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        when(Jenkinsfile.instance.getEnv()).thenReturn([:])
    +    }
    +
    +    private configureJenkins(Map config = [:]) {
    +        Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
    +        when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +    }
    +
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            TerraformInitCommand.resetPlugins()
    +            TerraformPlanCommand.resetPlugins()
    +            TerraformApplyCommand.resetPlugins()
    +        }
    +
    +        @Test
    +        void modifiesTerraformInitCommand() {
    +            AwssumePlugin.init()
    +
    +            Collection actualPlugins = TerraformInitCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(AwssumePlugin.class)))
    +        }
    +
    +        @Test
    +        void modifiesTerraformPlanCommand() {
    +            AwssumePlugin.init()
    +
    +            Collection actualPlugins = TerraformPlanCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(AwssumePlugin.class)))
    +        }
    +
    +        @Test
    +        void modifiesTerraformApplyCommand() {
    +            AwssumePlugin.init()
    +
    +            Collection actualPlugins = TerraformApplyCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(AwssumePlugin.class)))
    +        }
    +    }
    +
    +    public class Apply {
    +
    +        public class WithRoleProvided {
    +            @Test
    +            void addsEnvironmentSpecificRoleArnAsPrefixToTerraformInit() {
    +                String environment = "myEnv"
    +                configureJenkins(env: ['MYENV_AWS_ROLE_ARN': 'someArn'])
    +                AwssumePlugin plugin = new AwssumePlugin()
    +                TerraformInitCommand command = new TerraformInitCommand(environment)
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("AWS_ROLE_ARN=someArn awssume terraform init"))
    +            }
    +
    +            @Test
    +            void addsEnvironmentSpecificRoleArnAsPrefixToTerraformPlan() {
    +                String environment = "myEnv"
    +                configureJenkins(env: ['MYENV_AWS_ROLE_ARN': 'someArn'])
    +                AwssumePlugin plugin = new AwssumePlugin()
    +                TerraformPlanCommand command = new TerraformPlanCommand(environment)
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("AWS_ROLE_ARN=someArn awssume terraform plan"))
    +            }
    +
    +            @Test
    +            void addsEnvironmentSpecificRoleArnAsPrefixToTerraformApply() {
    +                String environment = "myEnv"
    +                configureJenkins(env: ['MYENV_AWS_ROLE_ARN': 'someArn'])
    +                AwssumePlugin plugin = new AwssumePlugin()
    +                TerraformApplyCommand command = new TerraformApplyCommand(environment)
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("AWS_ROLE_ARN=someArn awssume terraform apply"))
    +            }
    +        }
    +
    +        public class WithoutRoleProvided {
    +            @Test
    +            void skipsAwssumeForTerraformInit() {
    +                String environment = "myEnv"
    +                configureJenkins(env: [:])
    +                AwssumePlugin plugin = new AwssumePlugin()
    +                TerraformInitCommand command = new TerraformInitCommand(environment)
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, not(containsString("awssume")))
    +                assertThat(result, containsString("terraform init"))
    +            }
    +
    +            @Test
    +            void skipsAwssumeForTerraformPlan() {
    +                String environment = "myEnv"
    +                configureJenkins(env: [:])
    +                AwssumePlugin plugin = new AwssumePlugin()
    +                TerraformPlanCommand command = new TerraformPlanCommand(environment)
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, not(containsString("awssume")))
    +                assertThat(result, containsString("terraform plan"))
    +            }
    +
    +            @Test
    +            void skipsAwssumeForTerraformApply() {
    +                String environment = "myEnv"
    +                configureJenkins(env: [:])
    +                AwssumePlugin plugin = new AwssumePlugin()
    +                TerraformApplyCommand command = new TerraformApplyCommand(environment)
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, not(containsString("awssume")))
    +                assertThat(result, containsString("terraform apply"))
    +            }
    +        }
    +    }
    +
    +    public class GetAwsRoleArn {
    +        @Test
    +        void returnsAwsRoleArnIfPresent() {
    +            String expectedRole = 'someRoleArn'
    +            configureJenkins(env: ['AWS_ROLE_ARN': expectedRole])
    +
    +            AwssumePlugin plugin = new AwssumePlugin()
    +            String actualRole = plugin.getAwsRoleArn('myenv')
    +
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +
    +        @Test
    +        void returnsEnvironmentSpecificAwsRoleArnIfPresent() {
    +            String expectedRole = 'myenvRole'
    +            configureJenkins(env: ['MYENV_AWS_ROLE_ARN': expectedRole])
    +
    +            AwssumePlugin plugin = new AwssumePlugin()
    +            String actualRole = plugin.getAwsRoleArn('myenv')
    +
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +
    +        @Test
    +        void returnsEnvironmentSpecifiedAwsRoleArnIfPresentCaseInsensitive() {
    +            String expectedRole = 'myenvRole'
    +            configureJenkins(env: ['myenv_AWS_ROLE_ARN': expectedRole])
    +
    +            AwssumePlugin plugin = new AwssumePlugin()
    +            String actualRole = plugin.getAwsRoleArn('myenv')
    +
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +
    +        @Test
    +        void prefersAwsArnRoleOverEnvironmentSpecificRole() {
    +            String expectedRole = 'thisRole'
    +            configureJenkins(env: [
    +                'AWS_ROLE_ARN': expectedRole,
    +                'myenv_AWS_ROLE_ARN': 'notThisRole'
    +            ])
    +
    +            AwssumePlugin plugin = new AwssumePlugin()
    +            String actualRole = plugin.getAwsRoleArn('myenv')
    +
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +    }
    +
    +    public class GetRegion {
    +        @Test
    +        void returnsAwsRegionIfPresent() {
    +            String expectedRegion = 'someRegion'
    +            configureJenkins(env: ['AWS_REGION': expectedRegion])
    +
    +            AwssumePlugin plugin = new AwssumePlugin()
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +
    +        @Test
    +        void returnsEnvironmentSpecificRegionIfPresent() {
    +            String expectedRegion = 'environmentSpecificRegion'
    +            configureJenkins(env: ['MYENV_AWS_REGION': expectedRegion])
    +
    +            AwssumePlugin plugin = new AwssumePlugin()
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +
    +        @Test
    +        void returnsAwsDefaultRegionIfPresent() {
    +            String expectedRegion = 'defaultRegion'
    +            configureJenkins(env: ['AWS_DEFAULT_REGION': expectedRegion])
    +
    +            AwssumePlugin plugin = new AwssumePlugin()
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +
    +        @Test
    +        void prefersRegionOverEnvironmentSpecificRegion() {
    +            String expectedRegion = 'thisRegion'
    +            configureJenkins(env: [
    +                'AWS_REGION': expectedRegion,
    +                'MYENV_AWS_REGION': 'notThisRegion'
    +            ])
    +
    +            AwssumePlugin plugin = new AwssumePlugin()
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +
    +        @Test
    +        void prefersEnvironmentSpecificRegionOverDefaultRegion() {
    +            String expectedRegion = 'thisRegion'
    +            configureJenkins(env: [
    +                'MYENV_AWS_REGION': expectedRegion,
    +                'AWS_DEFAULT_REGION': 'notThisRegion'
    +            ])
    +
    +            AwssumePlugin plugin = new AwssumePlugin()
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +    }
    +}
    diff --git a/test/BuildGraphTest.groovy b/test/BuildGraphTest.groovy
    new file mode 100644
    index 00000000..8391145b
    --- /dev/null
    +++ b/test/BuildGraphTest.groovy
    @@ -0,0 +1,44 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import org.mockito.InOrder
    +import static org.mockito.Mockito.*
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class BuildGraphTest {
    +    public class WithASingleStage {
    +        @Test
    +        void buildsTheStageThatItWasCreatedWith() {
    +            Stage startStage = mock(Stage.class)
    +            BuildGraph graph = new BuildGraph(startStage)
    +
    +            graph.build()
    +
    +            verify(startStage, times(1)).build()
    +        }
    +    }
    +
    +    public class WithMultipleStages {
    +        @Test
    +        void buildsTheStagesInOrder() {
    +            Stage stage1 = mock(Stage.class)
    +            Stage stage2 = mock(Stage.class)
    +            Stage stage3 = mock(Stage.class)
    +            Stage stage4 = mock(Stage.class)
    +
    +            BuildGraph graph = new BuildGraph(stage1).then(stage2)
    +                                                     .then(stage3)
    +                                                     .then(stage4)
    +                                                     .build()
    +
    +            InOrder inOrder = inOrder(stage1, stage2, stage3, stage4);
    +            inOrder.verify(stage1, times(1)).build()
    +            inOrder.verify(stage2, times(1)).build()
    +            inOrder.verify(stage3, times(1)).build()
    +            inOrder.verify(stage4, times(1)).build()
    +        }
    +    }
    +}
    diff --git a/test/ConditionalApplyPluginTest.groovy b/test/ConditionalApplyPluginTest.groovy
    new file mode 100644
    index 00000000..80dc5489
    --- /dev/null
    +++ b/test/ConditionalApplyPluginTest.groovy
    @@ -0,0 +1,58 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +
    +import static org.hamcrest.Matchers.*
    +import static org.mockito.Mockito.mock;
    +import static org.mockito.Mockito.when;
    +import static org.mockito.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class ConditionApplyPluginTest {
    +    @After
    +    public void reset() {
    +        Jenkinsfile.instance = null
    +    }
    +
    +    private configureJenkins(Map config = [:]) {
    +        Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
    +        when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +    }
    +
    +    @Test
    +    void modifiesTerraformEnvironmentStageByDefault() {
    +        Collection actualPlugins = TerraformEnvironmentStage.getPlugins()
    +
    +        assertThat(actualPlugins, hasItem(instanceOf(ConditionalApplyPlugin.class)))
    +    }
    +
    +    class ShouldApply {
    +        @Test
    +        void returnsTrueForMaster() {
    +            configureJenkins(env: [ BRANCH_NAME: 'master' ])
    +            def plugin = new ConditionalApplyPlugin()
    +
    +            assertTrue(plugin.shouldApply())
    +        }
    +
    +        @Test
    +        void returnsFalseForNonMaster() {
    +            configureJenkins(env: [ BRANCH_NAME: 'notMaster' ])
    +            def plugin = new ConditionalApplyPlugin()
    +
    +            assertFalse(plugin.shouldApply())
    +        }
    +
    +        @Test
    +        void returnsTrueWhenBranchIsUnknown() {
    +            configureJenkins(env: [ : ])
    +            def plugin = new ConditionalApplyPlugin()
    +
    +            assertTrue(plugin.shouldApply())
    +        }
    +    }
    +}
    +
    diff --git a/test/ConfirmApplyPluginTest.groovy b/test/ConfirmApplyPluginTest.groovy
    new file mode 100644
    index 00000000..2239eec3
    --- /dev/null
    +++ b/test/ConfirmApplyPluginTest.groovy
    @@ -0,0 +1,36 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class ConfirmApplyPluginTest {
    +    @After
    +    void reset() {
    +        ConfirmApplyPlugin.enabled = true
    +    }
    +
    +    @Test
    +    void modifiesTerraformEnvironmentStageByDefault() {
    +        Collection actualPlugins = TerraformEnvironmentStage.getPlugins()
    +
    +        assertThat(actualPlugins, hasItem(instanceOf(ConfirmApplyPlugin.class)))
    +    }
    +
    +    @Test
    +    void ConfirmApplyPluginEnabled() {
    +        ConfirmApplyPlugin.enable()
    +
    +        assertTrue(ConfirmApplyPlugin.enabled)
    +    }
    +
    +    @Test
    +    void ConfirmApplyPluginDisabled() {
    +        ConfirmApplyPlugin.disable()
    +
    +        assertFalse(ConfirmApplyPlugin.enabled)
    +    }
    +}
    +
    diff --git a/test/ConsulBackendPluginTest.groovy b/test/ConsulBackendPluginTest.groovy
    new file mode 100644
    index 00000000..01ece859
    --- /dev/null
    +++ b/test/ConsulBackendPluginTest.groovy
    @@ -0,0 +1,125 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.mockito.Mockito.when;
    +import static org.mockito.Mockito.mock;
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class ConsulBackendPluginTest {
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            TerraformInitCommand.resetPlugins()
    +        }
    +
    +        @Test
    +        void modifiesTerraformInitCommand() {
    +            ConsulBackendPlugin.init()
    +
    +            Collection actualPlugins = TerraformInitCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(ConsulBackendPlugin.class)))
    +        }
    +    }
    +
    +    public class Apply {
    +        @Before
    +        public void resetJenkinsfile() {
    +            Jenkinsfile.instance = mock(Jenkinsfile.class)
    +            when(Jenkinsfile.instance.getEnv()).thenReturn([:])
    +        }
    +
    +        private configureJenkins(Map config = [:]) {
    +            Jenkinsfile.instance = mock(Jenkinsfile.class)
    +            when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
    +            when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +        }
    +
    +        public class PathBackendParameter {
    +            @Test
    +            void isAddedAndIsEnvironmentSpecific() {
    +                String repoSlug = 'myOrg/myRepo'
    +                configureJenkins(repoSlug: repoSlug)
    +
    +                String environment = "myEnv"
    +                ConsulBackendPlugin plugin = new ConsulBackendPlugin()
    +                TerraformInitCommand command = new TerraformInitCommand(environment)
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("-backend-config=path=terraform/${repoSlug}_${environment}"))
    +            }
    +
    +            @Test
    +            void isAddedAndUsesCustomizablePattern() {
    +                configureJenkins(repoSlug: 'someOrg/someRepo')
    +
    +                ConsulBackendPlugin.pathPattern = { String env -> "customPatternFor_${env}" }
    +                ConsulBackendPlugin plugin = new ConsulBackendPlugin()
    +                TerraformInitCommand command = new TerraformInitCommand("myEnv")
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("-backend-config=path=customPatternFor_myEnv"))
    +            }
    +        }
    +
    +        public class AddressBackendParameter {
    +            @Test
    +            void isNotAddedByDefault() {
    +                ConsulBackendPlugin plugin = new ConsulBackendPlugin()
    +                TerraformInitCommand command = new TerraformInitCommand('someEnvironment')
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, not(containsString("-backend-config=address")))
    +            }
    +
    +            @Test
    +            void isAddedIfEnvironmentVariablePresent() {
    +                String expectedConsulAddress = 'someAddress'
    +                configureJenkins(env: [ DEFAULT_CONSUL_ADDRESS: expectedConsulAddress ])
    +                ConsulBackendPlugin plugin = new ConsulBackendPlugin()
    +                TerraformInitCommand command = new TerraformInitCommand('someEnvironment')
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("-backend-config=address=${expectedConsulAddress}"))
    +            }
    +
    +            @Test
    +            void isAddedIfExplicitlySet() {
    +                String expectedConsulAddress = 'someAddress'
    +                ConsulBackendPlugin.defaultAddress = expectedConsulAddress
    +                ConsulBackendPlugin plugin = new ConsulBackendPlugin()
    +                TerraformInitCommand command = new TerraformInitCommand('someEnvironment')
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("-backend-config=address=${expectedConsulAddress}"))
    +            }
    +
    +            @Test
    +            void isAddedAndPrefersTheExplicitValueOverTheDefaultEnvironmentValue() {
    +                String expectedConsulAddress = 'theRightValue'
    +                ConsulBackendPlugin.defaultAddress = expectedConsulAddress
    +                configureJenkins(env: [ DEFAULT_CONSUL_ADDRESS: 'theWrongValue' ])
    +
    +                ConsulBackendPlugin plugin = new ConsulBackendPlugin()
    +                TerraformInitCommand command = new TerraformInitCommand('someEnvironment')
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("-backend-config=address=${expectedConsulAddress}"))
    +            }
    +        }
    +    }
    +}
    diff --git a/test/CredentialsPluginTest.groovy b/test/CredentialsPluginTest.groovy
    new file mode 100644
    index 00000000..f15faae2
    --- /dev/null
    +++ b/test/CredentialsPluginTest.groovy
    @@ -0,0 +1,137 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class CredentialsPluginTest {
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            BuildStage.resetPlugins()
    +            CredentialsPlugin.reset()
    +        }
    +
    +        @Test
    +        void modifiesBuildStage() {
    +            CredentialsPlugin.init()
    +
    +            Collection actualPlugins = BuildStage.getPlugins()
    +
    +            assertThat(actualPlugins, hasItem(instanceOf(CredentialsPlugin.class)))
    +        }
    +    }
    +
    +    public class WithBuildCredentials {
    +        @After
    +        void resetPlugin() {
    +            CredentialsPlugin.reset()
    +        }
    +
    +        @Test
    +        void addsCredentialsForBuildStage() {
    +            CredentialsPlugin.withBuildCredentials("credentials1")
    +
    +            def buildCredentials = CredentialsPlugin.getBuildCredentials()
    +            assertThat(buildCredentials, hasSize(1))
    +
    +            def credential = buildCredentials.find { it['credentialsId'] == "credentials1" }
    +            assertThat(credential, notNullValue())
    +        }
    +
    +        @Test
    +        void addsMultipleCredentialsForBuildStage() {
    +            CredentialsPlugin.withBuildCredentials("credentials1")
    +            CredentialsPlugin.withBuildCredentials("credentials2")
    +
    +            def buildCredentials = CredentialsPlugin.getBuildCredentials()
    +            assertThat(buildCredentials, hasSize(2))
    +
    +            def credential1 = buildCredentials.find { it['credentialsId'] == "credentials1" }
    +            assertThat(credential1, notNullValue())
    +            def credential2 = buildCredentials.find { it['credentialsId'] == "credentials2" }
    +            assertThat(credential2, notNullValue())
    +        }
    +    }
    +
    +    public class ToEnvironmentVariable {
    +        @Test
    +        void convertsLowercaseToUppercase() {
    +            String lower = "mYvar"
    +
    +            String result = CredentialsPlugin.toEnvironmentVariable(lower)
    +
    +            assertThat(result, is(equalTo("MYVAR")))
    +        }
    +
    +        @Test
    +        void convertsDashesToUnderscore() {
    +            String withDash = "MY-VAR"
    +
    +            String result = CredentialsPlugin.toEnvironmentVariable(withDash)
    +
    +            assertThat(result, is(equalTo("MY_VAR")))
    +        }
    +
    +        @Test
    +        void convertsAllTheThings() {
    +            String withAllTheThings = "my-Var"
    +
    +            String result = CredentialsPlugin.toEnvironmentVariable(withAllTheThings)
    +
    +            assertThat(result, is(equalTo("MY_VAR")))
    +        }
    +    }
    +
    +    public class PopulateDefaults {
    +        @Test
    +        void populatesCredentialsId() {
    +            String credentialsId = 'myId'
    +
    +            Map results = CredentialsPlugin.populateDefaults(credentialsId)
    +
    +            assertThat(results['credentialsId'], is(equalTo(credentialsId)))
    +        }
    +
    +        @Test
    +        void defaultsUserVariableUsingCredentialsId() {
    +            String credentialsId = 'myId'
    +
    +            Map results = CredentialsPlugin.populateDefaults(credentialsId)
    +
    +            assertThat(results['usernameVariable'], is(equalTo("MYID_USERNAME")))
    +        }
    +
    +        @Test
    +        void defaultsPasswordVariableUsingCredentialsId() {
    +            String credentialsId = 'myId'
    +
    +            Map results = CredentialsPlugin.populateDefaults(credentialsId)
    +
    +            assertThat(results['passwordVariable'], is(equalTo("MYID_PASSWORD")))
    +        }
    +
    +        @Test
    +        void allowsCustomUserVariable() {
    +            String credentialsId = 'myId'
    +            String customUserVariable = "MY_CUSTOM_USERNAME_VARIABLE"
    +
    +            Map results = CredentialsPlugin.populateDefaults(credentialsId, usernameVariable: customUserVariable)
    +
    +            assertThat(results['usernameVariable'], is(equalTo(customUserVariable)))
    +        }
    +
    +        @Test
    +        void allowsCustomPasswordVariable() {
    +            String credentialsId = 'myId'
    +            String customPasswordVariable = "MY_CUSTOM_PASSWORD_VARIABLE"
    +
    +            Map results = CredentialsPlugin.populateDefaults(credentialsId, passwordVariable: customPasswordVariable)
    +
    +            assertThat(results['passwordVariable'], is(equalTo(customPasswordVariable)))
    +        }
    +    }
    +}
    +
    diff --git a/test/CrqPluginTest.groovy b/test/CrqPluginTest.groovy
    new file mode 100644
    index 00000000..302c7398
    --- /dev/null
    +++ b/test/CrqPluginTest.groovy
    @@ -0,0 +1,125 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.mockito.Mockito.when;
    +import static org.mockito.Mockito.mock;
    +import static org.mockito.Mockito.mock;
    +import static org.mockito.Matchers.*
    +import static org.hamcrest.Matchers.*
    +import static org.mockito.Mockito.*;
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class CrqPluginTest {
    +    @After
    +    void resetJenkins() {
    +        when(Jenkinsfile.instance.getEnv()).thenReturn([:])
    +    }
    +
    +    private configureJenkins(Map config = [:]) {
    +        Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
    +        when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +    }
    +
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            TerraformEnvironmentStage.resetPlugins()
    +        }
    +
    +        @Test
    +        void modifiesTerraformEnvironmentStageCommand() {
    +            CrqPlugin.init()
    +
    +            Collection actualPlugins = TerraformEnvironmentStage.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(CrqPlugin.class)))
    +        }
    +    }
    +
    +    public class AddCrq {
    +        public class withCrqEnvironment {
    +            @Test
    +            public void shouldExecutePipeline() {
    +                configureJenkins(env: ['CRQ_ENVIRONMENT': 'MyCrqEnv'], repoSlug: 'Org/Repo')
    +
    +                def plugin = new CrqPlugin()
    +                Closure crqClosure = plugin.addCrq('myEnv')
    +                Closure pipeline = mock(Closure.class)
    +
    +                crqClosure.delegate = pipeline
    +                crqClosure.resolveStrategy = Closure.DELEGATE_FIRST
    +                crqClosure.call(pipeline)
    +
    +                verify(pipeline).call()
    +            }
    +
    +            // @Test shouldCallRemedierOpen
    +        }
    +
    +        public class withoutCrqEnvironment {
    +            @Test
    +            public void shouldExecutePipeline() {
    +                def plugin = new CrqPlugin()
    +                Closure crqClosure = plugin.addCrq('myEnv')
    +                Closure pipeline = mock(Closure.class)
    +
    +                crqClosure.delegate = pipeline
    +                crqClosure.resolveStrategy = Closure.DELEGATE_FIRST
    +                crqClosure.call(pipeline)
    +
    +                verify(pipeline).call()
    +            }
    +
    +            // @Test shouldNotCallRemedierOpen
    +        }
    +    }
    +
    +    public class GetCrqEnviroment {
    +        @Test
    +        void returnsCrqEnvirommentIfPresent() {
    +            def plugin = new CrqPlugin()
    +            String expectedCrqEnvironment = 'someEnvironment'
    +
    +            configureJenkins(env: ['CRQ_ENVIRONMENT': expectedCrqEnvironment])
    +
    +            String actualCrqEnvironment = plugin.getCrqEnvironment('myenv')
    +
    +            assertThat(actualCrqEnvironment, is(expectedCrqEnvironment))
    +        }
    +
    +        @Test
    +        void returnsEnvironmentSpecificCrqEnvirommentIfPresent() {
    +            def plugin = new CrqPlugin()
    +            String expectedCrqEnvironment = 'someEnvironment'
    +
    +            configureJenkins(env: ['MYENV_CRQ_ENVIRONMENT': expectedCrqEnvironment])
    +
    +            String actualCrqEnvironment = plugin.getCrqEnvironment('myenv')
    +
    +            assertThat(actualCrqEnvironment, is(expectedCrqEnvironment))
    +        }
    +
    +        @Test
    +        void prefersNonPrefixedCrqOverPrefixedCrq() {
    +            // The UseCase:
    +            //     Set PROD_CRQ_ENVIRONMENT as a global variable, to make multiple pipeline's prod behave the same way
    +            //     Set CRQ_ENVIRONMENT in a specific app's prod environment (eg: parameterstore), to override the global value
    +            def plugin = new CrqPlugin()
    +            String nonPrefixedCrq = 'nonPrefixed'
    +            String prefixedCrq = 'prefixed'
    +
    +            configureJenkins(env: [
    +                'CRQ_ENVIRONMENT': nonPrefixedCrq,
    +                'MYENV_CRQ_ENVIRONMENT': prefixedCrq
    +            ])
    +
    +            String actualCrqEnvironment = plugin.getCrqEnvironment('myenv')
    +
    +            assertThat(actualCrqEnvironment, is(nonPrefixedCrq))
    +        }
    +
    +    }
    +}
    +
    diff --git a/test/DefaultEnvironmentPluginTest.groovy b/test/DefaultEnvironmentPluginTest.groovy
    new file mode 100644
    index 00000000..934963c7
    --- /dev/null
    +++ b/test/DefaultEnvironmentPluginTest.groovy
    @@ -0,0 +1,19 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class DefaultEnvironmentPluginTest {
    +    public class Init {
    +        @Test
    +        void modifiesTerraformEnvironmentStageByDefault() {
    +            Collection actualPlugins = TerraformEnvironmentStage.getPlugins()
    +
    +            assertThat(actualPlugins, hasItem(instanceOf(DefaultEnvironmentPlugin.class)))
    +        }
    +    }
    +}
    +
    diff --git a/test/FileParametersPluginTest.groovy b/test/FileParametersPluginTest.groovy
    new file mode 100644
    index 00000000..ee58ec61
    --- /dev/null
    +++ b/test/FileParametersPluginTest.groovy
    @@ -0,0 +1,83 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.mockito.Mockito.when;
    +import static org.mockito.Mockito.mock;
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class FileParametersPluginTest {
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            TerraformEnvironmentStage.resetPlugins()
    +        }
    +
    +        @Test
    +        void modifiesTerraformEnvironmentStage() {
    +            FileParametersPlugin.init()
    +
    +            Collection actualPlugins = TerraformEnvironmentStage.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(FileParametersPlugin.class)))
    +        }
    +    }
    +
    +    public class GetVariables {
    +        @After
    +        public void resetJenkinsfile() {
    +            Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        }
    +
    +        private configureJenkinsfile(Map config = [:]) {
    +            Jenkinsfile.instance = mock(Jenkinsfile.class)
    +            when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +        }
    +
    +        @Test
    +        void returnsAValueForEachLine() {
    +            List expectedValues = [ "VAR1=VALUE1", "VAR2=VALUE2" ]
    +            String fileContents = expectedValues.join('\n')
    +
    +            FileParametersPlugin plugin = new FileParametersPlugin()
    +            List actualValues = plugin.getVariables(fileContents)
    +
    +            assertEquals(expectedValues, actualValues)
    +        }
    +
    +        @Test
    +        void ignoresTrailingNewline() {
    +            List expectedValues = [ "VAR1=VALUE1", "VAR2=VALUE2" ]
    +            String fileContents = expectedValues.join('\n') + '\n\n'
    +
    +            FileParametersPlugin plugin = new FileParametersPlugin()
    +            List actualValues = plugin.getVariables(fileContents)
    +
    +            assertEquals(expectedValues, actualValues)
    +        }
    +
    +        @Test
    +        void handlesCarriageReturnCharacters() {
    +            List expectedValues = [ "VAR1=VALUE1", "VAR2=VALUE2" ]
    +            String fileContents = expectedValues.join('\r\n')
    +
    +            FileParametersPlugin plugin = new FileParametersPlugin()
    +            List actualValues = plugin.getVariables(fileContents)
    +
    +            assertEquals(expectedValues, actualValues)
    +        }
    +
    +        @Test
    +        void interpolatesReferencesToOtherEnvironmentVariables() {
    +            configureJenkinsfile(env: [ OTHER_VARIABLE: 'VALUE1' ])
    +            String fileContents = 'SOME_VARIABLE=${env.OTHER_VARIABLE}'
    +
    +            FileParametersPlugin plugin = new FileParametersPlugin()
    +            List actualValues = plugin.getVariables(fileContents)
    +
    +            assertEquals(["SOME_VARIABLE=VALUE1"], actualValues)
    +        }
    +    }
    +}
    +
    diff --git a/test/JenkinsfileTest.groovy b/test/JenkinsfileTest.groovy
    new file mode 100644
    index 00000000..f519998c
    --- /dev/null
    +++ b/test/JenkinsfileTest.groovy
    @@ -0,0 +1,124 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import Jenkinsfile
    +
    +import static org.mockito.Mockito.mock
    +import static org.mockito.Mockito.when
    +import static org.hamcrest.Matchers.*
    +
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class JenkinsfileTest {
    +    private Jenkinsfile jenkinsfile
    +
    +    @Before
    +    public void setup() {
    +        jenkinsfile = new Jenkinsfile()
    +    }
    +
    +    public class ParseScmUrl {
    +        public class WithHttpUrl {
    +            public class WithHttp {
    +                @Test
    +                void returnsOrganization() {
    +                    String organization = "MyOrg"
    +                    Map results = jenkinsfile.parseScmUrl("http://my.github.com/${organization}/SomeRepo.git")
    +
    +                    assertEquals(results['organization'], organization)
    +                }
    +
    +                @Test
    +                void returnsRepo() {
    +                    String repo = "MyRepo"
    +                    Map results = jenkinsfile.parseScmUrl("http://my.github.com/SomeOrg/${repo}.git")
    +
    +                    assertEquals(results['repo'], repo)
    +                }
    +            }
    +
    +            public class WithHttps {
    +                @Test
    +                void returnsOrganization() {
    +                    String organization = "MyOrg"
    +                    Map results = jenkinsfile.parseScmUrl("https://my.github.com/${organization}/SomeRepo.git")
    +
    +                    assertEquals(results['organization'], organization)
    +                }
    +
    +                @Test
    +                void returnsRepo() {
    +                    String repo = "MyRepo"
    +                    Map results = jenkinsfile.parseScmUrl("https://my.github.com/SomeOrg/${repo}.git")
    +
    +                    assertEquals(results['repo'], repo)
    +                }
    +            }
    +        }
    +
    +        public class WithSshUrl {
    +            @Test
    +            void returnsOrganization() {
    +                String organization = "MyOrg"
    +                Map results = jenkinsfile.parseScmUrl("git@my.github.com:${organization}/SomeRepo.git")
    +
    +                assertEquals(results['organization'], organization)
    +            }
    +
    +            @Test
    +            void returnsRepo() {
    +                String repo = "MyRepo"
    +                Map results = jenkinsfile.parseScmUrl("git@my.github.com:SomeOrg/${repo}.git")
    +
    +                assertEquals(results['repo'], repo)
    +            }
    +        }
    +    }
    +
    +    public class GetNodeName {
    +        @After
    +        void reset() {
    +            Jenkinsfile.defaultNodeName = null
    +            Jenkinsfile.instance = null
    +        }
    +
    +        private configureJenkins(Map config = [:]) {
    +            Jenkinsfile.instance = mock(Jenkinsfile.class)
    +            when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
    +            when(Jenkinsfile.instance.getRepoName()).thenReturn(config.repoName ?: 'repo')
    +            when(Jenkinsfile.instance.getOrganization()).thenReturn(config.organization ?: 'org')
    +            when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +        }
    +
    +        @Test
    +        void returnsDefaultNodeNameWhenPresent() {
    +            String expectedName = "someName"
    +            Jenkinsfile.defaultNodeName = expectedName
    +
    +            String actualName = Jenkinsfile.getNodeName()
    +            assertEquals(actualName, expectedName)
    +        }
    +
    +        @Test
    +        void returnsDefaultNodeNameEvenWhenEnvironmentVariableGiven() {
    +            String expectedName = "expectedName"
    +            Jenkinsfile.defaultNodeName = expectedName
    +            configureJenkins(env: [ DEFAULT_NODE_NAME: 'wrongName' ])
    +
    +            String actualName = Jenkinsfile.getNodeName()
    +            assertEquals(actualName, expectedName)
    +        }
    +
    +        @Test
    +        void returnsEnvironmentVariableWhenDefaultNodeNameNotGiven() {
    +            String expectedName = 'expectedName'
    +            Jenkinsfile.defaultNodeName = null
    +            configureJenkins(env: [ DEFAULT_NODE_NAME: expectedName ])
    +
    +            String actualName = Jenkinsfile.getNodeName()
    +            assertEquals(actualName, expectedName)
    +        }
    +    }
    +}
    diff --git a/test/ParameterStoreBuildWrapperPluginTest.groovy b/test/ParameterStoreBuildWrapperPluginTest.groovy
    new file mode 100644
    index 00000000..a05aade5
    --- /dev/null
    +++ b/test/ParameterStoreBuildWrapperPluginTest.groovy
    @@ -0,0 +1,55 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.mockito.Mockito.mock
    +import static org.mockito.Mockito.when
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class ParameterStoreBuildWrapperPluginTest {
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            TerraformEnvironmentStage.resetPlugins()
    +        }
    +
    +        @Test
    +        void modifiesTerraformEnvironmentStageCommand() {
    +            ParameterStoreBuildWrapperPlugin.init()
    +
    +            Collection actualPlugins = TerraformEnvironmentStage.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(ParameterStoreBuildWrapperPlugin.class)))
    +        }
    +    }
    +
    +    public class PathForEnvironment {
    +        @After
    +        public void reset() {
    +            Jenkinsfile.instance = null
    +        }
    +
    +        private configureJenkins(Map config = [:]) {
    +            Jenkinsfile.instance = mock(Jenkinsfile.class)
    +            when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
    +            when(Jenkinsfile.instance.getRepoName()).thenReturn(config.repoName ?: 'repo')
    +            when(Jenkinsfile.instance.getOrganization()).thenReturn(config.organization ?: 'org')
    +            when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +        }
    +
    +        @Test
    +        void constructPathUsingOrgRepoAndEnvironment() {
    +            String organization = "MyOrg"
    +            String repoName = "MyRepo"
    +            String environment = "qa"
    +
    +            configureJenkins(repoName: repoName, organization: organization)
    +            ParameterStoreBuildWrapperPlugin plugin = new ParameterStoreBuildWrapperPlugin()
    +
    +            String actual = plugin.pathForEnvironment(environment)
    +            assertEquals(actual, "/${organization}/${repoName}/${environment}/".toString())
    +        }
    +    }
    +}
    +
    diff --git a/test/ParameterStoreExecPluginTest.groovy b/test/ParameterStoreExecPluginTest.groovy
    new file mode 100644
    index 00000000..50340477
    --- /dev/null
    +++ b/test/ParameterStoreExecPluginTest.groovy
    @@ -0,0 +1,93 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.mockito.Mockito.when;
    +import static org.mockito.Mockito.mock;
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class ParameterStoreExecPluginTest {
    +    @After
    +    public void reset() {
    +        Jenkinsfile.instance = null
    +        TerraformEnvironmentStage.resetPlugins()
    +        TerraformPlanCommand.resetPlugins()
    +        TerraformApplyCommand.resetPlugins()
    +    }
    +
    +    private configureJenkins(Map config = [:]) {
    +        Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        when(Jenkinsfile.instance.getOrganization()).thenReturn(config.organization)
    +        when(Jenkinsfile.instance.getRepoName()).thenReturn(config.repoName)
    +        when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +    }
    +
    +    public class Init {
    +        @Test
    +        void modifiesTerraformEnvironmentStage() {
    +            ParameterStoreExecPlugin.init()
    +
    +            Collection actualPlugins = TerraformEnvironmentStage.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(ParameterStoreExecPlugin.class)))
    +        }
    +
    +        @Test
    +        void modifiesTerraformPlanCommand() {
    +            ParameterStoreExecPlugin.init()
    +
    +            Collection actualPlugins = TerraformPlanCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(ParameterStoreExecPlugin.class)))
    +        }
    +
    +        @Test
    +        void modifiesTerraformApplyCommand() {
    +            ParameterStoreExecPlugin.init()
    +
    +            Collection actualPlugins = TerraformApplyCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(ParameterStoreExecPlugin.class)))
    +        }
    +    }
    +
    +    public class Apply {
    +        @Test
    +        void addsParameterStorePrefixToTerraformPlan() {
    +            ParameterStoreExecPlugin plugin = new ParameterStoreExecPlugin()
    +            TerraformPlanCommand command = new TerraformPlanCommand()
    +
    +            plugin.apply(command)
    +
    +            String result = command.toString()
    +            assertThat(result, containsString("parameter-store-exec terraform plan"))
    +        }
    +
    +        @Test
    +        void addsParameterStorePrefixToTerraformApply() {
    +            ParameterStoreExecPlugin plugin = new ParameterStoreExecPlugin()
    +            TerraformApplyCommand command = new TerraformApplyCommand()
    +
    +            plugin.apply(command)
    +
    +            String result = command.toString()
    +            assertThat(result, containsString("parameter-store-exec terraform apply"))
    +        }
    +    }
    +
    +    public class PathForEnvironment {
    +        @Test
    +        void constructPathUsingOrgRepoAndEnvironment() {
    +            String organization = 'SomeOrg'
    +            String repoName = 'SomeRepo'
    +            String environment = "qa"
    +
    +            configureJenkins(organization: organization, repoName: repoName)
    +            ParameterStoreExecPlugin plugin = new ParameterStoreExecPlugin()
    +
    +            String actual = plugin.pathForEnvironment(environment)
    +            assertEquals(actual, "/${organization}/${repoName}/${environment}/".toString())
    +        }
    +    }
    +
    +}
    +
    diff --git a/test/RegressionStageTest.groovy b/test/RegressionStageTest.groovy
    new file mode 100644
    index 00000000..93144fda
    --- /dev/null
    +++ b/test/RegressionStageTest.groovy
    @@ -0,0 +1,94 @@
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +
    +import static org.mockito.Mockito.mock
    +import static org.mockito.Mockito.verify
    +import static org.mockito.Mockito.when
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class RegressionStageTest {
    +
    +    public class AutomationRepo {
    +        @After
    +        void reset() {
    +            TerraformEnvironmentStage.resetPlugins()
    +            Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        }
    +
    +        private configureJenkins(Map config = [:]) {
    +            Jenkinsfile.instance = mock(Jenkinsfile.class)
    +            when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
    +            when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +        }
    +
    +        @Test
    +        void automationRepoSpecifiedSuccessfullyCallApply(){
    +            RegressionStagePlugin fakePlugin = mock(RegressionStagePlugin.class)
    +            RegressionStage.addPlugin(fakePlugin)
    +
    +            configureJenkins()
    +            RegressionStage stage = new RegressionStage().withScm("git:someHost:someUser/someRepo.git")
    +            stage.build()
    +
    +            verify(fakePlugin).apply(stage)
    +        }
    +
    +        @Test
    +        void automationRepoAndAppRepoSpecifiedSuccessfullyCallApply(){
    +            RegressionStagePlugin fakePlugin = mock(RegressionStagePlugin.class)
    +            RegressionStage.addPlugin(fakePlugin)
    +
    +            configureJenkins()
    +            RegressionStage stage = new RegressionStage().withScm("git:someHost:someUser/someRepo.git")
    +                                                         .withScm("git:someHost:someUser/someOtherRepo.git")
    +            stage.build()
    +
    +            verify(fakePlugin).apply(stage)
    +        }
    +
    +        @Test
    +        void automationRepoAndAppRepoWithChangeDirectorySpecifiedSuccessfullyCallApply(){
    +            RegressionStagePlugin fakePlugin = mock(RegressionStagePlugin.class)
    +            RegressionStage.addPlugin(fakePlugin)
    +
    +            configureJenkins()
    +            RegressionStage stage = new RegressionStage().withScm("git:someHost:someUser/someRepo.git")
    +                    .withScm("git:someHost:someUser/someOtherRepo.git")
    +                    .changeDirectory("someDir")
    +            stage.build()
    +
    +            verify(fakePlugin).apply(stage)
    +        }
    +
    +        @Test
    +        void noAutomationRepoSpecifiedSuccessfullyCallApply(){
    +            RegressionStagePlugin fakePlugin = mock(RegressionStagePlugin.class)
    +            RegressionStage.addPlugin(fakePlugin)
    +
    +            configureJenkins()
    +            RegressionStage stage = new RegressionStage()
    +            stage.build()
    +
    +            verify(fakePlugin).apply(stage)
    +        }
    +    }
    +
    +    public class AddedPlugins {
    +        @After
    +        void resetPlugins() {
    +            TerraformEnvironmentStage.resetPlugins()
    +        }
    +
    +        @Test
    +        void willHaveApplyCalled() {
    +            RegressionStagePlugin fakePlugin = mock(RegressionStagePlugin.class)
    +            RegressionStage.addPlugin(fakePlugin)
    +
    +            RegressionStage stage = new RegressionStage()
    +            stage.applyPlugins()
    +
    +            verify(fakePlugin).apply(stage)
    +        }
    +    }
    +}
    diff --git a/test/S3BackendPluginTest.groovy b/test/S3BackendPluginTest.groovy
    new file mode 100644
    index 00000000..2a6ab52f
    --- /dev/null
    +++ b/test/S3BackendPluginTest.groovy
    @@ -0,0 +1,371 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.mockito.Mockito.when;
    +import static org.mockito.Mockito.mock;
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class S3BackendPluginTest {
    +    @After
    +    void resetJenkins() {
    +        when(Jenkinsfile.instance.getEnv()).thenReturn([:])
    +    }
    +
    +    private configureJenkins(Map config = [:]) {
    +        Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
    +        when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +    }
    +
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            TerraformInitCommand.resetPlugins()
    +        }
    +
    +        @Test
    +        void addsS3BackendPluginToListOfPlugins() {
    +            S3BackendPlugin.init()
    +
    +            Collection actualPlugins = TerraformInitCommand.getPlugins()
    +            assertThat(actualPlugins, contains(instanceOf(S3BackendPlugin.class)))
    +        }
    +    }
    +
    +    public class Apply {
    +        @After
    +        void reset() {
    +            S3BackendPlugin.keyPattern = null
    +        }
    +
    +        @Test
    +        void addsEnvironmentSpecificKeyAsBackendParameter() {
    +            String repoSlug = 'myOrg/myRepo'
    +            configureJenkins(repoSlug: repoSlug)
    +
    +            String environment = "myEnv"
    +            S3BackendPlugin plugin = new S3BackendPlugin()
    +            TerraformInitCommand command = new TerraformInitCommand(environment)
    +
    +            plugin.apply(command)
    +
    +            String result = command.toString()
    +            assertThat(result, containsString("-backend-config=key=terraform/${repoSlug}/${environment}"))
    +        }
    +
    +        @Test
    +        void addsBucketPreDefinedByEnvironmentAsBackendParameter() {
    +            String expectedBucket = 'bucket'
    +            configureJenkins(env: [MYENV_S3_BACKEND_BUCKET: expectedBucket])
    +
    +            String environment = "myEnv"
    +            S3BackendPlugin plugin = new S3BackendPlugin()
    +            TerraformInitCommand command = new TerraformInitCommand(environment)
    +
    +            plugin.apply(command)
    +
    +            String result = command.toString()
    +            assertThat(result, containsString("-backend-config=bucket=${expectedBucket}"))
    +        }
    +
    +        @Test
    +        void addsBucketRegionUsingPreDefinedEnvironmentVariableAsBackendParameter() {
    +            String expectedRegion = 'theFarEast'
    +            configureJenkins(env: [ 'DEFAULT_S3_BACKEND_REGION': expectedRegion ])
    +
    +            String environment = "myEnv"
    +            S3BackendPlugin plugin = new S3BackendPlugin()
    +            TerraformInitCommand command = new TerraformInitCommand(environment)
    +
    +            plugin.apply(command)
    +
    +            String result = command.toString()
    +            assertThat(result, containsString("-backend-config=region=${expectedRegion}"))
    +        }
    +
    +        @Test
    +        void addsDynamoDbTableAsBackendParameter() {
    +            String dynamodb_table = 'terraform-state-lock-dynamo'
    +            configureJenkins(env: [ 'MYENV_S3_BACKEND_DYNAMO_TABLE_LOCK': dynamodb_table ])
    +
    +            String environment = "myEnv"
    +            S3BackendPlugin plugin = new S3BackendPlugin()
    +            TerraformInitCommand command = new TerraformInitCommand(environment)
    +
    +            plugin.apply(command)
    +
    +            String result = command.toString()
    +            assertThat(result, containsString("-backend-config=dynamodb_table=${dynamodb_table}"))
    +        }
    +
    +        @Test
    +        void skipsDynamoDbTableAsBackendParameter() {
    +            configureJenkins()
    +
    +            String environment = "myEnv"
    +            S3BackendPlugin plugin = new S3BackendPlugin()
    +            TerraformInitCommand command = new TerraformInitCommand(environment)
    +
    +            plugin.apply(command)
    +
    +            String result = command.toString()
    +            assertThat(result, not(containsString("-backend-config=dynamodb_table=")))
    +        }
    +
    +        @Test
    +        void isAddedAndUsesCustomizedPatternFolderKeyAsBackendParameter() {
    +            String repoSlug = 'myOrg/myRepo'
    +            configureJenkins(repoSlug: repoSlug)
    +
    +            S3BackendPlugin.keyPattern = { String env -> "customPatternFor/${repoSlug}/entropy/${env}" }
    +            S3BackendPlugin plugin = new S3BackendPlugin()
    +            
    +            String environment = "myEnv"
    +            TerraformInitCommand command = new TerraformInitCommand(environment)
    +            plugin.apply(command)
    +            assertThat(command.toString(), containsString("-backend-config=key=customPatternFor/${repoSlug}/entropy/${environment}"))
    +        }
    +    }
    +
    +    public class GetBackend {
    +        @Test
    +        void shouldReturnTheValueOfS3BackendBucket() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedBucket = 'defaultBucket'
    +
    +            configureJenkins(env: ['S3_BACKEND_BUCKET': expectedBucket])
    +
    +            String actualBucket = plugin.getBucket('myenv')
    +
    +            assertThat(actualBucket, is(expectedBucket))
    +        }
    +
    +        @Test
    +        void shouldReturnTheValueOfTheEnvironmentSpecificS3BackendBucket() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedBucket = 'myBucket'
    +
    +            configureJenkins(env: ['MYENV_S3_BACKEND_BUCKET': expectedBucket])
    +
    +            String actualBucket = plugin.getBucket('myenv')
    +
    +            assertThat(actualBucket, is(expectedBucket))
    +        }
    +
    +        @Test
    +        void shouldReturnTheValueOfTheEnvironmentSpecificS3BackendBucketCaseInsensitive() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedBucket = 'myBucket'
    +
    +            configureJenkins(env: ['myenv_S3_BACKEND_BUCKET': expectedBucket])
    +
    +            String actualBucket = plugin.getBucket('myenv')
    +
    +            assertThat(actualBucket, is(expectedBucket))
    +        }
    +
    +        @Test
    +        void shouldPreferS3BackendBucketOverEnvironmentSpecificBucket() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedBucket = "thisBucket"
    +            configureJenkins(env: ['S3_BACKEND_BUCKET': expectedBucket,
    +                                   'MYENV_S3_BACKEND_BUCKET': 'notThisBucket',
    +                                   'myenv_S3_BACKEND_BUCKET': 'notThisBucketEither'])
    +
    +            String actualBucket = plugin.getBucket('myenv')
    +
    +            assertThat(actualBucket, is(expectedBucket))
    +        }
    +    }
    +
    +    public class GetRegion {
    +        @Test
    +        void shouldReturnTheValueOfDefaultS3BackendRegion() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedRegion = 'defaultRegion'
    +
    +            configureJenkins(env: ['DEFAULT_S3_BACKEND_REGION': expectedRegion])
    +
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +
    +        @Test
    +        void shouldReturnTheValueOfS3BackendRegion() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedRegion = 'region'
    +
    +            configureJenkins(env: ['S3_BACKEND_REGION': expectedRegion])
    +
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +
    +        @Test
    +        void shouldReturnTheValueOfEnvironmentSpecificS3BackendRegion() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedRegion = 'environmentSpecificRegion'
    +
    +            configureJenkins(env: ['MYENV_S3_BACKEND_REGION': expectedRegion])
    +
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +
    +        @Test
    +        void shouldReturnTheValueOfEnvironmentSpecificS3BackendRegionCaseInsensitive() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedRegion = 'environmentSpecificRegion'
    +
    +            configureJenkins(env: ['myenv_S3_BACKEND_REGION': expectedRegion])
    +
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +
    +        @Test
    +        void shouldPreferS3BackendRegionOverEnvironmentSpecificRegion() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedRegion = 'thisRegion'
    +
    +            configureJenkins(env: [
    +                'S3_BACKEND_REGION': expectedRegion,
    +                'myenv_S3_BACKEND_REGION': 'notThisRegion'
    +            ])
    +
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +
    +        @Test
    +        void shouldPreferEnvironmentSpecificRegionOverDeprecatedDefaultS3BackendRegion() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedRegion = 'thisRegion'
    +
    +            configureJenkins(env: [
    +                'MYENV_S3_BACKEND_REGION': expectedRegion,
    +                'DEFAULT_S3_BACKEND_REGION': "notThisRegion"
    +            ])
    +
    +            String actualRegion = plugin.getRegion('myenv')
    +
    +            assertThat(actualRegion, is(expectedRegion))
    +        }
    +    }
    +
    +    public class GetKey {
    +        @After
    +        void resetPlugins() {
    +            S3BackendPlugin.keyPattern = null
    +        }
    +
    +        @Test
    +        void shouldBeGeneratedFromRepoSlugAndEnvironment() {
    +            def plugin = new S3BackendPlugin()
    +
    +            configureJenkins(repoSlug: 'Org/App')
    +
    +            String actualKey = plugin.getKey('myenv')
    +
    +            assertThat(actualKey, is("terraform/Org/App/myenv"))
    +        }
    +
    +        @Test
    +        void shouldBeGeneratedFromTheCustomKeyPattern() {
    +            def plugin = new S3BackendPlugin()
    +            plugin.keyPattern = { environment -> "newPatternFor${environment}" }
    +
    +            String actualKey = plugin.getKey('myenv')
    +
    +            assertThat(actualKey, is("newPatternFormyenv"))
    +        }
    +    }
    +
    +    public class GetDynamoTable {
    +        @Test
    +        void shouldReturnDeprecatedS3BackendDynamoTableLockValue() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedTable = 'myDeprecatedDynamoTable'
    +
    +            configureJenkins(env: [MYENV_S3_BACKEND_DYNAMO_TABLE_LOCK: expectedTable])
    +
    +            String actualTable = plugin.getDynamodbTable('myenv')
    +
    +            assertThat(actualTable, is(expectedTable))
    +        }
    +
    +        @Test
    +        void shouldReturnS3BackendDynamodbTableValue() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedTable = 'myDynamoTable'
    +
    +            configureJenkins(env: [S3_BACKEND_DYNAMODB_TABLE: expectedTable])
    +
    +            String actualTable = plugin.getDynamodbTable('myenv')
    +
    +            assertThat(actualTable, is(expectedTable))
    +        }
    +
    +        @Test
    +        void shouldReturnEnvironmentSpecificS3BackendDynamodbTableValue() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedTable = 'myEnvDynamoTable'
    +
    +            configureJenkins(env: [MYENV_S3_BACKEND_DYNAMODB_TABLE: expectedTable])
    +
    +            String actualTable = plugin.getDynamodbTable('myenv')
    +
    +            assertThat(actualTable, is(expectedTable))
    +        }
    +
    +        @Test
    +        void shouldReturnEnvironmentSpecificS3BackendDynamodbTableValueCaseInsensitive() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedTable = 'myEnvDynamoTable'
    +
    +            configureJenkins(env: [myenv_S3_BACKEND_DYNAMODB_TABLE: expectedTable])
    +
    +            String actualTable = plugin.getDynamodbTable('myenv')
    +
    +            assertThat(actualTable, is(expectedTable))
    +        }
    +
    +        @Test
    +        void shouldPreferS3BackendDynamodbTableOverEnvironmentSpecificValue() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedTable = 'thisTable'
    +
    +            configureJenkins(env: [
    +                S3_BACKEND_DYNAMODB_TABLE: expectedTable,
    +                MYENV_S3_BACKEND_DYNAMODB_TABLE: 'notThisTable'
    +            ])
    +
    +            String actualTable = plugin.getDynamodbTable('myenv')
    +
    +            assertThat(actualTable, is(expectedTable))
    +        }
    +
    +        @Test
    +        void shouldPreferS3BackendDynamodbTableOverDeprecatedValue() {
    +            def plugin = new S3BackendPlugin()
    +            String expectedTable = 'thisTable'
    +
    +            configureJenkins(env: [
    +                S3_BACKEND_DYNAMODB_TABLE: expectedTable,
    +                MYENV_S3_BACKEND_DYNAMO_TABLE_LOCK: 'notThisTable'
    +            ])
    +
    +            String actualTable = plugin.getDynamodbTable('myenv')
    +
    +            assertThat(actualTable, is(expectedTable))
    +        }
    +    }
    +}
    diff --git a/test/TerraformApplyCommandTest.groovy b/test/TerraformApplyCommandTest.groovy
    new file mode 100644
    index 00000000..b93bbc61
    --- /dev/null
    +++ b/test/TerraformApplyCommandTest.groovy
    @@ -0,0 +1,135 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +
    +import static org.hamcrest.Matchers.*
    +import static org.mockito.Mockito.mock;
    +import static org.mockito.Mockito.verify;
    +import static org.mockito.Mockito.times;
    +
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class TerraformApplyCommandTest {
    +    public class WithInput {
    +        @Test
    +        void defaultsToFalse() {
    +            def command = new TerraformApplyCommand()
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" -input=false"))
    +        }
    +
    +        @Test
    +        void setsInputFlagToFalseWhenFalse() {
    +            def command = new TerraformApplyCommand().withInput(false)
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" -input=false"))
    +        }
    +
    +        @Test
    +        void skipsInputFlagWhenTrue() {
    +            def command = new TerraformApplyCommand().withInput(true)
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, not(containsString(" -input=false")))
    +        }
    +    }
    +
    +    public class WithArgument {
    +        @Test
    +        void addsArgument() {
    +            def command = new TerraformApplyCommand().withArgument('foo')
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" foo"))
    +        }
    +
    +        @Test
    +        void isCumulative() {
    +            def command = new TerraformApplyCommand().withArgument('foo').withArgument('bar')
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" foo"))
    +            assertThat(actualCommand, containsString(" bar"))
    +        }
    +    }
    +
    +    public class WithDirectory {
    +        @Test
    +        void addsDirectoryArgument() {
    +            def command = new TerraformApplyCommand().withDirectory("foobar")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, endsWith(" foobar"))
    +        }
    +    }
    +
    +    public class WithPrefix {
    +        @Test
    +        void addsPrefixToBeginningOfCommand() {
    +            def command = new TerraformApplyCommand().withPrefix("somePrefix")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, startsWith("somePrefix"))
    +        }
    +
    +        @Test
    +        void isCumulative() {
    +            def command = new TerraformApplyCommand().withPrefix("fooPrefix")
    +                                                     .withPrefix("barPrefix")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, startsWith("fooPrefix barPrefix"))
    +        }
    +    }
    +
    +    public class Plugins {
    +        @After
    +        void resetPlugins() {
    +            TerraformApplyCommand.resetPlugins()
    +        }
    +
    +        @Test
    +        void areAppliedToTheCommand() {
    +            TerraformApplyCommandPlugin plugin = mock(TerraformApplyCommandPlugin.class)
    +            TerraformApplyCommand.addPlugin(plugin)
    +
    +            TerraformApplyCommand command = TerraformApplyCommand.instanceFor("env")
    +            command.toString()
    +
    +            verify(plugin).apply(command)
    +        }
    +
    +        @Test
    +        void areAppliedExactlyOnce() {
    +            TerraformApplyCommandPlugin plugin = mock(TerraformApplyCommandPlugin.class)
    +            TerraformApplyCommand.addPlugin(plugin)
    +
    +            TerraformApplyCommand command = TerraformApplyCommand.instanceFor("env")
    +
    +            String firstCommand = command.toString()
    +            String secondCommand = command.toString()
    +
    +            verify(plugin, times(1)).apply(command)
    +        }
    +
    +        @Test
    +        void areAppliedEvenAfterCommandAlreadyInstantiated() {
    +            TerraformApplyCommandPlugin firstPlugin = mock(TerraformApplyCommandPlugin.class)
    +            TerraformApplyCommandPlugin secondPlugin = mock(TerraformApplyCommandPlugin.class)
    +
    +            TerraformApplyCommand.addPlugin(firstPlugin)
    +            TerraformApplyCommand command = TerraformApplyCommand.instanceFor("env")
    +
    +            TerraformApplyCommand.addPlugin(secondPlugin)
    +
    +            command.toString()
    +
    +            verify(secondPlugin, times(1)).apply(command)
    +        }
    +    }
    +}
    +
    diff --git a/test/TerraformDirectoryPluginTest.groovy b/test/TerraformDirectoryPluginTest.groovy
    new file mode 100644
    index 00000000..c858b044
    --- /dev/null
    +++ b/test/TerraformDirectoryPluginTest.groovy
    @@ -0,0 +1,156 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.mockito.Mockito.when;
    +import static org.mockito.Mockito.mock;
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class TerraformDirectoryPluginTest {
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            TerraformInitCommand.resetPlugins()
    +            TerraformValidateCommand.resetPlugins()
    +            TerraformPlanCommand.resetPlugins()
    +            TerraformApplyCommand.resetPlugins()
    +        }
    +
    +        @Test
    +        void modifiesTerraformInitCommand() {
    +            TerraformDirectoryPlugin.init()
    +
    +            Collection actualPlugins = TerraformInitCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(TerraformDirectoryPlugin.class)))
    +        }
    +
    +        @Test
    +        void modifiesTerraformValidateCommand() {
    +            TerraformDirectoryPlugin.init()
    +
    +            Collection actualPlugins = TerraformValidateCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(TerraformDirectoryPlugin.class)))
    +        }
    +
    +        @Test
    +        void modifiesTerraformPlanCommand() {
    +            TerraformDirectoryPlugin.init()
    +
    +            Collection actualPlugins = TerraformPlanCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(TerraformDirectoryPlugin.class)))
    +        }
    +
    +        @Test
    +        void modifiesTerraformApplyCommand() {
    +            TerraformDirectoryPlugin.init()
    +
    +            Collection actualPlugins = TerraformApplyCommand.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(TerraformDirectoryPlugin.class)))
    +        }
    +    }
    +
    +    public class Apply {
    +        @After
    +        void resetJenkinsEnv() {
    +            TerraformDirectoryPlugin.withDirectory("./terraform/")
    +        }
    +
    +        public class WithDirectoryProvided {
    +            @Test
    +            void addsDirectoryToTerraformInit() {
    +                TerraformDirectoryPlugin.withDirectory('./customDirectory/')
    +                def plugin = new TerraformDirectoryPlugin()
    +                TerraformInitCommand command = TerraformInitCommand.instanceFor("myEnv")
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("./customDirectory/"))
    +            }
    +
    +            @Test
    +            void addsDirectoryToTerraformValidate() {
    +                TerraformDirectoryPlugin.withDirectory('./customDirectory/')
    +                def plugin = new TerraformDirectoryPlugin()
    +                TerraformValidateCommand command = TerraformValidateCommand.instance()
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("./customDirectory/"))
    +            }
    +
    +            @Test
    +            void addsDirectoryToTerraformPlan() {
    +                TerraformDirectoryPlugin.withDirectory('./customDirectory/')
    +                def plugin = new TerraformDirectoryPlugin()
    +                TerraformPlanCommand command = TerraformPlanCommand.instanceFor("myEnv")
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("./customDirectory/"))
    +            }
    +
    +            @Test
    +            void addsDirectoryToTerraformApply() {
    +                TerraformDirectoryPlugin.withDirectory('./customDirectory/')
    +                def plugin = new TerraformDirectoryPlugin()
    +                TerraformApplyCommand command = TerraformApplyCommand.instanceFor("myEnv")
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("./customDirectory/"))
    +            }
    +        }
    +
    +        public class WithoutDirectoryProvided {
    +            @Test
    +            void addsDirectoryToTerraformInit() {
    +                def plugin = new TerraformDirectoryPlugin()
    +                TerraformInitCommand command = TerraformInitCommand.instanceFor("myEnv")
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("./terraform/"))
    +            }
    +
    +            @Test
    +            void addsDirectoryToTerraformValidate() {
    +                def plugin = new TerraformDirectoryPlugin()
    +                TerraformValidateCommand command = TerraformValidateCommand.instance()
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("./terraform/"))
    +            }
    +
    +            @Test
    +            void addsDirectoryToTerraformPlan() {
    +                def plugin = new TerraformDirectoryPlugin()
    +                TerraformPlanCommand command = TerraformPlanCommand.instanceFor("myEnv")
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("./terraform/"))
    +            }
    +
    +            @Test
    +            void addsDirectoryToTerraformApply() {
    +                def plugin = new TerraformDirectoryPlugin()
    +                TerraformApplyCommand command = TerraformApplyCommand.instanceFor("myEnv")
    +
    +                plugin.apply(command)
    +
    +                String result = command.toString()
    +                assertThat(result, containsString("./terraform/"))
    +            }
    +        }
    +    }
    +}
    diff --git a/test/TerraformEnvironmentStageTest.groovy b/test/TerraformEnvironmentStageTest.groovy
    new file mode 100644
    index 00000000..1167c612
    --- /dev/null
    +++ b/test/TerraformEnvironmentStageTest.groovy
    @@ -0,0 +1,92 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +
    +import static org.mockito.Mockito.mock;
    +import static org.mockito.Mockito.verify;
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class TerraformEnvironmentStageTest {
    +    @After
    +    void resetPlugins() {
    +        TerraformEnvironmentStage.resetPlugins()
    +    }
    +
    +    public class AddedPlugins {
    +        @Test
    +        void willHaveApplyCalled() {
    +            TerraformEnvironmentStagePlugin fakePlugin = mock(TerraformEnvironmentStagePlugin.class)
    +            TerraformEnvironmentStage.addPlugin(fakePlugin)
    +
    +            TerraformEnvironmentStage stage = new TerraformEnvironmentStage('anyStage')
    +            stage.applyPlugins()
    +
    +            verify(fakePlugin).apply(stage)
    +        }
    +    }
    +
    +    public class WithEnv {
    +        @Test
    +        void addsAnInstanceOfEnvironmentVariablePlugin() {
    +            def stage = new TerraformEnvironmentStage('foo')
    +            stage.withEnv('localKey', 'localValue')
    +
    +            def plugins = stage.getAllPlugins()
    +
    +            assertThat(plugins, hasItem(isA(EnvironmentVariablePlugin.class)))
    +        }
    +
    +        @Test
    +        void preservesOrderOfOtherPlugins() {
    +            def stage = new TerraformEnvironmentStage('foo')
    +            def plugin1 = mock(TerraformEnvironmentStagePlugin.class)
    +            def plugin3 = mock(TerraformEnvironmentStagePlugin.class)
    +
    +            stage.addPlugin(plugin1)
    +            stage.withEnv('someKey', 'someValue')
    +            stage.addPlugin(plugin3)
    +
    +            def plugins = stage.getAllPlugins()
    +
    +            def plugin1Index = plugins.findIndexOf { it == plugin1 }
    +
    +            assertThat(plugins[plugin1Index], is(plugin1))
    +            assertThat(plugins[plugin1Index + 1], isA(EnvironmentVariablePlugin.class))
    +            assertThat(plugins[plugin1Index + 2], is(plugin3))
    +        }
    +
    +        @Test
    +        void doesNotAddPluginToOtherInstances() {
    +
    +        }
    +
    +        @Test
    +        void isFluent() {
    +            def stage = new TerraformEnvironmentStage('foo')
    +            def result = stage.withEnv('somekey', 'somevalue')
    +
    +            assertTrue(result == stage)
    +        }
    +    }
    +
    +    public class WithGlobalEnv {
    +        @Test
    +        void addsAnInstanceOfEnvironmeentVariablePlugin() {
    +            TerraformEnvironmentStage.withGlobalEnv('globalKey', 'globalValue')
    +
    +            def plugins = TerraformEnvironmentStage.getPlugins()
    +
    +            assertThat(plugins, hasItem(isA(EnvironmentVariablePlugin.class)))
    +        }
    +
    +        @Test
    +        void isFluent() {
    +            def result = TerraformEnvironmentStage.withGlobalEnv('somekey', 'somevalue')
    +
    +            assertTrue(result == TerraformEnvironmentStage.class)
    +        }
    +    }
    +}
    diff --git a/test/TerraformInitCommandTest.groovy b/test/TerraformInitCommandTest.groovy
    new file mode 100644
    index 00000000..0628f5c9
    --- /dev/null
    +++ b/test/TerraformInitCommandTest.groovy
    @@ -0,0 +1,125 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +
    +import static org.hamcrest.Matchers.*
    +import static org.mockito.Mockito.mock;
    +import static org.mockito.Mockito.verify;
    +import static org.mockito.Mockito.times;
    +
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class TerraformInitCommandTest {
    +    public class WithInput {
    +        @Test
    +        void defaultsToFalse() {
    +            def command = new TerraformInitCommand()
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" -input=false"))
    +        }
    +
    +        @Test
    +        void setsInputFlagToFalseWhenFalse() {
    +            def command = new TerraformInitCommand().withInput(false)
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" -input=false"))
    +        }
    +
    +        @Test
    +        void skipsInputFlagWhenTrue() {
    +            def command = new TerraformInitCommand().withInput(true)
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, not(containsString(" -input=false")))
    +        }
    +    }
    +
    +    public class WithBackendConfig {
    +        @Test
    +        void notPresentByDefault() {
    +            def command = new TerraformInitCommand()
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, not(containsString(" -backend-config=")))
    +        }
    +
    +        @Test
    +        void addsBackendConfigValues() {
    +            def command = new TerraformInitCommand().withBackendConfig("foobar")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" -backend-config=foobar"))
    +        }
    +
    +        @Test
    +        void addsBackendConfigIsCumulative() {
    +            def command = new TerraformInitCommand().withBackendConfig("foo")
    +                                                    .withBackendConfig("bar")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" -backend-config=foo"))
    +            assertThat(actualCommand, containsString(" -backend-config=bar"))
    +        }
    +    }
    +
    +    public class WithDirectory {
    +        @Test
    +        void addsDirectoryArgument() {
    +            def command = new TerraformInitCommand().withDirectory("foobar")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, endsWith(" foobar"))
    +        }
    +    }
    +
    +    public class Plugins {
    +        @After
    +        void resetPlugins() {
    +            TerraformInitCommand.resetPlugins()
    +        }
    +
    +        @Test
    +        void areAppliedToTheCommand() {
    +            TerraformInitCommandPlugin plugin = mock(TerraformInitCommandPlugin.class)
    +            TerraformInitCommand.addPlugin(plugin)
    +
    +            TerraformInitCommand command = TerraformInitCommand.instanceFor("env")
    +            command.toString()
    +
    +            verify(plugin).apply(command)
    +        }
    +
    +        @Test
    +        void areAppliedExactlyOnce() {
    +            TerraformInitCommandPlugin plugin = mock(TerraformInitCommandPlugin.class)
    +            TerraformInitCommand.addPlugin(plugin)
    +
    +            TerraformInitCommand command = TerraformInitCommand.instanceFor("env")
    +
    +            String firstCommand = command.toString()
    +            String secondCommand = command.toString()
    +
    +            verify(plugin, times(1)).apply(command)
    +        }
    +
    +        @Test
    +        void areAppliedEvenAfterCommandAlreadyInstantiated() {
    +            TerraformInitCommandPlugin firstPlugin = mock(TerraformInitCommandPlugin.class)
    +            TerraformInitCommandPlugin secondPlugin = mock(TerraformInitCommandPlugin.class)
    +
    +            TerraformInitCommand.addPlugin(firstPlugin)
    +            TerraformInitCommand command = TerraformInitCommand.instanceFor("env")
    +
    +            TerraformInitCommand.addPlugin(secondPlugin)
    +
    +            command.toString()
    +
    +            verify(secondPlugin, times(1)).apply(command)
    +        }
    +    }
    +}
    +
    diff --git a/test/TerraformPlanCommandTest.groovy b/test/TerraformPlanCommandTest.groovy
    new file mode 100644
    index 00000000..3ae6a88e
    --- /dev/null
    +++ b/test/TerraformPlanCommandTest.groovy
    @@ -0,0 +1,116 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +
    +import static org.hamcrest.Matchers.*
    +import static org.mockito.Mockito.mock;
    +import static org.mockito.Mockito.verify;
    +import static org.mockito.Mockito.times;
    +
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class TerraformPlanCommandTest {
    +    public class WithInput {
    +        @Test
    +        void defaultsToFalse() {
    +            def command = new TerraformPlanCommand()
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" -input=false"))
    +        }
    +
    +        @Test
    +        void setsInputFlagToFalseWhenFalse() {
    +            def command = new TerraformPlanCommand().withInput(false)
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, containsString(" -input=false"))
    +        }
    +
    +        @Test
    +        void skipsInputFlagWhenTrue() {
    +            def command = new TerraformPlanCommand().withInput(true)
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, not(containsString(" -input=false")))
    +        }
    +    }
    +
    +    public class WithDirectory {
    +        @Test
    +        void addsDirectoryArgument() {
    +            def command = new TerraformPlanCommand().withDirectory("foobar")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, endsWith(" foobar"))
    +        }
    +    }
    +
    +    public class WithPrefix {
    +        @Test
    +        void addsPrefixToBeginningOfCommand() {
    +            def command = new TerraformPlanCommand().withPrefix("somePrefix")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, startsWith("somePrefix"))
    +        }
    +
    +        @Test
    +        void isCumulative() {
    +            def command = new TerraformPlanCommand().withPrefix("fooPrefix")
    +                                                     .withPrefix("barPrefix")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, startsWith("fooPrefix barPrefix"))
    +        }
    +    }
    +
    +    public class Plugins {
    +        @After
    +        void resetPlugins() {
    +            TerraformPlanCommand.resetPlugins()
    +        }
    +
    +        @Test
    +        void areAppliedToTheCommand() {
    +            TerraformPlanCommandPlugin plugin = mock(TerraformPlanCommandPlugin.class)
    +            TerraformPlanCommand.addPlugin(plugin)
    +
    +            TerraformPlanCommand command = TerraformPlanCommand.instanceFor("env")
    +            command.toString()
    +
    +            verify(plugin).apply(command)
    +        }
    +
    +        @Test
    +        void areAppliedExactlyOnce() {
    +            TerraformPlanCommandPlugin plugin = mock(TerraformPlanCommandPlugin.class)
    +            TerraformPlanCommand.addPlugin(plugin)
    +
    +            TerraformPlanCommand command = TerraformPlanCommand.instanceFor("env")
    +
    +            String firstCommand = command.toString()
    +            String secondCommand = command.toString()
    +
    +            verify(plugin, times(1)).apply(command)
    +        }
    +
    +        @Test
    +        void areAppliedEvenAfterCommandAlreadyInstantiated() {
    +            TerraformPlanCommandPlugin firstPlugin = mock(TerraformPlanCommandPlugin.class)
    +            TerraformPlanCommandPlugin secondPlugin = mock(TerraformPlanCommandPlugin.class)
    +
    +            TerraformPlanCommand.addPlugin(firstPlugin)
    +            TerraformPlanCommand command = TerraformPlanCommand.instanceFor("env")
    +
    +            TerraformPlanCommand.addPlugin(secondPlugin)
    +
    +            command.toString()
    +
    +            verify(secondPlugin, times(1)).apply(command)
    +        }
    +    }
    +}
    +
    diff --git a/test/TerraformValidateCommandTest.groovy b/test/TerraformValidateCommandTest.groovy
    new file mode 100644
    index 00000000..c888a8a1
    --- /dev/null
    +++ b/test/TerraformValidateCommandTest.groovy
    @@ -0,0 +1,90 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +
    +import static org.hamcrest.Matchers.*
    +import static org.mockito.Mockito.mock;
    +import static org.mockito.Mockito.verify;
    +import static org.mockito.Mockito.times;
    +
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class TerraformValidateCommandTest {
    +    public class WithDirectory {
    +        @Test
    +        void addsDirectoryArgument() {
    +            def command = new TerraformValidateCommand().withDirectory("foobar")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, endsWith(" foobar"))
    +        }
    +    }
    +
    +    public class WithPrefix {
    +        @Test
    +        void addsPrefixToBeginningOfCommand() {
    +            def command = new TerraformValidateCommand().withPrefix("somePrefix")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, startsWith("somePrefix"))
    +        }
    +
    +        @Test
    +        void isCumulative() {
    +            def command = new TerraformValidateCommand().withPrefix("fooPrefix")
    +                                                     .withPrefix("barPrefix")
    +
    +            def actualCommand = command.toString()
    +            assertThat(actualCommand, startsWith("fooPrefix barPrefix"))
    +        }
    +    }
    +
    +    public class Plugins {
    +        @After
    +        void resetPlugins() {
    +            TerraformValidateCommand.resetPlugins()
    +        }
    +
    +        @Test
    +        void areAppliedToTheCommand() {
    +            TerraformValidateCommandPlugin plugin = mock(TerraformValidateCommandPlugin.class)
    +            TerraformValidateCommand.addPlugin(plugin)
    +
    +            TerraformValidateCommand command = TerraformValidateCommand.instance()
    +            command.toString()
    +
    +            verify(plugin).apply(command)
    +        }
    +
    +        @Test
    +        void areAppliedExactlyOnce() {
    +            TerraformValidateCommandPlugin plugin = mock(TerraformValidateCommandPlugin.class)
    +            TerraformValidateCommand.addPlugin(plugin)
    +
    +            TerraformValidateCommand command = TerraformValidateCommand.instance()
    +
    +            String firstCommand = command.toString()
    +            String secondCommand = command.toString()
    +
    +            verify(plugin, times(1)).apply(command)
    +        }
    +
    +        @Test
    +        void areAppliedEvenAfterCommandAlreadyInstantiated() {
    +            TerraformValidateCommandPlugin firstPlugin = mock(TerraformValidateCommandPlugin.class)
    +            TerraformValidateCommandPlugin secondPlugin = mock(TerraformValidateCommandPlugin.class)
    +
    +            TerraformValidateCommand.addPlugin(firstPlugin)
    +            TerraformValidateCommand command = TerraformValidateCommand.instance()
    +
    +            TerraformValidateCommand.addPlugin(secondPlugin)
    +
    +            command.toString()
    +
    +            verify(secondPlugin, times(1)).apply(command)
    +        }
    +    }
    +}
    +
    diff --git a/test/WithAwsPluginTest.groovy b/test/WithAwsPluginTest.groovy
    new file mode 100644
    index 00000000..46edbb44
    --- /dev/null
    +++ b/test/WithAwsPluginTest.groovy
    @@ -0,0 +1,143 @@
    +import static org.junit.Assert.*
    +
    +import org.junit.*
    +import org.junit.runner.RunWith
    +import de.bechte.junit.runners.context.HierarchicalContextRunner
    +import static org.mockito.Mockito.when;
    +import static org.mockito.Mockito.mock;
    +import static org.hamcrest.Matchers.*
    +
    +@RunWith(HierarchicalContextRunner.class)
    +class WithAwsPluginTest {
    +    @After
    +    void reset() {
    +        Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        when(Jenkinsfile.instance.getEnv()).thenReturn([:])
    +        WithAwsPlugin.reset()
    +    }
    +
    +    private configureJenkins(Map config = [:]) {
    +        Jenkinsfile.instance = mock(Jenkinsfile.class)
    +        when(Jenkinsfile.instance.getStandardizedRepoSlug()).thenReturn(config.repoSlug)
    +        when(Jenkinsfile.instance.getEnv()).thenReturn(config.env ?: [:])
    +    }
    +
    +    public class Init {
    +        @After
    +        void resetPlugins() {
    +            TerraformEnvironmentStage.resetPlugins()
    +        }
    +
    +        @Test
    +        void modifiesTerraformEnvironmentStage() {
    +            WithAwsPlugin.init()
    +
    +            Collection actualPlugins = TerraformEnvironmentStage.getPlugins()
    +            assertThat(actualPlugins, hasItem(instanceOf(WithAwsPlugin.class)))
    +        }
    +    }
    +
    +    public class WithRole {
    +        @Test
    +        void isFluentAndReturnsThePluginClass() {
    +            def result = WithAwsPlugin.withRole()
    +
    +            assertTrue(result == WithAwsPlugin.class)
    +        }
    +    }
    +
    +    public class WithImplicitRole {
    +        @Test
    +        void returnsGenericRoleIfPresent() {
    +            def expectedRole = "myRole"
    +            def plugin = new WithAwsPlugin()
    +            configureJenkins(env: [AWS_ROLE_ARN: expectedRole])
    +
    +            plugin.withRole()
    +
    +            def actualRole = plugin.getRole()
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +
    +        @Test
    +        void returnsEnvironmentSpecificRoleIfPresent() {
    +            def expectedRole = "myRole"
    +            def plugin = new WithAwsPlugin()
    +            configureJenkins(env: [QA_AWS_ROLE_ARN: expectedRole])
    +
    +            plugin.withRole()
    +
    +            def actualRole = plugin.getRole('qa')
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +
    +        @Test
    +        void returnsCaseInsensitiveEnvironmentSpecificRoleIfPresent() {
    +            def expectedRole = "myRole"
    +            def plugin = new WithAwsPlugin()
    +            configureJenkins(env: [qa_AWS_ROLE_ARN: expectedRole])
    +
    +            plugin.withRole()
    +
    +            def actualRole = plugin.getRole('qa')
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +
    +        @Test
    +        void prefersGenericRoleOverEnvironmentRole() {
    +            def expectedRole = "correctRole"
    +            def plugin = new WithAwsPlugin()
    +            configureJenkins(env: [
    +                AWS_ROLE_ARN: expectedRole,
    +                QA_AWS_ROLE_ARN: 'incorrectRole'
    +            ])
    +
    +            plugin.withRole()
    +
    +            def actualRole = plugin.getRole('qa')
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +    }
    +
    +    public class WithExplicitRole {
    +        @Test
    +        void returnsProvidedRole() {
    +            def expectedRole = "myRole"
    +            def plugin = new WithAwsPlugin()
    +
    +            plugin.withRole(expectedRole)
    +
    +            def actualRole = plugin.getRole()
    +
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +
    +        @Test
    +        void prefersProvidedRoleOverGenericRole() {
    +            def expectedRole = "correctRole"
    +            def plugin = new WithAwsPlugin()
    +            configureJenkins(env: [AWS_ROLE_ARN: 'incorrectRole'])
    +
    +            plugin.withRole(expectedRole)
    +
    +            def actualRole = plugin.getRole()
    +
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +
    +        @Test
    +        void prefersProvidedRoleOverEnvironmntSpecificRole() {
    +            def expectedRole = "correctRole"
    +            def plugin = new WithAwsPlugin()
    +            configureJenkins(env: [QA_AWS_ROLE_ARN: 'incorrectRole'])
    +
    +            plugin.withRole(expectedRole)
    +
    +            def actualRole = plugin.getRole('qa')
    +
    +            assertThat(actualRole, is(expectedRole))
    +        }
    +    }
    +}
    +
    +
    diff --git a/vars/Pipeline2Stage.groovy b/vars/Pipeline2Stage.groovy
    new file mode 100644
    index 00000000..d00f26af
    --- /dev/null
    +++ b/vars/Pipeline2Stage.groovy
    @@ -0,0 +1,23 @@
    +def call(args) {
    +    pipeline {
    +        agent none
    +
    +        stages {
    +            stage('1') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(0)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('2') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(1)).build()
    +                    }
    +                }
    +            }
    +        }
    +    }
    +}
    diff --git a/vars/Pipeline3Stage.groovy b/vars/Pipeline3Stage.groovy
    new file mode 100644
    index 00000000..de17af1c
    --- /dev/null
    +++ b/vars/Pipeline3Stage.groovy
    @@ -0,0 +1,32 @@
    +def call(args) {
    +    pipeline {
    +        agent none
    +
    +        stages {
    +            stage('1') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(0)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('2') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(1)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('3') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(2)).build()
    +                    }
    +                }
    +            }
    +        }
    +    }
    +}
    +
    diff --git a/vars/Pipeline4Stage.groovy b/vars/Pipeline4Stage.groovy
    new file mode 100644
    index 00000000..12e45ef3
    --- /dev/null
    +++ b/vars/Pipeline4Stage.groovy
    @@ -0,0 +1,39 @@
    +def call(args) {
    +    pipeline {
    +        agent none
    +
    +        stages {
    +            stage('1') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(0)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('2') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(1)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('3') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(2)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('4') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(3)).build()
    +                    }
    +                }
    +            }
    +        }
    +    }
    +}
    diff --git a/vars/Pipeline5Stage.groovy b/vars/Pipeline5Stage.groovy
    new file mode 100644
    index 00000000..165d5aa9
    --- /dev/null
    +++ b/vars/Pipeline5Stage.groovy
    @@ -0,0 +1,48 @@
    +def call(args) {
    +    pipeline {
    +        agent none
    +
    +        stages {
    +            stage('1') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(0)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('2') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(1)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('3') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(2)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('4') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(3)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('5') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(4)).build()
    +                    }
    +                }
    +            }
    +        }
    +    }
    +}
    +
    diff --git a/vars/Pipeline6Stage.groovy b/vars/Pipeline6Stage.groovy
    new file mode 100644
    index 00000000..977a28fd
    --- /dev/null
    +++ b/vars/Pipeline6Stage.groovy
    @@ -0,0 +1,56 @@
    +def call(args) {
    +    pipeline {
    +        agent none
    +
    +        stages {
    +            stage('1') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(0)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('2') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(1)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('3') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(2)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('4') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(3)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('5') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(4)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('6') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(5)).build()
    +                    }
    +                }
    +            }
    +        }
    +    }
    +}
    +
    diff --git a/vars/Pipeline7Stage.groovy b/vars/Pipeline7Stage.groovy
    new file mode 100644
    index 00000000..b0011c9e
    --- /dev/null
    +++ b/vars/Pipeline7Stage.groovy
    @@ -0,0 +1,64 @@
    +def call(args) {
    +    pipeline {
    +        agent none
    +
    +        stages {
    +            stage('1') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(0)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('2') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(1)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('3') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(2)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('4') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(3)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('5') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(4)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('6') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(5)).build()
    +                    }
    +                }
    +            }
    +
    +            stage('7') {
    +                steps {
    +                    script {
    +                        ((Stage)args.getAt(6)).build()
    +                    }
    +                }
    +            }
    +        }
    +    }
    +}
    +