diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..e5c0393
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,36 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: "[Bug] Lorem Ipsum"
+labels: bug
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Please point us to a minimalistic repro project hosted in a GitHub repo.
+For a repo project, create a new project using the template of your your choice, apply the minimum required code to result in the issue you're observing.
+
+We will close this issue if:
+- the repro project you share with us is complex
+- if we will not be able to reproduce the behavior you're reporting
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+### Exceptions (if any)
+Include the exception you get when facing this issue
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+### Further technical details
+- Scientist.net version
+- Include the output of `dotnet --info`
+- The IDE (VS / VS Code/ VS4Mac) you're running on, and its version
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..c250b1d
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: "[Feature] Lorem Ipsum"
+labels: feature
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
new file mode 100644
index 0000000..80aef02
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md
@@ -0,0 +1,31 @@
+
+
+## Description
+
+
+## Related Issue
+
+
+
+
+
+## Motivation and Context
+
+
+## Types of changes
+
+- [ ] Bug fix (non-breaking change which fixes an issue)
+- [ ] New feature (non-breaking change which adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to change)
+- [ ] Documentation
+
+## Checklist:
+
+
+- [ ] I have read the **[CONTRIBUTING](../../Contributing.md)** document.
+- [ ] I have checked to ensure there aren't other open **[PULL REQUESTS](../../../pulls)** for the same update/change.
+- [ ] My code follows the code style of this project.
+- [ ] I have updated the documentation accordingly where applicable.
+- [ ] I have added tests to cover my changes.
+- [ ] All new and existing tests passed.
+- [ ] Coverage is 100% for new code.
\ No newline at end of file
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..03d6816
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,10 @@
+version: 2
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "weekly"
+ - package-ecosystem: "nuget"
+ directory: "/"
+ schedule:
+ interval: "weekly"
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000..e4650fd
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,47 @@
+name: "CodeQL"
+
+on:
+ push:
+ branches: [3.0.0]
+ pull_request:
+ branches: [3.0.0]
+ schedule:
+ - cron: "0 0 * * 1"
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-latest
+ permissions:
+ actions: read
+ contents: read
+ security-events: write
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: ["csharp"]
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v3
+ with:
+ languages: ${{ matrix.language }}
+
+ - uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: 8.x
+ cache: true
+ cache-dependency-path: "**/packages.lock.json"
+
+ - run: dotnet restore --locked-mode
+
+ - run: |
+ dotnet build /p:UseSharedCompilation=false
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v3
+ with:
+ category: "/language:${{matrix.language}}"
diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml
new file mode 100644
index 0000000..757c10a
--- /dev/null
+++ b/.github/workflows/unit-test.yml
@@ -0,0 +1,31 @@
+name: Unit test
+
+on:
+ workflow_dispatch:
+ push:
+ branches: [3.0.0]
+ pull_request:
+ branches: [3.0.0]
+
+jobs:
+ test:
+ name: Test
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: actions/setup-dotnet@v3
+ with:
+ dotnet-version: 8.x
+ cache: true
+ cache-dependency-path: "**/packages.lock.json"
+
+ - name: Restore dependencies
+ run: dotnet restore --locked-mode
+
+ - name: Build
+ run: dotnet build --no-restore
+
+ - name: Test
+ run: dotnet test --no-build --verbosity normal /p:CollectCoverage=true /p:CoverletOutputFormat=opencover
diff --git a/.gitignore b/.gitignore
index 2a2ef7b..21957d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -126,3 +126,6 @@ artifacts/
*.scc
BenchmarkDotNet.Artifacts
+
+**/.vs
+/Scientist.Test/coverage.json
diff --git a/CodeOfConduct.md b/CodeOfConduct.md
new file mode 100644
index 0000000..16c7c4c
--- /dev/null
+++ b/CodeOfConduct.md
@@ -0,0 +1,120 @@
+
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+We as members, contributors, and leaders pledge to make participation in our
+community a harassment-free experience for everyone, regardless of age, body
+size, visible or invisible disability, ethnicity, sex characteristics, gender
+identity and expression, level of experience, education, socio-economic status,
+nationality, personal appearance, race, caste, color, religion, or sexual identity
+and orientation.
+
+We pledge to act and interact in ways that contribute to an open, welcoming,
+diverse, inclusive, and healthy community.
+
+## Our Standards
+
+Examples of behavior that contributes to a positive environment for our
+community include:
+
+* Demonstrating empathy and kindness toward other people
+* Being respectful of differing opinions, viewpoints, and experiences
+* Giving and gracefully accepting constructive feedback
+* Accepting responsibility and apologizing to those affected by our mistakes,
+ and learning from the experience
+* Focusing on what is best not just for us as individuals, but for the
+ overall community
+
+Examples of unacceptable behavior include:
+
+* The use of sexualized language or imagery, and sexual attention or
+ advances of any kind
+* Trolling, insulting or derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or email
+ address, without their explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Enforcement Responsibilities
+
+Community leaders are responsible for clarifying and enforcing our standards of
+acceptable behavior and will take appropriate and fair corrective action in
+response to any behavior that they deem inappropriate, threatening, offensive,
+or harmful.
+
+Community leaders have the right and responsibility to remove, edit, or reject
+comments, commits, code, wiki edits, issues, and other contributions that are
+not aligned to this Code of Conduct, and will communicate reasons for moderation
+decisions when appropriate.
+
+## Scope
+
+This Code of Conduct applies within all community spaces, and also applies when
+an individual is officially representing the community in public spaces.
+Examples of representing our community include using an official e-mail address,
+posting via an official social media account, or acting as an appointed
+representative at an online or offline event.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported to the community leaders responsible for enforcement on [Gitter](https://gitter.im/scientistproject/community).
+
+All complaints will be reviewed and investigated promptly and fairly.
+
+All community leaders are obligated to respect the privacy and security of the
+reporter of any incident.
+
+## Enforcement Guidelines
+
+Community leaders will follow these Community Impact Guidelines in determining
+the consequences for any action they deem in violation of this Code of Conduct:
+
+### 1. Correction
+
+**Community Impact**: Use of inappropriate language or other behavior deemed
+unprofessional or unwelcome in the community.
+
+**Consequence**: A private, written warning from community leaders, providing
+clarity around the nature of the violation and an explanation of why the
+behavior was inappropriate. A public apology may be requested.
+
+### 2. Warning
+
+**Community Impact**: A violation through a single incident or series
+of actions.
+
+**Consequence**: A warning with consequences for continued behavior. No
+interaction with the people involved, including unsolicited interaction with
+those enforcing the Code of Conduct, for a specified period of time. This
+includes avoiding interactions in community spaces as well as external channels
+like social media. Violating these terms may lead to a temporary or
+permanent ban.
+
+### 3. Temporary Ban
+
+**Community Impact**: A serious violation of community standards, including
+sustained inappropriate behavior.
+
+**Consequence**: A temporary ban from any sort of interaction or public
+communication with the community for a specified period of time. No public or
+private interaction with the people involved, including unsolicited interaction
+with those enforcing the Code of Conduct, is allowed during this period.
+Violating these terms may lead to a permanent ban.
+
+### 4. Permanent Ban
+
+**Community Impact**: Demonstrating a pattern of violation of community
+standards, including sustained inappropriate behavior, harassment of an
+individual, or aggression toward or disparagement of classes of individuals.
+
+**Consequence**: A permanent ban from any sort of public interaction within
+the community.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage],
+version 2.0, available at
+[https://www.contributor-covenant.org/version/2/0/code_of_conduct.html][v2.0].
diff --git a/Contributing.md b/Contributing.md
new file mode 100644
index 0000000..f601e36
--- /dev/null
+++ b/Contributing.md
@@ -0,0 +1,87 @@
+# Contributing to Scientist.NET
+
+## Table of Contents:
+- [Code of Conduct](#code-of-conduct)
+- [I just have a question](#i-just-have-a-question)
+- [How can i contribute?](#how-can-i-contribute)
+ - [Reporting bugs](#reporting-bugs)
+ - [Suggesting enhancements](#suggesting-enhancements)
+ - [Your first code contribution](#your-first-code-contribution)
+ - [Pull Requests](#pull-requests)
+- [Styleguides](#styleguides)
+ - [Git Commit Messages](#git-commit-messages)
+- [Labels](#labels)
+ - [Issue labels](#issue-labels)
+ - [Topic category labels](#topic-category-labels)
+ - [Pull request labels](#pull-request-labels)
+
+## Code of conduct
+
+This project and everyone participating in it is governed by the [Code of Conduct](CodeOfConduct.md). By participating, you are expected to uphold this code.
+
+Please report unacceptable behavior on [Gitter](https://gitter.im/scientistproject/community) to a maintainer.
+
+## I just have a question
+
+> Please don't file an issue to ask a question.
+
+> TODO
+
+
+## How can i contribute?
+
+### Reporting bugs
+
+> TODO
+
+
+### Suggesting enhancements
+
+> TODO
+
+### Your first code contribution
+- [good first issue](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:good+first+issue)
+
+### Pull Requests
+
+Please follow these steps to have your contribution considered by the maintainers:
+
+- Follow all instructions in [the template](.github/PULL_REQUEST_TEMPLATE/pull_request_template.md)
+- Follow the [styleguides](#styleguides)
+- After you submit your pull request, verify that all [status checks](https://help.github.com/articles/about-status-checks/) are passingWhat if the status checks are failing?
If a status check is failing, and you believe that the failure is unrelated to your change, please leave a comment on the pull request explaining why you believe the failure is unrelated. A maintainer will re-run the status check for you. If we conclude that the failure was a false positive, then we will open an issue to track that problem with our status check suite.
+
+While the prerequisites above must be satisfied prior to having your pull request reviewed, the reviewer(s) may ask you to complete additional design work, tests, or other changes before your pull request can be ultimately accepted.
+
+## Styleguides
+### Git commit messages
+Please refer to [Conventional commits](https://www.conventionalcommits.org/en/v1.0.0/)
+
+| Type | Usage | Version increment |
+| --- | --- | --- |
+| fix(): | A commit which fixes or patches a bug | x.x.1|
+| feat(): | A commit which introduces a new feature | x.1.x|
+| BREAKING CHANGE: | A commit which has BREAKING CHANGE: in the footer | 1.x.x |
+
+## Labels
+
+### Issue labels
+| Label name | Search | Description |
+| --- | --- | --- |
+| `good first issue` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:good+first+issue) | Less complex issues which would be good first issues to work on for users who want to contribute. |
+| `help wanted` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:help+wanted) | The would appreciate help from the community in resolving these issues. |
+
+### Topic category labels
+| Label name | Search | Description |
+| --- | --- | --- |
+| `documentation` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:) | Related to any type of documentation. |
+| `performance` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:performance) | Related to performance. |
+| `security` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:security) | Related to security. |
+
+### Pull request labels
+| Label name | Search | Description |
+| --- | --- | --- |
+| `work-in-progress` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:work-in-progress) | Pull requests which are still being worked on, more changes will follow. |
+| `needs-review` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:needs-review) | Pull requests which need code review, and approval from maintainers. |
+| `under-review` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:under-review) | Pull requests being reviewed by maintainers. |
+| `requires-changes` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:requires-changes) | Pull requests which need to be updated based on review comments and then reviewed again. |
+| `needs-testing` | [search](https://github.com/scientistproject/Scientist.net/issues?q=is:issue+is:open+label:needs-testing) | Pull requests which need manual testing. |
diff --git a/README.md b/README.md
index 8a8aa43..bc38372 100644
--- a/README.md
+++ b/README.md
@@ -2,7 +2,7 @@
A .NET Port of the [Scientist](https://github.com/github/scientist) library for carefully refactoring critical paths.
-[](https://ci.appveyor.com/project/shiftkey/scientist-net/branch/master)
+[](https://ci.appveyor.com/project/shiftkey/scientist-net/branch/3.0.0)
[](https://gitter.im/scientistproject/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
To give it a twirl, use NuGet to install: `Install-Package Scientist`
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..c22fe3e
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,17 @@
+# Security Policy
+
+## Supported Versions
+
+| Version | Supported |
+| ------- | ------------------ |
+| 2.0.0 | :white_check_mark: |
+| < 2.0 | :x: |
+
+## Reporting a Vulnerability
+
+Security issues and bugs should be reported privately.
+
+> The best approach at the moment is to message one of the contributors on https://gitter.im/scientistproject/community privately
+> If you dont receive a reply within a couple of days please send the message onto another member
+
+Please do not open issues for anything you think might have a security implication.
diff --git a/Scientist.Test/Scientist.Test.csproj b/Scientist.Test/Scientist.Test.csproj
new file mode 100644
index 0000000..ad74f98
--- /dev/null
+++ b/Scientist.Test/Scientist.Test.csproj
@@ -0,0 +1,36 @@
+
+
+
+ net8.0
+
+ false
+
+ cb167bc0-e4e4-4cb9-97fd-7f8528c2683b
+
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
+
+
+
+
+
+ true
+
+
\ No newline at end of file
diff --git a/Scientist.Test/Scientist.cs b/Scientist.Test/Scientist.cs
new file mode 100644
index 0000000..00bf97f
--- /dev/null
+++ b/Scientist.Test/Scientist.cs
@@ -0,0 +1,14 @@
+using System;
+using Xunit;
+
+namespace Scientist.Test
+{
+ public class ScientistTest
+ {
+ [Fact]
+ public void Test_Method()
+ {
+
+ }
+ }
+}
diff --git a/Scientist.Test/packages.lock.json b/Scientist.Test/packages.lock.json
new file mode 100644
index 0000000..96be846
--- /dev/null
+++ b/Scientist.Test/packages.lock.json
@@ -0,0 +1,1188 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "coverlet.collector": {
+ "type": "Direct",
+ "requested": "[3.1.0, )",
+ "resolved": "3.1.0",
+ "contentHash": "YzYqSRrjoP5lULBhTDcTOjuM4IDPPi6PhFsl4w8EI4WdZhE6llt7E38Tg4CHyrS+QKwyu1+9OwkdDgluOdoBTw=="
+ },
+ "coverlet.msbuild": {
+ "type": "Direct",
+ "requested": "[3.1.0, )",
+ "resolved": "3.1.0",
+ "contentHash": "xOv5HZagq0I6uF4vt8NVVpwcA2W/uGmNcbLStao2eMk98RQH5NFPQuouh2nWWPSZrNIhGG/iYbBn2pO4s5i+ig=="
+ },
+ "Microsoft.Extensions.Configuration.UserSecrets": {
+ "type": "Direct",
+ "requested": "[5.0.0, )",
+ "resolved": "5.0.0",
+ "contentHash": "+tK3seG68106lN277YWQvqmfyI/89w0uTu/5Gz5VYSUu5TI4mqwsaWLlSmT9Bl1yW/i1Nr06gHJxqaqB5NU9Tw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Configuration.Json": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Physical": "5.0.0"
+ }
+ },
+ "Microsoft.NET.Test.Sdk": {
+ "type": "Direct",
+ "requested": "[16.10.0, )",
+ "resolved": "16.10.0",
+ "contentHash": "/9x6TV1SUi+rtKi8UYa7ml7SEWhb0A5FuyeF0nwwUKVjdk5WaWuLPjntHVWoDuYP25KBruoxWxs7WdhDMjWxXw==",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "16.10.0",
+ "Microsoft.TestPlatform.TestHost": "16.10.0"
+ }
+ },
+ "xunit": {
+ "type": "Direct",
+ "requested": "[2.4.1, )",
+ "resolved": "2.4.1",
+ "contentHash": "XNR3Yz9QTtec16O0aKcO6+baVNpXmOnPUxDkCY97J+8krUYxPvXT1szYYEUdKk4sB8GOI2YbAjRIOm8ZnXRfzQ==",
+ "dependencies": {
+ "xunit.analyzers": "0.10.0",
+ "xunit.assert": "[2.4.1]",
+ "xunit.core": "[2.4.1]"
+ }
+ },
+ "xunit.runner.visualstudio": {
+ "type": "Direct",
+ "requested": "[2.4.3, )",
+ "resolved": "2.4.3",
+ "contentHash": "kZZSmOmKA8OBlAJaquPXnJJLM9RwQ27H7BMVqfMLUcTi9xHinWGJiWksa3D4NEtz0wZ/nxd2mogObvBgJKCRhQ=="
+ },
+ "Microsoft.CodeCoverage": {
+ "type": "Transitive",
+ "resolved": "16.10.0",
+ "contentHash": "7g0UjAwhEi2OBBv8SDV3wZ6J103cQyZbKVgDy59fnNdlbv0XpUCfdBZiSW5yVK/d2jp6faCdGh7VnI/F2JZO+Q=="
+ },
+ "Microsoft.CSharp": {
+ "type": "Transitive",
+ "resolved": "4.0.1",
+ "contentHash": "17h8b5mXa87XYKrrVqdgZ38JefSUqLChUQpXgSnpzsM0nDOhE40FTeNWOJ/YmySGV6tG6T8+hjz6vxbknHJr6A==",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Dynamic.Runtime": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.InteropServices": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "LN322qEKHjuVEhhXueTUe7RNePooZmS8aGid5aK2woX3NPjSnONFyKUc6+JknOS6ce6h2tCLfKPTBXE3mN/6Ag==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "ETjSBHMp3OAZ4HxGQYpwyGsD8Sw5FegQXphi0rpoGMT74S4+I2mm7XJEswwn59XAaKOzC15oDSOWEE8SzDCd6Q==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.FileExtensions": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "rRdspYKA18ViPOISwAihhCMbusHsARCOtDMwa23f+BGEdIjpKPlhs3LLjmKlxfhpGXBjIsS0JpXcChjRUN+PAw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Physical": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Json": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "Pak8ymSUfdzPfBTLHxeOwcR32YDbuVfhnH2hkfOLnJNQd19ItlBdpMjIDY9C5O/nS2Sn9bzDMai0ZrvF7KyY/Q==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "5.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "5.0.0",
+ "Microsoft.Extensions.Configuration.FileExtensions": "5.0.0",
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "iuZIiZ3mteEb+nsUqpGXKx2cGF+cv6gWPd5jqQI4hzqdiJ6I94ddLjKhQOuRW1lueHwocIw30xbSHGhQj0zjdQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Physical": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "1rkd8UO2qf21biwO7X0hL9uHP7vtfmdv/NLvKgCRHkdz1XnW8zVQJXyEYiN68WYpExgtVWn55QF0qBzgfh1mGg==",
+ "dependencies": {
+ "Microsoft.Extensions.FileProviders.Abstractions": "5.0.0",
+ "Microsoft.Extensions.FileSystemGlobbing": "5.0.0",
+ "Microsoft.Extensions.Primitives": "5.0.0"
+ }
+ },
+ "Microsoft.Extensions.FileSystemGlobbing": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "ArliS8lGk8sWRtrWpqI8yUVYJpRruPjCDT+EIjrgkA/AAPRctlAkRISVZ334chAKktTLzD1+PK8F5IZpGedSqA=="
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "cI/VWn9G1fghXrNDagX9nYaaB/nokkZn0HYAawGaELQrl8InSezfe9OnfPZLcJq3esXxygh3hkq2c3qoV3SDyQ=="
+ },
+ "Microsoft.NETCore.Platforms": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A=="
+ },
+ "Microsoft.NETCore.Targets": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg=="
+ },
+ "Microsoft.TestPlatform.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "16.10.0",
+ "contentHash": "DYp9eKg3zffZuePhgdUrh5tHkt1YOaSraVH87r4WXDOjag1/n08aFl1vRhWP8y2RoBLTHdcZRTDOhQyYMxAYNg==",
+ "dependencies": {
+ "NuGet.Frameworks": "5.0.0",
+ "System.Reflection.Metadata": "1.6.0"
+ }
+ },
+ "Microsoft.TestPlatform.TestHost": {
+ "type": "Transitive",
+ "resolved": "16.10.0",
+ "contentHash": "KAlB2QQRwznIH02WNl9eAuUP6/tn4IbAw4EXrvV1POTUjxuv4Dqg0u3Nn5lC9T3WIHupCHfsTcJMgsJYdi31Ig==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "16.10.0",
+ "Newtonsoft.Json": "9.0.1"
+ }
+ },
+ "Microsoft.Win32.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "9ZQKCWxH7Ijp9BfahvL2Zyf1cJIk8XYLF6Yjzr2yi0b2cOut/HQ31qf1ThHAgCc3WiZMdnWcfJCgN82/0UunxA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "NETStandard.Library": {
+ "type": "Transitive",
+ "resolved": "1.6.1",
+ "contentHash": "WcSp3+vP+yHNgS8EV5J7pZ9IRpeDuARBPN28by8zqff1wJQXm26PVU8L3/fYLBJVU7BtDyqNVWq2KlCVvSSR4A==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.Win32.Primitives": "4.3.0",
+ "System.AppContext": "4.3.0",
+ "System.Collections": "4.3.0",
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Console": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tools": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Globalization.Calendars": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.Compression": "4.3.0",
+ "System.IO.Compression.ZipFile": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.Linq.Expressions": "4.3.0",
+ "System.Net.Http": "4.3.0",
+ "System.Net.Primitives": "4.3.0",
+ "System.Net.Sockets": "4.3.0",
+ "System.ObjectModel": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Extensions": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.InteropServices.RuntimeInformation": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Security.Cryptography.X509Certificates": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Text.Encoding.Extensions": "4.3.0",
+ "System.Text.RegularExpressions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "System.Threading.Timer": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0",
+ "System.Xml.XDocument": "4.3.0"
+ }
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "9.0.1",
+ "contentHash": "U82mHQSKaIk+lpSVCbWYKNavmNH1i5xrExDEquU1i6I5pV6UMOqRnJRSlKO3cMPfcpp0RgDY+8jUXHdQ4IfXvw==",
+ "dependencies": {
+ "Microsoft.CSharp": "4.0.1",
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Dynamic.Runtime": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.IO": "4.1.0",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Extensions": "4.0.1",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Runtime.Serialization.Primitives": "4.1.1",
+ "System.Text.Encoding": "4.0.11",
+ "System.Text.Encoding.Extensions": "4.0.11",
+ "System.Text.RegularExpressions": "4.1.0",
+ "System.Threading": "4.0.11",
+ "System.Threading.Tasks": "4.0.11",
+ "System.Xml.ReaderWriter": "4.0.11",
+ "System.Xml.XDocument": "4.0.11"
+ }
+ },
+ "NuGet.Frameworks": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "c5JVjuVAm4f7E9Vj+v09Z9s2ZsqFDjBpcsyS3M9xRo0bEdm/LVZSzLxxNvfvAwRiiE8nwe1h2G4OwiwlzFKXlA=="
+ },
+ "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q=="
+ },
+ "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA=="
+ },
+ "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw=="
+ },
+ "runtime.native.System": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "runtime.native.System.IO.Compression": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "runtime.native.System.Net.Http": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "runtime.native.System.Security.Cryptography.Apple": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==",
+ "dependencies": {
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0"
+ }
+ },
+ "runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==",
+ "dependencies": {
+ "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0",
+ "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "b3pthNgxxFcD+Pc0WSEoC0+md3MyhRS6aCEeenvNE3Fdw1HyJ18ZhRFVJJzIeR/O/jpxPboB805Ho0T3Ul7w8A=="
+ },
+ "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ=="
+ },
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ=="
+ },
+ "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "X7IdhILzr4ROXd8mI1BUCQMSHSQwelUlBjF1JyTKCjXaOGn2fB4EKBxQbCK2VjO3WaWIdlXZL3W6TiIVnrhX4g=="
+ },
+ "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "nyFNiCk/r+VOiIqreLix8yN+q3Wga9+SE8BCgkf+2BwEKiNx6DyvFjCgkfV743/grxv8jHJ8gUK4XEQw7yzRYg=="
+ },
+ "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ytoewC6wGorL7KoCAvRfsgoJPJbNq+64k2SqW6JcOAebWsFUvCCYgfzQMrnpvPiEl4OrblUlhF2ji+Q1+SVLrQ=="
+ },
+ "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "I8bKw2I8k58Wx7fMKQJn2R8lamboCAiHfHeV/pS65ScKWMMI0+wJkLYlEKvgW1D/XvSl/221clBoR2q9QNNM7A=="
+ },
+ "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VB5cn/7OzUfzdnC8tqAIMQciVLiq2epm2NrAm1E9OjNRyG4lVhfR61SMcLizejzQP8R8Uf/0l5qOIbUEi+RdEg=="
+ },
+ "System.AppContext": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Buffers": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==",
+ "dependencies": {
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Collections": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Collections.Concurrent": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Console": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Debug": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.DiagnosticSource": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "tD6kosZnTAGdrEa0tZSuFyunMbt/5KYDnHdndJYGqZoNy00XVXyACd5d6KnE1YgYv3ne2CjtAfNXo/fwEhnKUA==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Tools": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Diagnostics.Tracing": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Dynamic.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.0.11",
+ "contentHash": "db34f6LHYM0U0JpE+sOmjar27BnqTVkbLJhgfwMpTdgTigG/Hna3m2MYVwnFzGGKnEJk2UXFuoVTr8WUbU91/A==",
+ "dependencies": {
+ "System.Collections": "4.0.11",
+ "System.Diagnostics.Debug": "4.0.11",
+ "System.Globalization": "4.0.11",
+ "System.Linq": "4.1.0",
+ "System.Linq.Expressions": "4.1.0",
+ "System.ObjectModel": "4.0.12",
+ "System.Reflection": "4.1.0",
+ "System.Reflection.Emit": "4.0.1",
+ "System.Reflection.Emit.ILGeneration": "4.0.1",
+ "System.Reflection.Primitives": "4.0.1",
+ "System.Reflection.TypeExtensions": "4.1.0",
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0",
+ "System.Runtime.Extensions": "4.1.0",
+ "System.Threading": "4.0.11"
+ }
+ },
+ "System.Globalization": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Globalization.Calendars": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Globalization.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "FhKmdR6MPG+pxow6wGtNAWdZh7noIOpdD5TwQ3CprzgIE1bBBoim0vbR1+AWsWjQmU7zXHgQo4TWSP6lCeiWcQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0"
+ }
+ },
+ "System.IO": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.IO.Compression": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Buffers": "4.3.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "runtime.native.System": "4.3.0",
+ "runtime.native.System.IO.Compression": "4.3.0"
+ }
+ },
+ "System.IO.Compression.ZipFile": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "G4HwjEsgIwy3JFBduZ9quBkAu+eUwjIdJleuNSgmUojbH6O3mlvEIme+GHx/cLlTAPcrnnL7GqvB9pTlWRfhOg==",
+ "dependencies": {
+ "System.Buffers": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.Compression": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.IO.FileSystem": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.IO.FileSystem.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Linq": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0"
+ }
+ },
+ "System.Linq.Expressions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.ObjectModel": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Emit": "4.3.0",
+ "System.Reflection.Emit.ILGeneration": "4.3.0",
+ "System.Reflection.Emit.Lightweight": "4.3.0",
+ "System.Reflection.Extensions": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Reflection.TypeExtensions": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Net.Http": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "sYg+FtILtRQuYWSIAuNOELwVuVsxVyJGWQyOnlAzhV4xvhyFnON1bAzYYC+jjRW8JREM45R0R5Dgi8MTC5sEwA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.DiagnosticSource": "4.3.0",
+ "System.Diagnostics.Tracing": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Globalization.Extensions": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.Net.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.OpenSsl": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Security.Cryptography.X509Certificates": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "runtime.native.System": "4.3.0",
+ "runtime.native.System.Net.Http": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Net.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "qOu+hDwFwoZPbzPvwut2qATe3ygjeQBDQj91xlsaqGFQUI5i4ZnZb8yyQuLGpDGivEPIt8EJkd1BVzVoP31FXA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Handles": "4.3.0"
+ }
+ },
+ "System.Net.Sockets": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "m6icV6TqQOAdgt5N/9I5KNpjom/5NFtkmGseEH+AK/hny8XrytLH3+b5M8zL/Ycg3fhIocFpUMyl/wpFnVRvdw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Net.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Reflection": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Emit": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==",
+ "dependencies": {
+ "System.IO": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Emit.ILGeneration": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Emit.ILGeneration": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Emit.Lightweight": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Emit.ILGeneration": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "1.6.0",
+ "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ=="
+ },
+ "System.Reflection.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Reflection.TypeExtensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Resources.ResourceManager": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Globalization": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0"
+ }
+ },
+ "System.Runtime.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime.Handles": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Runtime.InteropServices": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Primitives": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Handles": "4.3.0"
+ }
+ },
+ "System.Runtime.InteropServices.RuntimeInformation": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "cbz4YJMqRDR7oLeMRbdYv7mYzc++17lNhScCX0goO2XpGWdvAt60CGN+FHdePUEHCe/Jy9jUlvNAiNdM+7jsOw==",
+ "dependencies": {
+ "System.Reflection": "4.3.0",
+ "System.Reflection.Extensions": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Threading": "4.3.0",
+ "runtime.native.System": "4.3.0"
+ }
+ },
+ "System.Runtime.Numerics": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==",
+ "dependencies": {
+ "System.Globalization": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0"
+ }
+ },
+ "System.Runtime.Serialization.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.1.1",
+ "contentHash": "HZ6Du5QrTG8MNJbf4e4qMO3JRAkIboGT5Fk804uZtg3Gq516S7hAqTm2UZKUHa7/6HUGdVy3AqMQKbns06G/cg==",
+ "dependencies": {
+ "System.Resources.ResourceManager": "4.0.1",
+ "System.Runtime": "4.1.0"
+ }
+ },
+ "System.Security.Cryptography.Algorithms": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "runtime.native.System.Security.Cryptography.Apple": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Cng": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Csp": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.IO": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Encoding": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Collections.Concurrent": "4.3.0",
+ "System.Linq": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.OpenSsl": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "h4CEgOgv5PKVF/HwaHzJRiVboL2THYCou97zpmhjghx5frc7fIvlkY1jL+lnIQyChrJDMNEXS6r7byGif8Cy4w==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.Primitives": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==",
+ "dependencies": {
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Security.Cryptography.X509Certificates": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.Globalization.Calendars": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.Handles": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Runtime.Numerics": "4.3.0",
+ "System.Security.Cryptography.Algorithms": "4.3.0",
+ "System.Security.Cryptography.Cng": "4.3.0",
+ "System.Security.Cryptography.Csp": "4.3.0",
+ "System.Security.Cryptography.Encoding": "4.3.0",
+ "System.Security.Cryptography.OpenSsl": "4.3.0",
+ "System.Security.Cryptography.Primitives": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "runtime.native.System": "4.3.0",
+ "runtime.native.System.Net.Http": "4.3.0",
+ "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0"
+ }
+ },
+ "System.Text.Encoding": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Text.Encoding.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0",
+ "System.Text.Encoding": "4.3.0"
+ }
+ },
+ "System.Text.RegularExpressions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==",
+ "dependencies": {
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Threading": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==",
+ "dependencies": {
+ "System.Runtime": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Threading.Tasks": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Threading.Tasks.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Threading.Tasks": "4.3.0"
+ }
+ },
+ "System.Threading.Timer": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "Z6YfyYTCg7lOZjJzBjONJTFKGN9/NIYKSxhU5GRd+DTwHSZyvWp1xuI5aR+dLg+ayyC5Xv57KiY4oJ0tMO89fQ==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "1.1.0",
+ "Microsoft.NETCore.Targets": "1.1.0",
+ "System.Runtime": "4.3.0"
+ }
+ },
+ "System.Xml.ReaderWriter": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.IO.FileSystem": "4.3.0",
+ "System.IO.FileSystem.Primitives": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Runtime.InteropServices": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Text.Encoding.Extensions": "4.3.0",
+ "System.Text.RegularExpressions": "4.3.0",
+ "System.Threading.Tasks": "4.3.0",
+ "System.Threading.Tasks.Extensions": "4.3.0"
+ }
+ },
+ "System.Xml.XDocument": {
+ "type": "Transitive",
+ "resolved": "4.3.0",
+ "contentHash": "5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==",
+ "dependencies": {
+ "System.Collections": "4.3.0",
+ "System.Diagnostics.Debug": "4.3.0",
+ "System.Diagnostics.Tools": "4.3.0",
+ "System.Globalization": "4.3.0",
+ "System.IO": "4.3.0",
+ "System.Reflection": "4.3.0",
+ "System.Resources.ResourceManager": "4.3.0",
+ "System.Runtime": "4.3.0",
+ "System.Runtime.Extensions": "4.3.0",
+ "System.Text.Encoding": "4.3.0",
+ "System.Threading": "4.3.0",
+ "System.Xml.ReaderWriter": "4.3.0"
+ }
+ },
+ "xunit.abstractions": {
+ "type": "Transitive",
+ "resolved": "2.0.3",
+ "contentHash": "pot1I4YOxlWjIb5jmwvvQNbTrZ3lJQ+jUGkGjWE3hEFM0l5gOnBWS+H3qsex68s5cO52g+44vpGzhAt+42vwKg=="
+ },
+ "xunit.analyzers": {
+ "type": "Transitive",
+ "resolved": "0.10.0",
+ "contentHash": "4/IDFCJfIeg6bix9apmUtIMwvOsiwqdEexeO/R2D4GReIGPLIRODTpId/l4LRSrAJk9lEO3Zx1H0Zx6uohJDNg=="
+ },
+ "xunit.assert": {
+ "type": "Transitive",
+ "resolved": "2.4.1",
+ "contentHash": "O/Oe0BS5RmSsM+LQOb041TzuPo5MdH2Rov+qXGS37X+KFG1Hxz7kopYklM5+1Y+tRGeXrOx5+Xne1RuqLFQoyQ==",
+ "dependencies": {
+ "NETStandard.Library": "1.6.1"
+ }
+ },
+ "xunit.core": {
+ "type": "Transitive",
+ "resolved": "2.4.1",
+ "contentHash": "Zsj5OMU6JasNGERXZy8s72+pcheG6Q15atS5XpZXqAtULuyQiQ6XNnUsp1gyfC6WgqScqMvySiEHmHcOG6Eg0Q==",
+ "dependencies": {
+ "xunit.extensibility.core": "[2.4.1]",
+ "xunit.extensibility.execution": "[2.4.1]"
+ }
+ },
+ "xunit.extensibility.core": {
+ "type": "Transitive",
+ "resolved": "2.4.1",
+ "contentHash": "yKZKm/8QNZnBnGZFD9SewkllHBiK0DThybQD/G4PiAmQjKtEZyHi6ET70QPU9KtSMJGRYS6Syk7EyR2EVDU4Kg==",
+ "dependencies": {
+ "NETStandard.Library": "1.6.1",
+ "xunit.abstractions": "2.0.3"
+ }
+ },
+ "xunit.extensibility.execution": {
+ "type": "Transitive",
+ "resolved": "2.4.1",
+ "contentHash": "7e/1jqBpcb7frLkB6XDrHCGXAbKN4Rtdb88epYxCSRQuZDRW8UtTfdTEVpdTl8s4T56e07hOBVd4G0OdCxIY2A==",
+ "dependencies": {
+ "NETStandard.Library": "1.6.1",
+ "xunit.extensibility.core": "[2.4.1]"
+ }
+ },
+ "scientist": {
+ "type": "Project"
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Scientist.net.sln b/Scientist.net.sln
index 02c1cb7..6edb64a 100644
--- a/Scientist.net.sln
+++ b/Scientist.net.sln
@@ -1,25 +1,11 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 15
-VisualStudioVersion = 15.0.26730.16
+# Visual Studio Version 17
+VisualStudioVersion = 17.0.31512.422
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{0FF544BE-E75C-4EF7-AEB3-A534ED5D7BB5}"
- ProjectSection(SolutionItems) = preProject
- .gitattributes = .gitattributes
- .gitignore = .gitignore
- appveyor.yml = appveyor.yml
- build.cmd = build.cmd
- build.fsx = build.fsx
- LICENSE.txt = LICENSE.txt
- README.md = README.md
- ReleaseNotes.md = ReleaseNotes.md
- EndProjectSection
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Scientist", "Scientist\Scientist.csproj", "{8794D5E1-EC60-48CD-A834-63B3531D90B3}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Scientist", "src\Scientist\Scientist.csproj", "{AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Scientist.Test", "test\Scientist.Test\Scientist.Test.csproj", "{0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Scientist.Benchmark", "test\Scientist.Benchmark\Scientist.Benchmark.csproj", "{243420EF-8A98-4D0F-9E2E-86F4E70C3128}"
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Scientist.Test", "Scientist.Test\Scientist.Test.csproj", "{8087793F-0EC4-4085-9C18-91D991FFE3DF}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -27,23 +13,19 @@ Global
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}.Release|Any CPU.Build.0 = Release|Any CPU
- {0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}.Release|Any CPU.Build.0 = Release|Any CPU
- {243420EF-8A98-4D0F-9E2E-86F4E70C3128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {243420EF-8A98-4D0F-9E2E-86F4E70C3128}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {243420EF-8A98-4D0F-9E2E-86F4E70C3128}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {243420EF-8A98-4D0F-9E2E-86F4E70C3128}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8794D5E1-EC60-48CD-A834-63B3531D90B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8794D5E1-EC60-48CD-A834-63B3531D90B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8794D5E1-EC60-48CD-A834-63B3531D90B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8794D5E1-EC60-48CD-A834-63B3531D90B3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8087793F-0EC4-4085-9C18-91D991FFE3DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {8087793F-0EC4-4085-9C18-91D991FFE3DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8087793F-0EC4-4085-9C18-91D991FFE3DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {8087793F-0EC4-4085-9C18-91D991FFE3DF}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {8CFF3922-3285-4B9E-9E64-7FC7D5332E56}
+ SolutionGuid = {9285881B-56A7-4C56-8189-DC9C8C2D8F2E}
EndGlobalSection
EndGlobal
diff --git a/Scientist/IScientist.cs b/Scientist/IScientist.cs
new file mode 100644
index 0000000..9316d5e
--- /dev/null
+++ b/Scientist/IScientist.cs
@@ -0,0 +1,7 @@
+
+namespace Scientist
+{
+ public interface IScientist
+ {
+ }
+}
diff --git a/Scientist/Scientist.cs b/Scientist/Scientist.cs
new file mode 100644
index 0000000..51131a5
--- /dev/null
+++ b/Scientist/Scientist.cs
@@ -0,0 +1,198 @@
+using System;
+using System.Threading.Tasks;
+
+namespace Scientist
+{
+ public class Scientist : IScientist
+ {
+ //static readonly Task EnabledTask = Task.FromResult(true);
+ //static readonly Lazy _sharedScientist = new Lazy(CreateSharedInstance);
+ //static Func> _enabled = () => EnabledTask;
+ //static IResultPublisher _sharedPublisher = new InMemoryResultPublisher();
+ //readonly IResultPublisher _resultPublisher;
+
+ /////
+ ///// Initializes a new instance of the class
+ ///// using the specified
+ /////
+ //public Scientist(IResultPublisher resultPublisher)
+ //{
+ // _resultPublisher = resultPublisher
+ // ?? throw new ArgumentNullException(nameof(resultPublisher), "A result publisher must be specified");
+ //}
+
+ //// TODO: How can we guide the developer to the pit of success
+
+ /////
+ ///// Gets or sets the result publisher to use.
+ ///// This should be configured once before starting observations.
+ /////
+ /////
+ ///// An attempt to set the value was made after the first experiment has been run.
+ /////
+ //public static IResultPublisher ResultPublisher
+ //{
+ // get
+ // {
+ // return _sharedPublisher;
+ // }
+
+ // set
+ // {
+ // if (_sharedScientist.IsValueCreated)
+ // {
+ // throw new InvalidOperationException($"The value of the {nameof(ResultPublisher)} property cannot be changed once an experiment has been run.");
+ // }
+
+ // _sharedPublisher = value;
+ // }
+ //}
+
+ //static Scientist CreateSharedInstance() => new SharedScientist(ResultPublisher);
+
+ //Experiment Build(string name, int concurrentTasks, Action> experiment)
+ //{
+ // // TODO: Maybe we could automatically generate the name if none is provided using the calling method name. We'd have to
+ // // make sure we don't inline this method though.
+ // var experimentBuilder = new Experiment(name, IsEnabledAsync, concurrentTasks, _resultPublisher);
+
+ // experiment(experimentBuilder);
+
+ // return experimentBuilder;
+ //}
+
+ //Experiment Build(string name, int concurrentTasks, Action> experiment)
+ //{
+ // var builder = new Experiment(name, IsEnabledAsync, concurrentTasks, _resultPublisher);
+
+ // experiment(builder);
+
+ // return builder;
+ //}
+
+ /////
+ ///// Determines if an experiment should be enabled.
+ /////
+ ///// A delegate returning if an experiment should run.
+ //public static void Enabled(Func enabled) => Enabled(() => Task.FromResult(enabled()));
+
+ /////
+ ///// Determines if an experiment should be enabled.
+ /////
+ ///// A delegate returning an asynchronous task determining if an experiment should run.
+ //public static void Enabled(Func> enabled) => _enabled = enabled;
+
+ /////
+ ///// Conduct a synchronous experiment
+ /////
+ ///// The return type of the experiment
+ ///// Name of the experiment
+ ///// Experiment callback used to configure the experiment
+ ///// The value of the experiment's control function.
+ //public static T Science(string name, Action> experiment) =>
+ // _sharedScientist.Value.Experiment(name, experiment);
+
+ /////
+ ///// Conduct a synchronous experiment
+ /////
+ ///// The return type of the experiment
+ ///// The clean type for publishing.
+ ///// Name of the experiment
+ ///// Experiment callback used to configure the experiment
+ ///// The value of the experiment's control function.
+ //public static T Science(string name, Action> experiment) =>
+ // _sharedScientist.Value.Experiment(name, experiment);
+
+ /////
+ ///// Conduct an asynchronous experiment
+ /////
+ ///// The return type of the experiment
+ ///// Name of the experiment
+ ///// Experiment callback used to configure the experiment
+ ///// The value of the experiment's control function.
+ //public static Task ScienceAsync(string name, Action> experiment) =>
+ // _sharedScientist.Value.ExperimentAsync(name, experiment);
+
+ /////
+ ///// Conduct an asynchronous experiment
+ /////
+ ///// The return type of the experiment
+ ///// Name of the experiment
+ ///// Number of tasks to run concurrently
+ ///// Experiment callback used to configure the experiment
+ ///// The value of the experiment's control function.
+ //public static Task ScienceAsync(string name, int concurrentTasks, Action> experiment) =>
+ // _sharedScientist.Value.ExperimentAsync(name, concurrentTasks, experiment);
+
+ /////
+ ///// Conduct an asynchronous experiment
+ /////
+ ///// The return type of the experiment
+ ///// The clean type for publishing.
+ ///// Name of the experiment
+ ///// Experiment callback used to configure the experiment
+ ///// The value of the experiment's control function.
+ //public static Task ScienceAsync(string name, Action> experiment) =>
+ // _sharedScientist.Value.ExperimentAsync(name, experiment);
+
+ /////
+ ///// Conduct an asynchronous experiment
+ /////
+ ///// The return type of the experiment
+ ///// The clean type for publishing.
+ ///// Name of the experiment
+ ///// Number of tasks to run concurrently
+ ///// Experiment callback used to configure the experiment
+ ///// The value of the experiment's control function.
+ //public static Task ScienceAsync(string name, int concurrentTasks, Action> experiment) =>
+ // _sharedScientist.Value.ExperimentAsync(name, concurrentTasks, experiment);
+
+ /////
+ ///// Conduct a synchronous experiment
+ /////
+ ///// The return type of the experiment
+ ///// The clean type for publishing.
+ ///// Name of the experiment
+ ///// Experiment callback used to configure the experiment
+ ///// The value of the experiment's control function.
+ //public T Experiment(string name, Action> experiment) =>
+ // Build(name, 1, experiment).Build().Run().Result;
+
+ /////
+ ///// Conduct an asynchronous experiment
+ /////
+ ///// The return type of the experiment
+ ///// The clean type for publishing.
+ ///// Name of the experiment
+ ///// Number of tasks to run concurrently
+ ///// Experiment callback used to configure the experiment
+ ///// The value of the experiment's control function.
+ //public Task ExperimentAsync(string name, int concurrentTasks, Action> experiment) =>
+ // Build(name, concurrentTasks, experiment).Build().Run();
+
+ /////
+ ///// Returns whether the experiment is enabled as an asynchronous operation
+ /////
+ /////
+ ///// A which returns whether the experiment is enabled.
+ /////
+ /////
+ ///// Override this method to change the default implementation which always returns .
+ /////
+ //protected virtual Task IsEnabledAsync() => EnabledTask;
+
+ //// This class acts as a proxy to allow the static methods to set the state on an instance of Scientist.
+ //private sealed class SharedScientist : Scientist
+ //{
+ // internal SharedScientist(IResultPublisher resultPublisher)
+ // : base(resultPublisher)
+ // {
+ // }
+
+ // protected override async Task IsEnabledAsync()
+ // {
+ // return await _enabled().ConfigureAwait(false);
+ // }
+ //}
+ }
+}
diff --git a/Scientist/Scientist.csproj b/Scientist/Scientist.csproj
new file mode 100644
index 0000000..f87a350
--- /dev/null
+++ b/Scientist/Scientist.csproj
@@ -0,0 +1,11 @@
+
+
+
+ net8.0
+ enable
+
+
+
+ true
+
+
\ No newline at end of file
diff --git a/Scientist/packages.lock.json b/Scientist/packages.lock.json
new file mode 100644
index 0000000..807ab82
--- /dev/null
+++ b/Scientist/packages.lock.json
@@ -0,0 +1,6 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {}
+ }
+}
\ No newline at end of file
diff --git a/.gitattributes b/old/.gitattributes
similarity index 100%
rename from .gitattributes
rename to old/.gitattributes
diff --git a/old/.gitignore b/old/.gitignore
new file mode 100644
index 0000000..2a2ef7b
--- /dev/null
+++ b/old/.gitignore
@@ -0,0 +1,128 @@
+# Windows image file caches
+Thumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Files left over from merge conflicts
+*.orig
+
+## Ignore Visual Studio temporary files, build results, and
+## files generated by popular Visual Studio add-ons.
+
+# User-specific files
+*.suo
+*.user
+
+# Build results
+bin/[Dd]ebug/
+bin/[Rr]elease/
+*_i.c
+*_p.c
+*.ilk
+*.log
+*.meta
+*.obj
+*.pch
+bin/**/*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.vspscc
+.builds
+
+# Roslyn cache directories
+*.ide/
+*.vs/
+
+# Visual C++ cache files
+ipch/
+*.aps
+*.ncb
+*.opensdf
+*.sdf
+
+# Visual Studio profiler
+*.psess
+*.vsp
+
+# ReSharper is a .NET coding add-in
+_ReSharper*
+
+# Click-Once directory
+publish
+
+# Others
+[Bb]in
+[Oo]bj
+sql
+TestResults
+*.Cache
+ClientBin
+stylecop.*
+~$*
+*.dbmdl
+Generated_Code #added for RIA/Silverlight projects
+*.results.xml
+nunit-*.xml
+*.userprefs
+packaging/
+tools/FAKE.Core
+tools/SourceLink.Fake
+tools/xunit.runner.console
+tools/Octokit.CodeFormatter
+tools/dotnet
+*.ncrunch*
+*.GhostDoc.xml
+
+# FAKE temporary files
+.fake/
+
+# New VS Test Runner creates arbitrary folders with PDBs
+*.pdb
+pingme.txt
+
+# ReadTheDocs build output
+docs/_build
+
+# it's 2015, no need to keep this around when migrating projects
+Backup/
+
+# Let's not commit the NuGet packages
+packages/
+
+# DNX
+project.lock.json
+artifacts/
+
+*_i.c
+*_p.c
+*_i.h
+*.ilk
+*.meta
+*.obj
+*.pch
+*.pdb
+*.pgc
+*.pgd
+*.rsp
+*.sbr
+*.tlb
+*.tli
+*.tlh
+*.tmp
+*.tmp_proj
+*.log
+*.vspscc
+*.vssscc
+.builds
+*.pidb
+*.svclog
+*.scc
+
+BenchmarkDotNet.Artifacts
diff --git a/CODE_OF_CONDUCT.md b/old/CODE_OF_CONDUCT.md
similarity index 100%
rename from CODE_OF_CONDUCT.md
rename to old/CODE_OF_CONDUCT.md
diff --git a/old/LICENSE.txt b/old/LICENSE.txt
new file mode 100644
index 0000000..b5910ee
--- /dev/null
+++ b/old/LICENSE.txt
@@ -0,0 +1,19 @@
+Copyright (c) 2016 GitHub, Inc.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
diff --git a/NuGet.config b/old/NuGet.config
similarity index 100%
rename from NuGet.config
rename to old/NuGet.config
diff --git a/old/README.md b/old/README.md
new file mode 100644
index 0000000..8a8aa43
--- /dev/null
+++ b/old/README.md
@@ -0,0 +1,349 @@
+# Scientist.NET
+
+A .NET Port of the [Scientist](https://github.com/github/scientist) library for carefully refactoring critical paths.
+
+[](https://ci.appveyor.com/project/shiftkey/scientist-net/branch/master)
+[](https://gitter.im/scientistproject/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+
+To give it a twirl, use NuGet to install: `Install-Package Scientist`
+
+## How do I science?
+
+Let's pretend you're changing the way you handle permissions in a large web app. Tests can help guide your refactoring, but you really want to compare the current and refactored behaviors under load.
+
+```csharp
+using GitHub;
+
+...
+
+public bool CanAccess(IUser user)
+{
+ return Scientist.Science("widget-permissions", experiment =>
+ {
+ experiment.Use(() => IsCollaborator(user)); // old way
+ experiment.Try(() => HasAccess(user)); // new way
+ }); // returns the control value
+}
+```
+
+Wrap a `Use` block around the code's original behavior, and wrap `Try` around the new behavior. Invoking `Scientist.Science` will always return whatever the `Use` block returns, but it does a bunch of stuff behind the scenes:
+
+* It decides whether or not to run the `Try` block,
+* Randomizes the order in which `Use` and `Try` blocks are run,
+* Measures the durations of all behaviors,
+* Compares the result of `Try` to the result of `Use`,
+* Swallows (but records) any exceptions raised in the `Try` block, and
+* Publishes all this information.
+
+The `Use` block is called the **control**. The `Try` block is called the **candidate**.
+
+If you don't declare any `Try` blocks, none of the Scientist machinery is invoked and the control value is always returned.
+
+## Making science useful
+
+### Publishing results
+
+What good is science if you can't publish your results?
+
+By default results are published in an in-memory publisher. To override this behavior, create your own implementation of `IResultPublisher`:
+
+```csharp
+public class MyResultPublisher : IResultPublisher
+{
+ public Task Publish(Result result)
+ {
+ Logger.Debug($"Publishing results for experiment '{result.ExperimentName}'");
+ Logger.Debug($"Result: {(result.Matched ? "MATCH" : "MISMATCH")}");
+ Logger.Debug($"Control value: {result.Control.Value}");
+ Logger.Debug($"Control duration: {result.Control.Duration}");
+ foreach (var observation in result.Candidates)
+ {
+ Logger.Debug($"Candidate name: {observation.Name}");
+ Logger.Debug($"Candidate value: {observation.Value}");
+ Logger.Debug($"Candidate duration: {observation.Duration}");
+ }
+
+ if (result.Mismatched)
+ {
+ // saved mismatched experiments to DB
+ DbHelpers.SaveExperimentResults(result);
+ }
+
+ return Task.FromResult(0);
+ }
+}
+```
+
+Then set Scientist to use it before running the experiments:
+
+```csharp
+Scientist.ResultPublisher = new MyResultPublisher();
+```
+
+As of v1.0.2, A `IResultPublisher` can also be wrapped in `FireAndForgetResultPublisher` so that result publishing avoids any delays in running experiments and is delegated to another thread:
+
+```csharp
+Scientist.ResultPublisher = new FireAndForgetResultPublisher(new MyResultPublisher(onPublisherException));
+```
+
+### Controlling comparison
+
+Scientist compares control and candidate values using `==`. To override this behavior, use `Compare` to define how to compare observed values instead:
+
+```csharp
+public IUser GetCurrentUser(string hash)
+{
+ return Scientist.Science("get-current-user", experiment =>
+ {
+ experiment.Compare((x, y) => x.Name == y.Name);
+
+ experiment.Use(() => LookupUser(hash));
+ experiment.Try(() => RetrieveUser(hash));
+ });
+}
+```
+
+### Adding context
+
+
+Results aren't very useful without some way to identify them. Use the `AddContext` method to add to the context for an experiment:
+
+```csharp
+public IUser GetUserByName(string userName)
+{
+ return Scientist.Science("get-user-by-name", experiment =>
+ {
+ experiment.AddContext("username", userName);
+
+ experiment.Use(() => FindUser(userName));
+ experiment.Try(() => GetUser(userName));
+ });
+}
+```
+
+`AddContext` takes a string identifier and an object value, and adds them to an internal `Dictionary`. When you publish the results, you can access the context by using the ```Contexts``` property:
+
+```csharp
+public class MyResultPublisher : IResultPublisher
+{
+ public Task Publish(Result result)
+ {
+ foreach (var kvp in result.Contexts)
+ {
+ Console.WriteLine($"Key: {kvp.Key}, Value: {kvp.Value}");
+ }
+ return Task.FromResult(0);
+ }
+}
+```
+
+### Expensive setup
+
+If an experiment requires expensive setup that should only occur when the experiment is going to be run, define it with the `BeforeRun` method:
+
+```csharp
+public int DoSomethingExpensive()
+{
+ return Scientist.Science("expensive-but-worthwile", experiment =>
+ {
+ experiment.BeforeRun(() => ExpensiveSetup());
+
+ experiment.Use(() => TheOldWay());
+ experiment.Try(() => TheNewWay());
+ });
+}
+```
+
+### Keeping it clean
+
+Sometimes you don't want to store the full value for later analysis. For example, an experiment may return `IUser` instances, but when researching a mismatch, all you care about is the logins. You can define how to clean these values in an experiment:
+
+```csharp
+public IUser GetUserByEmail(string emailAddress)
+{
+ return Scientist.Science("get-user-by-email", experiment =>
+ {
+ experiment.Use(() => OldApi.FindUserByEmail(emailAddress));
+ experiment.Try(() => NewApi.GetUserByEmail(emailAddress));
+
+ experiment.Clean(user => user.Login);
+ });
+}
+```
+
+And this cleaned value is available in the final published result:
+
+```csharp
+public class MyResultPublisher : IResultPublisher
+{
+ public Task Publish(Result result)
+ {
+ // result.Control.Value =
+ IUser user = (IUser)result.Control.Value;
+ Console.WriteLine($"Login from raw object: {user.Login}");
+
+ // result.Control.CleanedValue = "user name"
+ Console.WriteLine($"Login from cleaned object: {result.Control.CleanedValue}");
+
+ return Task.FromResult(0);
+ }
+}
+```
+
+### Ignoring mismatches
+
+During the early stages of an experiment, it's possible that some of your code will always generate a mismatch for reasons you know and understand but haven't yet fixed. Instead of these known cases always showing up as mismatches in your metrics or analysis, you can tell an experiment whether or not to ignore a mismatch using the `Ignore` method. You may include more than one block if needed:
+
+```csharp
+public bool CanAccess(IUser user)
+{
+ return Scientist.Science("widget-permissions", experiment =>
+ {
+ experiment.Use(() => IsCollaborator(user));
+ experiment.Try(() => HasAccess(user));
+
+ // user is staff, always an admin in the new system
+ experiment.Ignore((control, candidate) => user.IsStaff);
+ // new system doesn't handle unconfirmed users yet
+ experiment.Ignore((control, candidate) => control && !candidate && !user.ConfirmedEmail);
+ });
+}
+```
+
+The ignore blocks are only called if the *values* don't match. If one observation raises an exception and the other doesn't, it's always considered a mismatch. If both observations raise different exceptions, that is also considered a mismatch.
+
+### Enabling/disabling experiments
+
+Sometimes you don't want an experiment to run. Say, disabling a new codepath for anyone who isn't staff. You can disable an experiment by setting a `RunIf` block. If this returns `false`, the experiment will merely return the control value. Otherwise, it defers to the global `Scientist.Enabled` method.
+
+```csharp
+public decimal GetUserStatistic(IUser user)
+{
+ return Scientist.Science("new-statistic-calculation", experiment =>
+ {
+ experiment.RunIf(() => user.IsTestSubject);
+
+ experiment.Use(() => CalculateStatistic(user));
+ experiment.Try(() => NewCalculateStatistic(user));
+ });
+}
+```
+
+### Ramping up experiments
+
+As a scientist, you know it's always important to be able to turn your experiment off, lest it run amok and result in villagers with pitchforks on your doorstep. You can set a global switch to control whether or not experiments is enabled by using the `Scientist.Enabled` method.
+
+```csharp
+int percentEnabled = 10;
+Random rand = new Random();
+Scientist.Enabled(() =>
+{
+ return rand.Next(100) < percentEnabled;
+});
+```
+
+This code will be invoked for every method with an experiment every time, so be sensitive about its performance. For example, you can store an experiment in the database but wrap it in various levels of caching.
+
+### Running candidates in parallel (asynchronous)
+
+Scientist runs tasks synchronously by default. This can end up doubling (more or less) the time it takes the original method call to complete, depending on how many candidates are added and how long they take to run.
+
+In cases where Scientist is used for production refactoring, for example, this ends up causing the calling method to return slower than before which may affect the performance of your original code. However, if the candidates can be run at the same time as the control method without affecting each other, then they can be run in parallel so the Scientist call will only take as long as the slowest task (plus a tiny bit of overhead):
+
+```csharp
+await Scientist.ScienceAsync(
+ "ExperimentName",
+ 3, // number of tasks to run concurrently
+ experiment => {
+ experiment.Use(async () => await StartRunningSomething(myData));
+ experiment.Try(async () => await RunAtTheSameTimeAsTheControlMethod(myData));
+ experiment.Try(async () => await AlsoRunThisConcurrently(myData));
+ });
+```
+
+As always when using async/await, don't forget to call `.ConfigureAwait(false)` where appropriate.
+
+### Testing
+
+When running your test suite, it's helpful to know that the experimental results always match. To help with testing, Scientist has a `ThrowOnMismatches` property that can be set to `true`. Only do this in your test suite!
+
+To throw on mismatches:
+
+```csharp
+Scientist.Science("ExperimentN", experiment =>
+{
+ experiment.ThrowOnMismatches = true;
+ // ...
+});
+```
+
+Scientist will throw a `MismatchException` exception if any observations don't match.
+
+### Handling errors
+
+If an exception is thrown in any of Scientist's internal helpers like `Compare`, `Enabled`, or `Ignore`, the default behavior of Scientist is to re-throw that exception. Since this halts the experiment entirely, it's often a better idea to handle this error and continue so the experiment as a whole isn't canceled entirely:
+
+```csharp
+Scientist.Science("ExperimentCatch", experiment =>
+{
+ experiment.Thrown((operation, exception) => InternalTracker.Track($"Science failure in ExperimentCatch: {operation}.", exception))
+ // ...
+});
+```
+
+The operations that may be handled here are:
+
+* `Operation.Compare` - an exception is raised in a `Compare` block
+* `Operation.Enabled` - an exception is raised in the `Enabled` block
+* `Operation.Ignore` - an exception is raised in an `Ignore` block
+* `Operation.Publish` - an exception is raised while publishing results
+* `Operation.RunIf` - an exception is raised in a `RunIf` block
+
+### Designing an experiment
+
+Because `Enabled` and `RunIf` determine when a candidate runs, it's impossible to guarantee that it will run every time. For this reason, Scientist is only safe for wrapping methods that aren't changing data.
+
+When using Scientist, we've found it most useful to modify both the existing and new systems simultaneously anywhere writes happen, and verify the results at read time with `Science`. `ThrowOnMismatches` has also been useful to ensure that the correct data was written during tests, and reviewing published mismatches has helped us find any situations we overlooked with our production data at runtime. When writing to and reading from two systems, it's also useful to write some data reconciliation scripts to verify and clean up production data alongside any running experiments.
+
+### Finishing an experiment
+
+As your candidate behavior converges on the controls, you'll start thinking about removing an experiment and using the new behavior.
+
+* If there are any ignore blocks, the candidate behavior is *guaranteed* to be different. If this is unacceptable, you'll need to remove the ignore blocks and resolve any ongoing mismatches in behavior until the observations match perfectly every time.
+* When removing a read-behavior experiment, it's a good idea to keep any write-side duplication between an old and new system in place until well after the new behavior has been in production, in case you need to roll back.
+
+## Breaking the rules
+
+Sometimes scientists just gotta do weird stuff. We understand.
+
+
+### Ignoring results entirely
+
+Science is useful even when all you care about is the timing data or even whether or not a new code path blew up. If you have the ability to incrementally control how often an experiment runs via your `Enabled` method, you can use it to silently and carefully test new code paths and ignore the results altogether. You can do this by setting `Ignore((x, y) => true)`, or for greater efficiency, `Compare((x, y) => true)`.
+
+This will still log mismatches if any exceptions are raised, but will disregard the values entirely.
+
+### Trying more than one thing
+
+It's not usually a good idea to try more than one alternative simultaneously. Behavior isn't guaranteed to be isolated and reporting + visualization get quite a bit harder. Still, it's sometimes useful.
+
+To try more than one alternative at once, add names to some `Try` blocks:
+
+```csharp
+public bool CanAccess(IUser user)
+{
+ return Scientist.Science("widget-permissions", experiment =>
+ {
+ experiment.Use(() => IsCollaborator(user));
+ experiment.Try("api", () => HasAccess(user));
+ experiment.Try("raw-sql", () => HasAccessSql(user));
+ });
+}
+```
+
+## Alternatives
+
+Here are other implementations of Scientist available in different languages.
+
+- [github/scientist](https://github.com/github/scientist) the original implementation of Scientist, in [Ruby](https://www.ruby-lang.org/).
+- [daylerees/scientist](https://github.com/daylerees/scientist) for [PHP](http://php.net/) by [Dayle Rees](https://github.com/daylerees).
diff --git a/ReleaseNotes.md b/old/ReleaseNotes.md
similarity index 100%
rename from ReleaseNotes.md
rename to old/ReleaseNotes.md
diff --git a/old/Scientist.net.sln b/old/Scientist.net.sln
new file mode 100644
index 0000000..02c1cb7
--- /dev/null
+++ b/old/Scientist.net.sln
@@ -0,0 +1,49 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26730.16
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Meta", "Meta", "{0FF544BE-E75C-4EF7-AEB3-A534ED5D7BB5}"
+ ProjectSection(SolutionItems) = preProject
+ .gitattributes = .gitattributes
+ .gitignore = .gitignore
+ appveyor.yml = appveyor.yml
+ build.cmd = build.cmd
+ build.fsx = build.fsx
+ LICENSE.txt = LICENSE.txt
+ README.md = README.md
+ ReleaseNotes.md = ReleaseNotes.md
+ EndProjectSection
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Scientist", "src\Scientist\Scientist.csproj", "{AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Scientist.Test", "test\Scientist.Test\Scientist.Test.csproj", "{0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Scientist.Benchmark", "test\Scientist.Benchmark\Scientist.Benchmark.csproj", "{243420EF-8A98-4D0F-9E2E-86F4E70C3128}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {AF3E98CD-DA8C-43B2-8217-76B6AE8BCA20}.Release|Any CPU.Build.0 = Release|Any CPU
+ {0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {0686E0A8-FB25-4B20-9BC0-CD05E916E5AD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {243420EF-8A98-4D0F-9E2E-86F4E70C3128}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {243420EF-8A98-4D0F-9E2E-86F4E70C3128}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {243420EF-8A98-4D0F-9E2E-86F4E70C3128}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {243420EF-8A98-4D0F-9E2E-86F4E70C3128}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {8CFF3922-3285-4B9E-9E64-7FC7D5332E56}
+ EndGlobalSection
+EndGlobal
diff --git a/appveyor.yml b/old/appveyor.yml
similarity index 100%
rename from appveyor.yml
rename to old/appveyor.yml
diff --git a/old/assets/Scientist_Final-01.svg b/old/assets/Scientist_Final-01.svg
new file mode 100644
index 0000000..862c131
--- /dev/null
+++ b/old/assets/Scientist_Final-01.svg
@@ -0,0 +1,38 @@
+
+
+
diff --git a/old/assets/scientist-logo-64x64.png b/old/assets/scientist-logo-64x64.png
new file mode 100644
index 0000000..70ab606
Binary files /dev/null and b/old/assets/scientist-logo-64x64.png differ
diff --git a/build.cmd b/old/build.cmd
similarity index 100%
rename from build.cmd
rename to old/build.cmd
diff --git a/build.fsx b/old/build.fsx
similarity index 100%
rename from build.fsx
rename to old/build.fsx
diff --git a/src/Scientist/Extensions/LinqExtensionMethods.cs b/old/src/Scientist/Extensions/LinqExtensionMethods.cs
similarity index 100%
rename from src/Scientist/Extensions/LinqExtensionMethods.cs
rename to old/src/Scientist/Extensions/LinqExtensionMethods.cs
diff --git a/src/Scientist/FireAndForgetResultPublisher.cs b/old/src/Scientist/FireAndForgetResultPublisher.cs
similarity index 100%
rename from src/Scientist/FireAndForgetResultPublisher.cs
rename to old/src/Scientist/FireAndForgetResultPublisher.cs
diff --git a/src/Scientist/FodyWeavers.xml b/old/src/Scientist/FodyWeavers.xml
similarity index 100%
rename from src/Scientist/FodyWeavers.xml
rename to old/src/Scientist/FodyWeavers.xml
diff --git a/src/Scientist/IExperiment.cs b/old/src/Scientist/IExperiment.cs
similarity index 100%
rename from src/Scientist/IExperiment.cs
rename to old/src/Scientist/IExperiment.cs
diff --git a/src/Scientist/IResultPublisher.cs b/old/src/Scientist/IResultPublisher.cs
similarity index 100%
rename from src/Scientist/IResultPublisher.cs
rename to old/src/Scientist/IResultPublisher.cs
diff --git a/src/Scientist/IScientist.cs b/old/src/Scientist/IScientist.cs
similarity index 100%
rename from src/Scientist/IScientist.cs
rename to old/src/Scientist/IScientist.cs
diff --git a/src/Scientist/Internals/ConcurrentSet.cs b/old/src/Scientist/Internals/ConcurrentSet.cs
similarity index 100%
rename from src/Scientist/Internals/ConcurrentSet.cs
rename to old/src/Scientist/Internals/ConcurrentSet.cs
diff --git a/src/Scientist/Internals/Experiment.cs b/old/src/Scientist/Internals/Experiment.cs
similarity index 100%
rename from src/Scientist/Internals/Experiment.cs
rename to old/src/Scientist/Internals/Experiment.cs
diff --git a/src/Scientist/Internals/ExperimentInstance.cs b/old/src/Scientist/Internals/ExperimentInstance.cs
similarity index 100%
rename from src/Scientist/Internals/ExperimentInstance.cs
rename to old/src/Scientist/Internals/ExperimentInstance.cs
diff --git a/src/Scientist/Internals/ExperimentSettings.cs b/old/src/Scientist/Internals/ExperimentSettings.cs
similarity index 100%
rename from src/Scientist/Internals/ExperimentSettings.cs
rename to old/src/Scientist/Internals/ExperimentSettings.cs
diff --git a/src/Scientist/Internals/InMemoryResultPublisher.cs b/old/src/Scientist/Internals/InMemoryResultPublisher.cs
similarity index 100%
rename from src/Scientist/Internals/InMemoryResultPublisher.cs
rename to old/src/Scientist/Internals/InMemoryResultPublisher.cs
diff --git a/src/Scientist/MismatchException.cs b/old/src/Scientist/MismatchException.cs
similarity index 100%
rename from src/Scientist/MismatchException.cs
rename to old/src/Scientist/MismatchException.cs
diff --git a/src/Scientist/Observation.cs b/old/src/Scientist/Observation.cs
similarity index 100%
rename from src/Scientist/Observation.cs
rename to old/src/Scientist/Observation.cs
diff --git a/src/Scientist/Operation.cs b/old/src/Scientist/Operation.cs
similarity index 100%
rename from src/Scientist/Operation.cs
rename to old/src/Scientist/Operation.cs
diff --git a/src/Scientist/OperationException.cs b/old/src/Scientist/OperationException.cs
similarity index 100%
rename from src/Scientist/OperationException.cs
rename to old/src/Scientist/OperationException.cs
diff --git a/src/Scientist/Properties/AssemblyInfo.cs b/old/src/Scientist/Properties/AssemblyInfo.cs
similarity index 100%
rename from src/Scientist/Properties/AssemblyInfo.cs
rename to old/src/Scientist/Properties/AssemblyInfo.cs
diff --git a/src/Scientist/Result.cs b/old/src/Scientist/Result.cs
similarity index 100%
rename from src/Scientist/Result.cs
rename to old/src/Scientist/Result.cs
diff --git a/src/Scientist/Scientist.cs b/old/src/Scientist/Scientist.cs
similarity index 100%
rename from src/Scientist/Scientist.cs
rename to old/src/Scientist/Scientist.cs
diff --git a/src/Scientist/Scientist.csproj b/old/src/Scientist/Scientist.csproj
similarity index 100%
rename from src/Scientist/Scientist.csproj
rename to old/src/Scientist/Scientist.csproj
diff --git a/src/Scientist/ScientistExtensions.cs b/old/src/Scientist/ScientistExtensions.cs
similarity index 100%
rename from src/Scientist/ScientistExtensions.cs
rename to old/src/Scientist/ScientistExtensions.cs
diff --git a/src/Scientist/packages.config b/old/src/Scientist/packages.config
similarity index 100%
rename from src/Scientist/packages.config
rename to old/src/Scientist/packages.config
diff --git a/test/Scientist.Benchmark/Program.cs b/old/test/Scientist.Benchmark/Program.cs
similarity index 100%
rename from test/Scientist.Benchmark/Program.cs
rename to old/test/Scientist.Benchmark/Program.cs
diff --git a/test/Scientist.Benchmark/Scientist.Benchmark.csproj b/old/test/Scientist.Benchmark/Scientist.Benchmark.csproj
similarity index 100%
rename from test/Scientist.Benchmark/Scientist.Benchmark.csproj
rename to old/test/Scientist.Benchmark/Scientist.Benchmark.csproj
diff --git a/test/Scientist.Benchmark/ScientistBenchmarks.cs b/old/test/Scientist.Benchmark/ScientistBenchmarks.cs
similarity index 100%
rename from test/Scientist.Benchmark/ScientistBenchmarks.cs
rename to old/test/Scientist.Benchmark/ScientistBenchmarks.cs
diff --git a/test/Scientist.Test/ComplexResult.cs b/old/test/Scientist.Test/ComplexResult.cs
similarity index 100%
rename from test/Scientist.Test/ComplexResult.cs
rename to old/test/Scientist.Test/ComplexResult.cs
diff --git a/test/Scientist.Test/FireAndForgetResultPublisherTests.cs b/old/test/Scientist.Test/FireAndForgetResultPublisherTests.cs
similarity index 100%
rename from test/Scientist.Test/FireAndForgetResultPublisherTests.cs
rename to old/test/Scientist.Test/FireAndForgetResultPublisherTests.cs
diff --git a/test/Scientist.Test/IControlCandidate.cs b/old/test/Scientist.Test/IControlCandidate.cs
similarity index 100%
rename from test/Scientist.Test/IControlCandidate.cs
rename to old/test/Scientist.Test/IControlCandidate.cs
diff --git a/test/Scientist.Test/IScientistSettings.cs b/old/test/Scientist.Test/IScientistSettings.cs
similarity index 100%
rename from test/Scientist.Test/IScientistSettings.cs
rename to old/test/Scientist.Test/IScientistSettings.cs
diff --git a/test/Scientist.Test/Properties/AssemblyInfo.cs b/old/test/Scientist.Test/Properties/AssemblyInfo.cs
similarity index 100%
rename from test/Scientist.Test/Properties/AssemblyInfo.cs
rename to old/test/Scientist.Test/Properties/AssemblyInfo.cs
diff --git a/test/Scientist.Test/Scientist.Test.csproj b/old/test/Scientist.Test/Scientist.Test.csproj
similarity index 100%
rename from test/Scientist.Test/Scientist.Test.csproj
rename to old/test/Scientist.Test/Scientist.Test.csproj
diff --git a/test/Scientist.Test/ScientistTests.cs b/old/test/Scientist.Test/ScientistTests.cs
similarity index 100%
rename from test/Scientist.Test/ScientistTests.cs
rename to old/test/Scientist.Test/ScientistTests.cs
diff --git a/test/Scientist.Test/Swap.cs b/old/test/Scientist.Test/Swap.cs
similarity index 100%
rename from test/Scientist.Test/Swap.cs
rename to old/test/Scientist.Test/Swap.cs
diff --git a/test/Scientist.Test/TestHelper.cs b/old/test/Scientist.Test/TestHelper.cs
similarity index 100%
rename from test/Scientist.Test/TestHelper.cs
rename to old/test/Scientist.Test/TestHelper.cs
diff --git a/test/Scientist.Test/ThrownTests.cs b/old/test/Scientist.Test/ThrownTests.cs
similarity index 100%
rename from test/Scientist.Test/ThrownTests.cs
rename to old/test/Scientist.Test/ThrownTests.cs
diff --git a/tools/nuget/NuGet.exe b/old/tools/nuget/NuGet.exe
similarity index 100%
rename from tools/nuget/NuGet.exe
rename to old/tools/nuget/NuGet.exe