[
  {
    "path": ".azuredevops/dependabot.yml",
    "content": "# Please see the documentation for all configuration options:\n# https://eng.ms/docs/products/dependabot/configuration/version_updates\n\nversion: 2\nupdates:\n- package-ecosystem: nuget\n  directory: /\n  schedule:\n    interval: monthly\n"
  },
  {
    "path": ".config/dotnet-tools.json",
    "content": "{\n  \"version\": 1,\n  \"isRoot\": true,\n  \"tools\": {\n    \"powershell\": {\n      \"version\": \"7.6.1\",\n      \"commands\": [\n        \"pwsh\"\n      ],\n      \"rollForward\": false\n    },\n    \"dotnet-coverage\": {\n      \"version\": \"18.6.2\",\n      \"commands\": [\n        \"dotnet-coverage\"\n      ],\n      \"rollForward\": false\n    },\n    \"nbgv\": {\n      \"version\": \"3.9.50\",\n      \"commands\": [\n        \"nbgv\"\n      ],\n      \"rollForward\": false\n    },\n    \"docfx\": {\n      \"version\": \"2.78.5\",\n      \"commands\": [\n        \"docfx\"\n      ],\n      \"rollForward\": false\n    },\n    \"nerdbank.dotnetrepotools\": {\n      \"version\": \"1.3.22\",\n      \"commands\": [\n        \"repo\"\n      ],\n      \"rollForward\": false\n    },\n    \"dotnet-symbol\": {\n      \"version\": \"9.0.661903\",\n      \"commands\": [\n        \"dotnet-symbol\"\n      ],\n      \"rollForward\": false\n    }\n  }\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "# EditorConfig is awesome:http://EditorConfig.org\n\n# top-most EditorConfig file\nroot = true\n\n# Don't use tabs for indentation.\n[*]\nindent_style = space\n\n# (Please don't specify an indent_size here; that has too many unintended consequences.)\n\n[*.yml]\nindent_size = 2\nindent_style = space\n\n# Code files\n[*.{cs,csx,vb,vbx,h,cpp,idl}]\nindent_size = 4\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n# MSBuild project files\n[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,projitems,shproj,msbuildproj,props,targets}]\nindent_size = 2\n\n# Xml config files\n[*.{ruleset,config,nuspec,resx,vsixmanifest,vsct,runsettings}]\nindent_size = 2\nindent_style = space\n\n# JSON files\n[*.json]\nindent_size = 2\nindent_style = space\n\n[*.ps1]\nindent_style = space\nindent_size = 4\n\n# Dotnet code style settings:\n[*.{cs,vb}]\n# Sort using and Import directives with System.* appearing first\ndotnet_sort_system_directives_first = true\ndotnet_separate_import_directive_groups = false\ndotnet_style_qualification_for_field = true:warning\ndotnet_style_qualification_for_property = true:warning\ndotnet_style_qualification_for_method = true:warning\ndotnet_style_qualification_for_event = true:warning\n\n# Use language keywords instead of framework type names for type references\ndotnet_style_predefined_type_for_locals_parameters_members = true:suggestion\ndotnet_style_predefined_type_for_member_access = true:suggestion\n\n# Suggest more modern language features when available\ndotnet_style_object_initializer = true:suggestion\ndotnet_style_collection_initializer = true:suggestion\ndotnet_style_coalesce_expression = true:suggestion\ndotnet_style_null_propagation = true:suggestion\ndotnet_style_explicit_tuple_names = true:suggestion\n\n# Non-private static fields are PascalCase\ndotnet_naming_rule.non_private_static_fields_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.non_private_static_fields_should_be_pascal_case.symbols = non_private_static_fields\ndotnet_naming_rule.non_private_static_fields_should_be_pascal_case.style = non_private_static_field_style\n\ndotnet_naming_symbols.non_private_static_fields.applicable_kinds = field\ndotnet_naming_symbols.non_private_static_fields.applicable_accessibilities = public, protected, internal, protected internal, private protected\ndotnet_naming_symbols.non_private_static_fields.required_modifiers = static\n\ndotnet_naming_style.non_private_static_field_style.capitalization = pascal_case\n\n# Constants are PascalCase\ndotnet_naming_rule.constants_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.constants_should_be_pascal_case.symbols = constants\ndotnet_naming_rule.constants_should_be_pascal_case.style = constant_style\n\ndotnet_naming_symbols.constants.applicable_kinds = field, local\ndotnet_naming_symbols.constants.required_modifiers = const\n\ndotnet_naming_style.constant_style.capitalization = pascal_case\n\n# Static fields are camelCase\ndotnet_naming_rule.static_fields_should_be_camel_case.severity = suggestion\ndotnet_naming_rule.static_fields_should_be_camel_case.symbols = static_fields\ndotnet_naming_rule.static_fields_should_be_camel_case.style = static_field_style\n\ndotnet_naming_symbols.static_fields.applicable_kinds = field\ndotnet_naming_symbols.static_fields.required_modifiers = static\n\ndotnet_naming_style.static_field_style.capitalization = camel_case\n\n# Instance fields are camelCase\ndotnet_naming_rule.instance_fields_should_be_camel_case.severity = suggestion\ndotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields\ndotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style\n\ndotnet_naming_symbols.instance_fields.applicable_kinds = field\n\ndotnet_naming_style.instance_field_style.capitalization = camel_case\n\n# Locals and parameters are camelCase\ndotnet_naming_rule.locals_should_be_camel_case.severity = suggestion\ndotnet_naming_rule.locals_should_be_camel_case.symbols = locals_and_parameters\ndotnet_naming_rule.locals_should_be_camel_case.style = camel_case_style\n\ndotnet_naming_symbols.locals_and_parameters.applicable_kinds = parameter, local\n\ndotnet_naming_style.camel_case_style.capitalization = camel_case\n\n# Local functions are PascalCase\ndotnet_naming_rule.local_functions_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.local_functions_should_be_pascal_case.symbols = local_functions\ndotnet_naming_rule.local_functions_should_be_pascal_case.style = local_function_style\n\ndotnet_naming_symbols.local_functions.applicable_kinds = local_function\n\ndotnet_naming_style.local_function_style.capitalization = pascal_case\n\n# By default, name items with PascalCase\ndotnet_naming_rule.members_should_be_pascal_case.severity = suggestion\ndotnet_naming_rule.members_should_be_pascal_case.symbols = all_members\ndotnet_naming_rule.members_should_be_pascal_case.style = pascal_case_style\n\ndotnet_naming_symbols.all_members.applicable_kinds = *\n\ndotnet_naming_style.pascal_case_style.capitalization = pascal_case\n\n# CSharp code style settings:\n[*.cs]\n# Indentation preferences\ncsharp_indent_block_contents = true\ncsharp_indent_braces = false\ncsharp_indent_case_contents = true\ncsharp_indent_switch_labels = true\ncsharp_indent_labels = flush_left\n\n# Prefer \"var\" everywhere\ncsharp_style_var_for_built_in_types = false\ncsharp_style_var_when_type_is_apparent = true:suggestion\ncsharp_style_var_elsewhere = false:warning\n\n# Prefer method-like constructs to have a block body\ncsharp_style_expression_bodied_methods = false:none\ncsharp_style_expression_bodied_constructors = false:none\ncsharp_style_expression_bodied_operators = false:none\n\n# Prefer property-like constructs to have an expression-body\ncsharp_style_expression_bodied_properties = true:none\ncsharp_style_expression_bodied_indexers = true:none\ncsharp_style_expression_bodied_accessors = true:none\n\n# Suggest more modern language features when available\ncsharp_style_pattern_matching_over_is_with_cast_check = true:suggestion\ncsharp_style_pattern_matching_over_as_with_null_check = true:suggestion\ncsharp_style_inlined_variable_declaration = true:suggestion\ncsharp_style_throw_expression = true:suggestion\ncsharp_style_conditional_delegate_call = true:suggestion\n\n# Newline settings\ncsharp_new_line_before_open_brace = all\ncsharp_new_line_before_else = true\ncsharp_new_line_before_catch = true\ncsharp_new_line_before_finally = true\ncsharp_new_line_before_members_in_object_initializers = true\ncsharp_new_line_before_members_in_anonymous_types = true\n\n# Blocks are allowed\ncsharp_prefer_braces = true:silent\n\n# SA1130: Use lambda syntax\ndotnet_diagnostic.SA1130.severity = silent\n\n# IDE1006: Naming Styles - StyleCop handles these for us\ndotnet_diagnostic.IDE1006.severity = none\n\ndotnet_diagnostic.DOC100.severity = silent\ndotnet_diagnostic.DOC104.severity = warning\ndotnet_diagnostic.DOC105.severity = warning\ndotnet_diagnostic.DOC106.severity = warning\ndotnet_diagnostic.DOC107.severity = warning\ndotnet_diagnostic.DOC108.severity = warning\ndotnet_diagnostic.DOC200.severity = warning\ndotnet_diagnostic.DOC202.severity = warning\n\n# CA1062: Validate arguments of public methods\ndotnet_diagnostic.CA1062.severity = warning\n\n# CA2016: Forward the CancellationToken parameter\ndotnet_diagnostic.CA2016.severity = warning\n\n[*.sln]\nindent_style = tab\n"
  },
  {
    "path": ".gitattributes",
    "content": "###############################################################################\n# Set default behavior to automatically normalize line endings.\n###############################################################################\n* text=auto\n\n# Ensure shell scripts use LF line endings (linux only accepts LF)\n*.sh eol=lf\n*.ps1 eol=lf\n\n# The macOS codesign tool is extremely picky, and requires LF line endings.\n*.plist eol=lf\n\n###############################################################################\n# Set default behavior for command prompt diff.\n#\n# This is need for earlier builds of msysgit that does not have it on by\n# default for csharp files.\n# Note: This is only used by command line\n###############################################################################\n#*.cs     diff=csharp\n\n###############################################################################\n# Set the merge driver for project and solution files\n#\n# Merging from the command prompt will add diff markers to the files if there\n# are conflicts (Merging from VS is not affected by the settings below, in VS\n# the diff markers are never inserted). Diff markers may cause the following\n# file extensions to fail to load in VS. An alternative would be to treat\n# these files as binary and thus will always conflict and require user\n# intervention with every merge. To do so, just uncomment the entries below\n###############################################################################\n#*.sln       merge=binary\n#*.csproj    merge=binary\n#*.vbproj    merge=binary\n#*.vcxproj   merge=binary\n#*.vcproj    merge=binary\n#*.dbproj    merge=binary\n#*.fsproj    merge=binary\n#*.lsproj    merge=binary\n#*.wixproj   merge=binary\n#*.modelproj merge=binary\n#*.sqlproj   merge=binary\n#*.wwaproj   merge=binary\n\n###############################################################################\n# behavior for image files\n#\n# image files are treated as binary by default.\n###############################################################################\n#*.jpg   binary\n#*.png   binary\n#*.gif   binary\n\n###############################################################################\n# diff behavior for common document formats\n#\n# Convert binary document formats to text before diffing them. This feature\n# is only available from the command line. Turn it on by uncommenting the\n# entries below.\n###############################################################################\n#*.doc   diff=astextplain\n#*.DOC   diff=astextplain\n#*.docx  diff=astextplain\n#*.DOCX  diff=astextplain\n#*.dot   diff=astextplain\n#*.DOT   diff=astextplain\n#*.pdf   diff=astextplain\n#*.PDF   diff=astextplain\n#*.rtf   diff=astextplain\n#*.RTF   diff=astextplain\n"
  },
  {
    "path": ".github/.editorconfig",
    "content": "[renovate.json*]\nindent_style = tab\n"
  },
  {
    "path": ".github/Prime-ForCopilot.ps1",
    "content": "if ((git -C $PSScriptRoot rev-parse --is-shallow-repository) -eq 'true')\n{\n    Write-Host \"Shallow clone detected, disabling NBGV Git engine so the build can succeed.\"\n    $env:NBGV_GitEngine='Disabled'\n}\n"
  },
  {
    "path": ".github/actions/publish-artifacts/action.yaml",
    "content": "name: Publish artifacts\ndescription: Publish artifacts\n\nruns:\n  using: composite\n  steps:\n  - name: 📥 Collect artifacts\n    run: tools/artifacts/_stage_all.ps1\n    shell: pwsh\n    if: always()\n\n# TODO: replace this hard-coded list with a loop that utilizes the NPM package at\n# https://github.com/actions/toolkit/tree/main/packages/artifact (or similar) to push the artifacts.\n\n  - name: 📢 Upload project.assets.json files\n    if: always()\n    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1\n    with:\n      name: projectAssetsJson-${{ runner.os }}\n      path: ${{ runner.temp }}/_artifacts/projectAssetsJson\n    continue-on-error: true\n  - name: 📢 Upload variables\n    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1\n    with:\n      name: variables-${{ runner.os }}\n      path: ${{ runner.temp }}/_artifacts/Variables\n    continue-on-error: true\n  - name: 📢 Upload build_logs\n    if: always()\n    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1\n    with:\n      name: build_logs-${{ runner.os }}\n      path: ${{ runner.temp }}/_artifacts/build_logs\n    continue-on-error: true\n  - name: 📢 Upload testResults\n    if: always()\n    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1\n    with:\n      name: testResults-${{ runner.os }}\n      path: ${{ runner.temp }}/_artifacts/testResults\n    continue-on-error: true\n  - name: 📢 Upload coverageResults\n    if: always()\n    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1\n    with:\n      name: coverageResults-${{ runner.os }}\n      path: ${{ runner.temp }}/_artifacts/coverageResults\n    continue-on-error: true\n  - name: 📢 Upload symbols\n    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1\n    with:\n      name: symbols-${{ runner.os }}\n      path: ${{ runner.temp }}/_artifacts/symbols\n    continue-on-error: true\n  - name: 📢 Upload deployables\n    uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1\n    with:\n      name: deployables-${{ runner.os }}\n      path: ${{ runner.temp }}/_artifacts/deployables\n    if: always()\n"
  },
  {
    "path": ".github/copilot-instructions.md",
    "content": "# Copilot instructions for this repository\n\n## High level guidance\n\n* Review the `CONTRIBUTING.md` file for instructions to build and test the software.\n* Run the `.github/Prime-ForCopilot.ps1` script (once) before running any `dotnet` or `msbuild` commands.\n  If you see any build errors about not finding git objects or a shallow clone, it may be time to run this script again.\n\n## Software Design\n\n* Design APIs to be highly testable, and all functionality should be tested.\n* Avoid introducing binary breaking changes in public APIs of projects under `src` unless their project files have `IsPackable` set to `false`.\n\n## Testing\n\n**IMPORTANT**: This repository uses Microsoft.Testing.Platform (MTP v2) with xunit v3. Traditional `--filter` syntax does NOT work. Use the options below instead.\n\n* There should generally be one test project (under the `test` directory) per shipping project (under the `src` directory). Test projects are named after the project being tested with a `.Tests` suffix.\n* Tests use xunit v3 with Microsoft.Testing.Platform (MTP v2). Traditional VSTest `--filter` syntax does NOT work.\n* Some tests are known to be unstable. When running tests, you should skip the unstable ones by using `-- --filter-not-trait \"FailsInCloudTest=true\"`.\n\n### Running Tests\n\n**Run all tests**:\n```bash\ndotnet test --no-build -c Release\n```\n\n**Run tests for a specific test project**:\n```bash\ndotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release\n```\n\n**Run a single test method**:\n```bash\ndotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method ClassName.MethodName\n```\n\n**Run all tests in a test class**:\n```bash\ndotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-class ClassName\n```\n\n**Run tests with wildcard matching** (supports wildcards at beginning and/or end):\n```bash\ndotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-method \"*Pattern*\"\n```\n\n**Run tests with a specific trait** (equivalent to category filtering):\n```bash\ndotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-trait \"TraitName=value\"\n```\n\n**Exclude tests with a specific trait** (skip unstable tests):\n```bash\ndotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release -- --filter-not-trait \"TestCategory=FailsInCloudTest\"\n```\n\n**Run tests for a specific framework only**:\n```bash\ndotnet test --project test/Library.Tests/Library.Tests.csproj --no-build -c Release --framework net9.0\n```\n\n**List all available tests without running them**:\n```bash\ncd test/Library.Tests\ndotnet run --no-build -c Release --framework net9.0 -- --list-tests\n```\n\n**Key points about test filtering with MTP v2 / xunit v3**:\n- Options after `--` are passed to the test runner, not to `dotnet test`\n- Use `--filter-method`, `--filter-class`, `--filter-namespace` for simple filtering\n- Use `--filter-trait` and `--filter-not-trait` for trait-based filtering (replaces `--filter \"TestCategory=...\"`)\n- Traditional VSTest `--filter` expressions do NOT work\n- Wildcards `*` are supported at the beginning and/or end of filter values\n- Multiple simple filters of the same type use OR logic, different types combine with AND\n- See `--help` for query filter language for advanced scenarios\n\n## Coding style\n\n* Honor StyleCop rules and fix any reported build warnings *after* getting tests to pass.\n* In C# files, use namespace *statements* instead of namespace *blocks* for all new files.\n* Add API doc comments to all new public and internal members.\n"
  },
  {
    "path": ".github/renovate.json",
    "content": "{\n\t\"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\",\n\t\"extends\": [\n\t\t\"github>microsoft/vs-renovate-presets:microbuild\",\n\t\t\"github>microsoft/vs-renovate-presets:vs_main_dependencies\"\n\t],\n\t\"packageRules\": []\n}\n"
  },
  {
    "path": ".github/skills/update-library-template/SKILL.md",
    "content": "---\nname: update-library-template\ndescription: Merges the latest Library.Template into this repo (at position of HEAD) and resolves conflicts.\ndisable-model-invocation: true\n---\n\n# Instructions\n\n1. Run `./tools/MergeFrom-Template.ps1` from the repo root.\n2. Resolve merge conflicts, taking into account conflict resolution policy below.\n3. Validate the changes, as described in the validation section below.\n4. Committing your changes (if applicable).\n\n## Conflict resolution policy\n\nThere may be [special notes](template-release-notes.md) that describe special considerations for certain files or scenarios to help you resolve conflicts appropriately.\nAlways refer to that file before proceeding.\nIn particular, focus on the *incoming* part of the file, since it represents the changes from the Library.Template that you are merging into your repo.\n\nAlso consider that some repos choose to reject certain Library.Template patterns.\nFor example the template uses MTPv2 for test projects, but a repo might have chosen not to adopt that.\nWhen resolving merge conflicts, consider whether it looks like the relevant code file is older than it should be given the changes the template is bringing in.\nAsk the user when in doubt as to whether the conflict should be resolved in favor of 'catching up' with the template or keeping the current changes.\n\nUse #runSubagent to analyze and resolve merge conflicts across files in parallel.\n\n### Keep Current files\n\nConflicts in the following files should always be resolved by keeping the current version (i.e. discard incoming changes):\n\n* README.md\n\n### Deleted files\n\nVery typically, when the incoming change is to a file that was deleted locally, the correct resolution is to re-delete the file.\n\nIn some cases however, the deleted file may have incoming changes that should be applied to other files.\nThe `test/Library.Tests/Library.Tests.csproj` file is very typical of this.\nChanges to this file should very typically be applied to any and all test projects in the repo.\nYou are responsible for doing this in addition to re-deleting this template file.\n\n## Updating package and SDK versions\n\nAfter the merge, always check global.json for MSBuild Sdks with names starting with `Microsoft.VisualStudio.Internal.MicroBuild`.\nThese SDK versions should match the value of the `MicroBuildVersion` property found in `Directory.Packages.props`.\nAlways take the latest of the versions you see among these SDKs and the `MicroBuildVersion` property.\n\n## Validation\n\nValidate the merge result (after resolving any conflicts, if applicable).\nUse #runSubagent for each step.\n\n1. Verify that `dotnet restore` succeeds. Fix any issues that come up.\n2. Verify that `dotnet build` succeeds.\n3. Verify that tests succeed by running `tools/dotnet-test-cloud.ps1`.\n\nWhile these validations are described using `dotnet` CLI commands, some repos require using full msbuild.exe.\nYou can detect this by checking the `azure-pipelines/dotnet.yml` or `.github/workflows/build.yml` files for use of one or the other tool.\n\nYou are *not* responsible for fixing issues that the merge did not cause.\nIf validation fails for reasons that seem unrelated to the changes brought in by the merge, advise the user and ask how they'd like you to proceed.\nThat said, sometimes merges will bring in SDK or dependency updates that can cause breaks in seemingly unrelated areas.\nIn such cases, you should investigate and solve the issues as needed.\n\n## Committing your changes\n\nIf you have to make any changes for validations to pass, consider whether they qualify as a bad merge conflict resolution or more of a novel change that you're making to work with the Library.Template update.\nMerge conflict resolution fixes ideally get amended into the merge commit, while novel changes would go into a novel commit after the merge commit.\n\nAlways author your commits using `git commit --author \"🤖 Copilot <no-reply@github.com>\"` (and possibly other parameters).\nDescribe the nature of the merge conflicts you encountered and how you resolved them in your commit message.\n\nLater, if asked to review pull request validation breaks, always author a fresh commit with each fix that you push, unless the user directs you to do otherwise.\n"
  },
  {
    "path": ".github/skills/update-library-template/template-release-notes.md",
    "content": "# Template release notes\n\nThis file will describe significant changes in Library.Template as they are introduced, especially if they require special consideration when merging updates into existing repos.\nThis file is referenced by update-library-template.prompt.md and should remain in place to facilitate future merges, whether done manually or by AI.\n\n## Solution rename\n\nNever leave a Library.slnx file in the repository.\nYou might even see one there even though this particular merge didn't bring it in.\nThis can be an artifact of having renamed Library.sln to Library.slnx in the template repo, but ultimately the receiving repo should have only one .sln or .slnx file, with a better name than `Library`.\nDelete any `Library.slnx` that you see.\nMigrate an `.sln` in the repo root to `.slnx` using this command:\n\n```ps1\ndotnet solution EXISTING.sln migrate\n```\n\nThis will create an EXISTING.slnx file. `git add` that file, then `git rm` the old `.sln` file.\nSometimes a repo will reference the sln filename in a script or doc somewhere.\nSearch the repo for such references and update them to the slnx file.\n"
  },
  {
    "path": ".github/workflows/copilot-setup-steps.yml",
    "content": "name: 💪🏼 Copilot Setup Steps\n\n# Automatically run the setup steps when they are changed to allow for easy validation, and\n# allow manual testing through the repository's \"Actions\" tab\non:\n  workflow_dispatch:\n  push:\n    branches:\n    - main\n    paths:\n    - .github/workflows/copilot-setup-steps.yml\n  pull_request:\n    paths:\n    - .github/workflows/copilot-setup-steps.yml\n\njobs:\n  # The job MUST be called `copilot-setup-steps` or it will not be picked up by Copilot.\n  copilot-setup-steps:\n    runs-on: ubuntu-latest\n    # Set the permissions to the lowest permissions possible needed for your steps.\n    # Copilot will be given its own token for its operations.\n    permissions:\n      # If you want to clone the repository as part of your setup steps, for example to install dependencies, you'll need the `contents: read` permission. If you don't clone the repository in your setup steps, Copilot will do this for you automatically after the steps complete.\n      contents: read\n\n    # You can define any steps you want, and they will run before the agent starts.\n    # If you do not check out your code, Copilot will do this for you.\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      with:\n        fetch-depth: 0 # avoid shallow clone so nbgv can do its work.\n    - name: ⚙ Install prerequisites\n      run: |\n        ./init.ps1 -UpgradePrerequisites -NoNuGetCredProvider\n        dotnet --info\n\n        # Print mono version if it is present.\n        if (Get-Command mono -ErrorAction SilentlyContinue) {\n          mono --version\n        }\n      shell: pwsh\n"
  },
  {
    "path": ".github/workflows/docs.yml",
    "content": "name: 📚 Docs\n\non:\n  push:\n    branches:\n    - main\n\n# Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued.\n# However, do NOT cancel in-progress runs as we want to allow these production deployments to complete.\nconcurrency:\n  group: pages\n  cancel-in-progress: false\n\njobs:\n  publish-docs:\n    # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages\n    permissions:\n      actions: read\n      pages: write\n      id-token: write\n      contents: read\n    environment:\n      name: github-pages\n      url: ${{ steps.deployment.outputs.page_url }}\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      with:\n        fetch-depth: 0 # avoid shallow clone so nbgv can do its work.\n    - name: ⚙ Install prerequisites\n      run: ./init.ps1 -UpgradePrerequisites\n\n    - run: dotnet docfx docfx/docfx.json\n      name: 📚 Generate documentation\n\n    - name: Upload artifact\n      uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0\n      with:\n        path: docfx/_site\n\n    - name: Deploy to GitHub Pages\n      id: deployment\n      uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0\n"
  },
  {
    "path": ".github/workflows/docs_validate.yml",
    "content": "name: 📃 Docfx Validate\n\non:\n  push:\n    branches:\n    - main\n    - microbuild\n  workflow_dispatch:\n\njobs:\n  build:\n    name: 📚 Doc validation\n    runs-on: ubuntu-24.04\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      with:\n        fetch-depth: 0 # avoid shallow clone so nbgv can do its work.\n    - name: 🔗 Markup Link Checker (mlc)\n      uses: becheran/mlc@7ec24825cefe0c9c8c6bac48430e1f69e3ec356e # v1.2.0\n      with:\n        args: --do-not-warn-for-redirect-to https://learn.microsoft.com*,https://dotnet.microsoft.com/*,https://dev.azure.com/*,https://app.codecov.io/* -p docfx -i https://aka.ms/onboardsupport,https://aka.ms/spot,https://msrc.microsoft.com/*,https://www.microsoft.com/msrc*,https://microsoft.com/msrc*,https://www.npmjs.com/package/*,https://get.dot.net/\n    - name: ⚙ Install prerequisites\n      run: |\n        ./init.ps1 -UpgradePrerequisites\n        dotnet --info\n      shell: pwsh\n    - name: 📚 Verify docfx build\n      run: dotnet docfx docfx/docfx.json --warningsAsErrors --disableGitFeatures\n"
  },
  {
    "path": ".github/workflows/libtemplate-update.yml",
    "content": "name: ⛜ Library.Template update\n\n# PREREQUISITE: This workflow requires the repo to be configured to allow workflows to create pull requests.\n# Visit https://github.com/USER/REPO/settings/actions\n# Under \"Workflow permissions\" check \"Allow GitHub Actions to create ...pull requests\"\n# Click Save.\n\non:\n  schedule:\n  - cron: \"0 3 * * Mon\" # Sun @ 8 or 9 PM Mountain Time (depending on DST)\n  workflow_dispatch:\n\njobs:\n  merge:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write\n      pull-requests: write\n    steps:\n    - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2\n      with:\n        fetch-depth: 0 # avoid shallow clone so nbgv can do its work.\n\n    - name: merge\n      id: merge\n      shell: pwsh\n      run: |\n        $LibTemplateBranch = & ./tools/Get-LibTemplateBasis.ps1 -ErrorIfNotRelated\n        if ($LASTEXITCODE -ne 0) {\n          exit $LASTEXITCODE\n        }\n\n        git fetch https://github.com/aarnott/Library.Template $LibTemplateBranch\n        if ($LASTEXITCODE -ne 0) {\n          exit $LASTEXITCODE\n        }\n        $LibTemplateCommit = git rev-parse FETCH_HEAD\n        git diff --stat ...FETCH_HEAD\n\n        if ((git rev-list FETCH_HEAD ^HEAD --count) -eq 0) {\n          Write-Host \"There are no Library.Template updates to merge.\"\n          echo \"uptodate=true\" >> $env:GITHUB_OUTPUT\n          exit 0\n        }\n\n        # Pushing commits that add or change files under .github/workflows will cause our workflow to fail.\n        # But it usually isn't necessary because the target branch already has (or doesn't have) these changes.\n        # So if the merge doesn't bring in any changes to these files, try the merge locally and push that\n        # to keep github happy.\n        if ((git rev-list FETCH_HEAD ^HEAD --count -- .github/workflows) -eq 0) {\n          # Indeed there are no changes in that area. So merge locally to try to appease GitHub.\n          git checkout -b auto/libtemplateUpdate\n          git config user.name \"Andrew Arnott\"\n          git config user.email \"andrewarnott@live.com\"\n          git merge FETCH_HEAD\n          if ($LASTEXITCODE -ne 0) {\n            Write-Host \"Merge conflicts prevent creating the pull request. Please run tools/MergeFrom-Template.ps1 locally and push the result as a pull request.\"\n            exit 2\n          }\n\n          git -c http.extraheader=\"AUTHORIZATION: bearer $env:GH_TOKEN\" push origin -u HEAD\n        } else {\n          Write-Host \"Changes to github workflows are included in this update. Please run tools/MergeFrom-Template.ps1 locally and push the result as a pull request.\"\n          exit 1\n        }\n    - name: pull request\n      shell: pwsh\n      if: success() && steps.merge.outputs.uptodate != 'true'\n      run: |\n        # If there is already an active pull request, don't create a new one.\n        $existingPR = gh pr list -H auto/libtemplateUpdate --json url | ConvertFrom-Json\n        if ($existingPR) {\n          Write-Host \"::warning::Skipping pull request creation because one already exists at $($existingPR[0].url)\"\n          exit 0\n        }\n\n        $prTitle = \"Merge latest Library.Template\"\n        $prBody = \"This merges the latest features and fixes from [Library.Template's  branch](https://github.com/AArnott/Library.Template/tree/).\n\n        ⚠️ Do **not** squash this pull request when completing it. You must *merge* it.\n\n        <details>\n        <summary>Merge conflicts?</summary>\n        Resolve merge conflicts locally by carrying out these steps:\n\n        ```\n        git fetch\n        git checkout auto/libtemplateUpdate\n        git merge origin/main\n        # resolve conflicts\n        git commit\n        git push\n        ```\n        </details>\"\n\n        gh pr create -H auto/libtemplateUpdate -b $prBody -t $prTitle\n      env:\n        GH_TOKEN: ${{ github.token }}\n"
  },
  {
    "path": ".gitignore",
    "content": "## Ignore Visual Studio temporary files, build results, and\n## files generated by popular Visual Studio add-ons.\n##\n## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore\n\n# User-specific files\n*.rsuser\n*.suo\n*.user\n*.userosscache\n*.sln.docstates\n*.lutconfig\nlaunchSettings.json\n\n# User-specific files (MonoDevelop/Xamarin Studio)\n*.userprefs\n\n# Mono auto generated files\nmono_crash.*\n\n# Build results\n[Dd]ebug/\n[Dd]ebugPublic/\n[Rr]elease/\n[Rr]eleases/\nx64/\nx86/\n[Aa][Rr][Mm]/\n[Aa][Rr][Mm]64/\nbld/\n[Bb]in/\n[Oo]bj/\n[Ll]og/\n\n# Visual Studio 2015/2017 cache/options directory\n.vs/\n# Uncomment if you have tasks that create the project's static files in wwwroot\n#wwwroot/\n\n# Jetbrains Rider cache directory\n.idea/\n\n# Visual Studio 2017 auto generated files\nGenerated\\ Files/\n\n# MSTest test Results\n[Tt]est[Rr]esult*/\n[Bb]uild[Ll]og.*\n\n# NUnit\n*.VisualState.xml\nTestResult.xml\nnunit-*.xml\n\n# Build Results of an ATL Project\n[Dd]ebugPS/\n[Rr]eleasePS/\ndlldata.c\n\n# Benchmark Results\nBenchmarkDotNet.Artifacts/\n\n# StyleCop\nStyleCopReport.xml\n\n# Files built by Visual Studio\n*_i.c\n*_p.c\n*_h.h\n*.ilk\n*.meta\n*.obj\n*.iobj\n*.pch\n*.pdb\n*.ipdb\n*.pgc\n*.pgd\n*.rsp\n!Directory.Build.rsp\n*.sbr\n*.tlb\n*.tli\n*.tlh\n*.tmp\n*.tmp_proj\n*_wpftmp.csproj\n*.log\n*.vspscc\n*.vssscc\n.builds\n*.pidb\n*.svclog\n*.scc\n\n# Chutzpah Test files\n_Chutzpah*\n\n# Visual C++ cache files\nipch/\n*.aps\n*.ncb\n*.opendb\n*.opensdf\n*.sdf\n*.cachefile\n*.VC.db\n*.VC.VC.opendb\n\n# Visual Studio profiler\n*.psess\n*.vsp\n*.vspx\n*.sap\n\n# Visual Studio Trace Files\n*.e2e\n\n# TFS 2012 Local Workspace\n$tf/\n\n# Guidance Automation Toolkit\n*.gpState\n\n# ReSharper is a .NET coding add-in\n_ReSharper*/\n*.[Rr]e[Ss]harper\n*.DotSettings.user\n\n# JustCode is a .NET coding add-in\n.JustCode\n\n# TeamCity is a build add-in\n_TeamCity*\n\n# DotCover is a Code Coverage Tool\n*.dotCover\n\n# AxoCover is a Code Coverage Tool\n.axoCover/*\n!.axoCover/settings.json\n\n# Visual Studio code coverage results\n*.coverage\n*.coveragexml\n/coveragereport/\n\n# NCrunch\n_NCrunch_*\n.*crunch*.local.xml\nnCrunchTemp_*\n\n# MightyMoose\n*.mm.*\nAutoTest.Net/\n\n# Web workbench (sass)\n.sass-cache/\n\n# Installshield output folder\n[Ee]xpress/\n\n# DocProject is a documentation generator add-in\nDocProject/buildhelp/\nDocProject/Help/*.HxT\nDocProject/Help/*.HxC\nDocProject/Help/*.hhc\nDocProject/Help/*.hhk\nDocProject/Help/*.hhp\nDocProject/Help/Html2\nDocProject/Help/html\n\n# Click-Once directory\npublish/\n\n# Publish Web Output\n*.[Pp]ublish.xml\n*.azurePubxml\n# Note: Comment the next line if you want to checkin your web deploy settings,\n# but database connection strings (with potential passwords) will be unencrypted\n*.pubxml\n*.publishproj\n\n# Microsoft Azure Web App publish settings. Comment the next line if you want to\n# checkin your Azure Web App publish settings, but sensitive information contained\n# in these scripts will be unencrypted\nPublishScripts/\n\n# NuGet Packages\n*.nupkg\n# NuGet Symbol Packages\n*.snupkg\n# The packages folder can be ignored because of Package Restore\n**/[Pp]ackages/*\n# except build/, which is used as an MSBuild target.\n!**/[Pp]ackages/build/\n# Uncomment if necessary however generally it will be regenerated when needed\n#!**/[Pp]ackages/repositories.config\n# NuGet v3's project.json files produces more ignorable files\n*.nuget.props\n*.nuget.targets\n\n# Microsoft Azure Build Output\ncsx/\n*.build.csdef\n\n# Microsoft Azure Emulator\necf/\nrcf/\n\n# Windows Store app package directories and files\nAppPackages/\nBundleArtifacts/\nPackage.StoreAssociation.xml\n_pkginfo.txt\n*.appx\n*.appxbundle\n*.appxupload\n\n# Visual Studio cache files\n# files ending in .cache can be ignored\n*.[Cc]ache\n# but keep track of directories ending in .cache\n!?*.[Cc]ache/\n\n# Others\nClientBin/\n~$*\n*~\n*.dbmdl\n*.dbproj.schemaview\n*.jfm\n*.pfx\n*.publishsettings\norleans.codegen.cs\n\n# Including strong name files can present a security risk\n# (https://github.com/github/gitignore/pull/2483#issue-259490424)\n#*.snk\n\n# Since there are multiple workflows, uncomment next line to ignore bower_components\n# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)\n#bower_components/\n\n# RIA/Silverlight projects\nGenerated_Code/\n\n# Backup & report files from converting an old project file\n# to a newer Visual Studio version. Backup files are not needed,\n# because we have git ;-)\n_UpgradeReport_Files/\nBackup*/\nUpgradeLog*.XML\nUpgradeLog*.htm\nServiceFabricBackup/\n*.rptproj.bak\n\n# SQL Server files\n*.mdf\n*.ldf\n*.ndf\n\n# Business Intelligence projects\n*.rdl.data\n*.bim.layout\n*.bim_*.settings\n*.rptproj.rsuser\n*- [Bb]ackup.rdl\n*- [Bb]ackup ([0-9]).rdl\n*- [Bb]ackup ([0-9][0-9]).rdl\n\n# Microsoft Fakes\nFakesAssemblies/\n\n# GhostDoc plugin setting file\n*.GhostDoc.xml\n\n# Node.js Tools for Visual Studio\n.ntvs_analysis.dat\nnode_modules/\n\n# Visual Studio 6 build log\n*.plg\n\n# Visual Studio 6 workspace options file\n*.opt\n\n# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)\n*.vbw\n\n# Visual Studio LightSwitch build output\n**/*.HTMLClient/GeneratedArtifacts\n**/*.DesktopClient/GeneratedArtifacts\n**/*.DesktopClient/ModelManifest.xml\n**/*.Server/GeneratedArtifacts\n**/*.Server/ModelManifest.xml\n_Pvt_Extensions\n\n# Paket dependency manager\n.paket/paket.exe\npaket-files/\n\n# FAKE - F# Make\n.fake/\n\n# CodeRush personal settings\n.cr/personal\n\n# Python Tools for Visual Studio (PTVS)\n__pycache__/\n*.pyc\n\n# Cake - Uncomment if you are using it\n# tools/**\n# !tools/packages.config\n\n# Tabs Studio\n*.tss\n\n# Telerik's JustMock configuration file\n*.jmconfig\n\n# BizTalk build output\n*.btp.cs\n*.btm.cs\n*.odx.cs\n*.xsd.cs\n\n# OpenCover UI analysis results\nOpenCover/\n\n# Azure Stream Analytics local run output\nASALocalRun/\n\n# MSBuild Binary and Structured Log\n*.binlog\n\n# NVidia Nsight GPU debugger configuration file\n*.nvuser\n\n# MFractors (Xamarin productivity tool) working folder\n.mfractor/\n\n# Local History for Visual Studio\n.localhistory/\n\n# BeatPulse healthcheck temp database\nhealthchecksdb\n\n# Backup folder for Package Reference Convert tool in Visual Studio 2017\nMigrationBackup/\n\n# dotnet tool local install directory\n.store/\n\n# mac-created file to track user view preferences for a directory\n.DS_Store\n\n# Analysis results\n*.sarif\n\n# C# Dev Kit cache files\n*.lscache\n"
  },
  {
    "path": ".vscode/extensions.json",
    "content": "{\n  // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.\n  // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp\n  // List of extensions which should be recommended for users of this workspace.\n  \"recommendations\": [\n    \"ms-azure-devops.azure-pipelines\",\n    \"ms-dotnettools.csharp\",\n    \"k--kato.docomment\",\n    \"editorconfig.editorconfig\",\n    \"esbenp.prettier-vscode\",\n    \"pflannery.vscode-versionlens\",\n    \"davidanson.vscode-markdownlint\",\n    \"dotjoshjohnson.xml\",\n    \"ms-vscode-remote.remote-containers\",\n    \"ms-azuretools.vscode-docker\",\n    \"tintoy.msbuild-project-tools\"\n  ],\n  // List of extensions recommended by VS Code that should not be recommended for users of this workspace.\n  \"unwantedRecommendations\": []\n}\n"
  },
  {
    "path": ".vscode/launch.json",
    "content": "{\n   // Use IntelliSense to find out which attributes exist for C# debugging\n   // Use hover for the description of the existing attributes\n   // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md\n   \"version\": \"0.2.0\",\n   \"configurations\": [\n        {\n            \"name\": \".NET Core Attach\",\n            \"type\": \"coreclr\",\n            \"request\": \"attach\",\n            \"processId\": \"${command:pickProcess}\"\n        }\n    ]\n}\n"
  },
  {
    "path": ".vscode/mcp.json",
    "content": "{\n    \"servers\": {\n        \"github\": {\n            \"type\": \"http\",\n            \"url\": \"https://api.githubcopilot.com/mcp/\"\n        },\n        \"azure-devops\": {\n            \"type\": \"http\",\n            \"url\": \"https://mcp.dev.azure.com/devdiv\",\n            \"headers\": {\n                \"X-MCP-Toolsets\": \"repos,pipelines,wit,wiki\"\n            }\n        },\n        \"microsoftdocs\": {\n            \"type\": \"http\",\n            \"url\": \"https://learn.microsoft.com/api/mcp\"\n        }\n    }\n}\n"
  },
  {
    "path": ".vscode/settings.json",
    "content": "{\n  \"files.trimTrailingWhitespace\": true,\n  \"files.insertFinalNewline\": true,\n  \"files.trimFinalNewlines\": true,\n  \"azure-pipelines.1ESPipelineTemplatesSchemaFile\": true,\n  \"omnisharp.enableEditorConfigSupport\": true,\n  \"omnisharp.enableRoslynAnalyzers\": true,\n  \"dotnet.completion.showCompletionItemsFromUnimportedNamespaces\": true,\n  \"editor.formatOnSave\": true,\n  \"[xml]\": {\n    \"editor.wordWrap\": \"off\"\n  },\n  // Treat these files as Azure Pipelines files\n  \"files.associations\": {\n    \"**/azure-pipelines/**/*.yml\": \"azure-pipelines\",\n    \"azure-pipelines.yml\": \"azure-pipelines\"\n  },\n  // Use Prettier as the default formatter for Azure Pipelines files.\n  // Needs to be explicitly configured: https://github.com/Microsoft/azure-pipelines-vscode#document-formatting\n  \"[azure-pipelines]\": {\n    \"editor.defaultFormatter\": \"esbenp.prettier-vscode\",\n    \"editor.formatOnSave\": false // enable this when they conform\n  },\n}\n"
  },
  {
    "path": ".vscode/tasks.json",
    "content": "{\n    \"version\": \"2.0.0\",\n    \"tasks\": [\n        {\n            \"label\": \"build\",\n            \"command\": \"dotnet\",\n            \"type\": \"process\",\n            \"args\": [\n                \"build\",\n                \"${workspaceFolder}\",\n                \"/property:GenerateFullPaths=true\",\n                \"/consoleloggerparameters:NoSummary\"\n            ],\n            \"problemMatcher\": \"$msCompile\"\n        }\n    ]\n}\n"
  },
  {
    "path": ".vsts-ci.yml",
    "content": "trigger:\n  branches:\n    include:\n    - main\n  paths:\n    exclude:\n    - .github\n    - doc\n    - '*.md'\nschedules:\n- cron: \"0 10 * * Sun\"\n  displayName: Weekly api-scan\n  always: true\n  branches:\n    include:\n    - main\nparameters:\n- name: RunApiScanTools\n  displayName: Run API Scan?\n  type: boolean\n  default: false\nvariables:\n  NugetSecurityAnalysisWarningLevel: none\n  ${{ if or(eq(parameters.RunApiScanTools, 'true'), eq(variables['Build.CronSchedule.DisplayName'], 'Weekly api-scan')) }}:\n    RunAPIScan: true\n  ${{ else }}:\n    RunAPIScan: false\n  Codeql.Enabled: true\n  Codeql.TSAEnabled: true\n  Codeql.TSAOptionsPath: $(Build.SourcesDirectory)\\azure-pipelines\\TSAOptions.json\n\nresources:\n  repositories:\n  - repository: MicroBuildTemplate\n    type: git\n    name: 1ESPipelineTemplates/MicroBuildTemplate\n    ref: refs/tags/release\nextends:\n  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate\n  parameters:\n    sdl:\n      sourceAnalysisPool:\n        name: VSEngSS-MicroBuild2022-1ES\n        image: server2022-microbuildVS2022-1es\n\n    pool:\n      name: VSEngSS-MicroBuild2022-1ES\n      image: server2022-microbuildVS2022-1es\n      os: windows\n    customBuildTags:\n    - ES365AIMigrationTooling\n    stages:\n    - stage: stage\n      jobs:\n      - job: job\n        templateContext:\n          mb:\n            signing:\n              enabled: true\n              signType: $(SignType)\n              zipSources: false\n          outputs:\n          - output: pipelineArtifact\n            displayName: 'Publish Artifact: build logs'\n            condition: succeededOrFailed()\n            targetPath: $(Build.ArtifactStagingDirectory)/build_logs\n            artifactName: build_logs\n            artifactType: Container\n          - output: pipelineArtifact\n            displayName: 'Publish Artifact: symbols'\n            condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))\n            targetPath: '$(Build.ArtifactStagingDirectory)/symbols'\n            artifactName: symbols\n            publishLocation: Container\n          - output: pipelineArtifact\n            displayName: 'Publish packages'\n            condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))\n            targetPath: $(Build.ArtifactStagingDirectory)/packages\n            artifactName: packages\n            artifactType: Container\n          - output: nuget\n            displayName: 'Publish Sdk NuGet packages to VSTS feeds'\n            condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))\n            packageParentPath: '$(Build.ArtifactStagingDirectory)'\n            searchPatternPush: 'bin/$(BuildConfiguration)/packages/*.nupkg'\n            publishVstsFeed: $(feedGuid)\n            allowPackageConflicts: true\n        steps:\n        - task: ComponentGovernanceComponentDetection@0\n          inputs:\n            scanType: 'Register'\n            verbosity: 'Verbose'\n            alertWarningLevel: 'High'\n        - task: PowerShell@2\n          displayName: Set VSTS variables\n          inputs:\n            targetType: inline\n            script: |\n              if ($env:SignType -eq 'Real') {\n                $feedGuid = '09d8d03c-1ac8-456e-9274-4d2364527d99' ## VSIDE-RealSigned-Release\n              } else {\n                $feedGuid = 'da484c78-f942-44ef-b197-99e2a1bef53c' ## VSIDE-TestSigned-Release\n              }\n              Write-Host \"##vso[task.setvariable variable=feedGuid]$feedGuid\"\n              $SkipPublishingNetworkArtifacts = 'true' ## Network artifacts not allowed on Scale Set Pool\n              Write-Host \"##vso[task.setvariable variable=SkipPublishingNetworkArtifacts]$SkipPublishingNetworkArtifacts\"\n              if ($env:ComputerName.StartsWith('factoryvm', [StringComparison]::OrdinalIgnoreCase)) {\n                Write-Host \"Running on hosted queue\"\n                Write-Host \"##vso[task.setvariable variable=Hosted]true\"\n              }\n        - task: CmdLine@2\n          inputs:\n            script: |\n              del /s /q \"bin\"\n          displayName: Purge bin\n        - task: NuGetToolInstaller@0\n          displayName: Pin nuget.exe version\n          inputs:\n            versionSpec: 6.4.0\n        - task: AntiMalware@4\n          displayName: 'Run MpCmdRun.exe'\n          inputs:\n            InputType: Basic\n            ScanType: CustomScan\n            FileDirPath: '$(Build.StagingDirectory)'\n            DisableRemediation: false\n        - task: NuGetAuthenticate@1\n          displayName: 'NuGet Authenticate'\n          inputs:\n            forceReinstallCredentialProvider: true\n        - task: VSBuild@1\n          inputs:\n            solution: 'src\\SlowCheetah.sln'\n            msbuildArgs: /t:Restore\n            platform: $(BuildPlatform)\n            configuration: $(BuildConfiguration)\n          displayName: Restore SlowCheetah solution\n        - task: VSBuild@1\n          inputs:\n            solution: 'src\\SlowCheetah.sln'\n            msbuildArgs: '/bl:\"$(Build.ArtifactStagingDirectory)/build_logs/slowcheetah.binlog\"'\n            platform: $(BuildPlatform)\n            configuration: $(BuildConfiguration)\n          displayName: Build SlowCheetah solution\n        - task: MicroBuildCodesignVerify@3\n          inputs:\n            TargetFolders: |\n              $(Build.SourcesDirectory)\\bin\\$(BuildConfiguration)\\packages\n            ApprovalListPathForCerts: $(Build.SourcesDirectory)\\src\\build\\no_authenticode.txt\n            ApprovalListPathForSigs: $(Build.SourcesDirectory)\\src\\build\\no_strongname.txt\n          displayName: Verify code signing\n          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))\n        - task: VSTest@2\n          inputs:\n            testFiltercriteria: TestCategory!=FailsInCloudTest\n            searchFolder: $(System.DefaultWorkingDirectory)\\bin\\\n            testAssemblyVer2: |\n              $(BuildConfiguration)\\**\\*test*.dll\n              !**\\obj\\**\n            platform: $(BuildPlatform)\n            configuration: $(BuildConfiguration)\n          displayName: Run Tests\n          condition: and(succeeded(), ne(variables['SignType'], 'real'))\n        - task: PoliCheck@2\n          displayName: 'Run PoliCheck'\n          inputs:\n            targetType: F\n          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))\n        - task: ManifestGeneratorTask@0\n          inputs:\n            BuildDropPath: $(Build.ArtifactStagingDirectory)/build_logs\n        - task: BinSkim@4\n          displayName: Run BinSkim\n          inputs:\n            InputType: 'Basic'\n            Function: 'analyze'\n            TargetPattern: 'guardianGlob'\n            AnalyzeTargetGlob: 'bin/$(BuildConfiguration)/net472/Microsoft.VisualStudio.SlowCheetah*.dll;'\n        - task: CopyFiles@2\n          displayName: 'Copy Files for APIScan'\n          inputs:\n            SourceFolder: 'bin/$(BuildConfiguration)/net472/'\n            Contents: |\n              **/Microsoft.VisualStudio.SlowCheetah*.dll\n              **/Microsoft.VisualStudio.SlowCheetah*.pdb\n            TargetFolder: $(Agent.TempDirectory)\\APIScanFiles\n          condition: and(succeeded(), eq(variables['RunAPIScan'], 'true'))\n        - task: APIScan@2\n          displayName: Run APIScan\n          inputs:\n            softwareFolder: $(Agent.TempDirectory)\\APIScanFiles\n            softwareName: 'Slowcheetah'\n            softwareVersionNum: '$(Build.BuildId)'\n            isLargeApp: false\n            toolVersion: 'Latest'\n          condition: and(succeeded(), eq(variables['RunAPIScan'], 'true'))\n          env:\n            AzureServicesAuthConnectionString: RunAs=App;AppId=$(ApiScanClientId)\n        - task: PublishSecurityAnalysisLogs@3\n          displayName: 'Publish Guardian Artifacts'\n          inputs:\n            ArtifactName: CodeAnalysisLogs\n            ArtifactType: Container\n            PublishProcessedResults: false\n            AllTools: true\n        - task: TSAUpload@2\n          displayName: 'Create bugs for APIScan'\n          inputs:\n            GdnPublishTsaOnboard: true\n            GdnPublishTsaConfigFile: '$(Build.SourcesDirectory)\\azure-pipelines\\TSAOptions.json'\n          condition: eq(variables['RunApiScan'], 'true')\n        - task: CopyFiles@1\n          displayName: Collecting symbols artifacts\n          inputs:\n            SourceFolder: bin/$(BuildConfiguration)/net472\n            Contents: |\n              **/Microsoft.VisualStudio.SlowCheetah?(*.dll|*.pdb|*.xml)\n              !**/*Test*\n            TargetFolder: $(Build.ArtifactStagingDirectory)/symbols\n          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))\n\n        - task: MicroBuildArchiveSymbols@5\n          displayName: 🔣 Archive symbols to Symweb\n          inputs:\n            SymbolsFeatureName: $(SymbolsFeatureName)\n            SymbolsProject: VS\n          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'), eq(variables['SignType'], 'real'))\n        - task: CopyFiles@1\n          displayName: Collecting packages\n          inputs:\n            SourceFolder: bin/$(BuildConfiguration)/packages\n            Contents: |\n              *.nupkg\n              *.vsix\n            TargetFolder: $(Build.ArtifactStagingDirectory)/packages\n            flattenFolders: false\n          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Microsoft Open Source Code of Conduct\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\n\nResources:\n\n- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/)\n- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\n- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Microsoft.VisualStudio.SlowCheetah\n\nThis project welcomes contributions and suggestions. Most contributions require you to\nagree to a Contributor License Agreement (CLA) declaring that you have the right to,\nand actually do, grant us the rights to use your contribution. For details, visit\nhttps://cla.microsoft.com.\n\nThis project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/)\nor contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.\n\n## Pull requests\n\nWhen you submit a pull request, a CLA-bot will automatically determine whether you need\nto provide a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the\ninstructions provided by the bot. You will only need to do this once across all repositories using our CLA.\n## Prerequisites\n\nAll dependencies can be installed by running the `init.ps1` script at the root of the repository\nusing Windows PowerShell or [PowerShell Core][pwsh] (on any OS).\nSome dependencies installed by `init.ps1` may only be discoverable from the same command line environment the init script was run from due to environment variables, so be sure to launch Visual Studio or build the repo from that same environment.\nAlternatively, run `init.ps1 -InstallLocality Machine` (which may require elevation) in order to install dependencies at machine-wide locations so Visual Studio and builds work everywhere.\n\nThe only prerequisite for building, testing, and deploying from this repository\nis the [.NET SDK](https://get.dot.net/).\nYou should install the version specified in `global.json` or a later version within\nthe same major.minor.Bxx \"hundreds\" band.\nFor example if 2.2.300 is specified, you may install 2.2.300, 2.2.301, or 2.2.310\nwhile the 2.2.400 version would not be considered compatible by .NET SDK.\nSee [.NET Core Versioning](https://learn.microsoft.com/dotnet/core/versions/) for more information.\n\n## Package restore\n\nThe easiest way to restore packages may be to run `init.ps1` which automatically authenticates\nto the feeds that packages for this repo come from, if any.\n`dotnet restore` or `nuget restore` also work but may require extra steps to authenticate to any applicable feeds.\n\n## Building\n\nThis repository can be built on Windows, Linux, and OSX.\n\nBuilding, testing, and packing this repository can be done by using the standard dotnet CLI commands (e.g. `dotnet build`, `dotnet test`, `dotnet pack`, etc.).\n\n[pwsh]: https://learn.microsoft.com/powershell/scripting/install/installing-powershell\n\n## Releases\n\nUse `nbgv tag` to create a tag for a particular commit that you mean to release.\n[Learn more about `nbgv` and its `tag` and `prepare-release` commands](https://dotnet.github.io/Nerdbank.GitVersioning/docs/nbgv-cli.html).\n\nPush the tag.\n\n### GitHub Actions\n\nWhen your repo is hosted by GitHub and you are using GitHub Actions, you should create a GitHub Release using the standard GitHub UI.\nHaving previously used `nbgv tag` and pushing the tag will help you identify the precise commit and name to use for this release.\n\nAfter publishing the release, the `.github/workflows/release.yml` workflow will be automatically triggered, which will:\n\n1. Find the most recent `.github/workflows/build.yml` GitHub workflow run of the tagged release.\n1. Upload the `deployables` artifact from that workflow run to your GitHub Release.\n1. If you have `NUGET_API_KEY` defined as a secret variable for your repo or org, any nuget packages in the `deployables` artifact will be pushed to nuget.org.\n\n### Azure Pipelines\n\nWhen your repo builds with Azure Pipelines, use the `azure-pipelines/release.yml` pipeline.\nTrigger the pipeline by adding the `auto-release` tag on a run of your main `azure-pipelines.yml` pipeline.\n\n## Tutorial and API documentation\n\nAPI and hand-written docs are found under the `docfx/` directory and are built by [docfx](https://dotnet.github.io/docfx/).\n\nYou can make changes and host the site locally to preview them by switching to that directory and running the `dotnet docfx --serve` command.\nAfter making a change, you can rebuild the docs site while the localhost server is running by running `dotnet docfx` again from a separate terminal.\n\nThe `.github/workflows/docs.yml` GitHub Actions workflow publishes the content of these docs to github.io if the workflow itself and [GitHub Pages is enabled for your repository](https://docs.github.com/en/pages/quickstart).\n\n## Updating dependencies\n\nThis repo uses Renovate to keep dependencies current.\nConfiguration is in the `.github/renovate.json` file.\n[Learn more about configuring Renovate](https://docs.renovatebot.com/configuration-options/).\n\nWhen changing the renovate.json file, follow [these validation steps](https://docs.renovatebot.com/config-validation/).\n\nIf Renovate is not creating pull requests when you expect it to, check that the [Renovate GitHub App](https://github.com/apps/renovate) is configured for your account or repo.\n\n## Merging latest from Library.Template\n\n### Maintaining your repo based on this template\n\nThe best way to keep your repo in sync with Library.Template's evolving features and best practices is to periodically merge the template into your repo:\n\n```ps1\ngit fetch\ngit checkout origin/main\n./tools/MergeFrom-Template.ps1\n# resolve any conflicts, then commit the merge commit.\ngit push origin -u HEAD\n```\n"
  },
  {
    "path": "CodeQL.yml",
    "content": "path_classifiers:\n  library:\n    - 'test/**'\n"
  },
  {
    "path": "Directory.Build.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <RepoRootPath>$(MSBuildThisFileDirectory)</RepoRootPath>\n    <BaseIntermediateOutputPath>$(RepoRootPath)obj\\$([MSBuild]::MakeRelative($(RepoRootPath), $(MSBuildProjectDirectory)))\\</BaseIntermediateOutputPath>\n    <BaseOutputPath Condition=\" '$(BaseOutputPath)' == '' \">$(RepoRootPath)bin\\$(MSBuildProjectName)\\</BaseOutputPath>\n    <PackageOutputPath>$(RepoRootPath)bin\\Packages\\$(Configuration)\\NuGet\\</PackageOutputPath>\n    <VSIXOutputPath>$(RepoRootPath)bin\\Packages\\$(Configuration)\\Vsix\\$(Platform)\\</VSIXOutputPath>\n    <VSIXOutputPath Condition=\"'$(Platform)'=='' or '$(Platform)'=='AnyCPU'\">$(RepoRootPath)bin\\Packages\\$(Configuration)\\Vsix\\</VSIXOutputPath>\n    <SBOMFileDestPath>$(VSIXOutputPath)</SBOMFileDestPath>\n    <Nullable>enable</Nullable>\n    <ImplicitUsings>enable</ImplicitUsings>\n    <AnalysisLevel>latest</AnalysisLevel>\n    <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>\n    <GenerateDocumentationFile>true</GenerateDocumentationFile>\n    <ProduceReferenceAssembly>true</ProduceReferenceAssembly>\n    <RestoreEnablePackagePruning>true</RestoreEnablePackagePruning>\n\n    <!-- https://learn.microsoft.com/en-us/dotnet/fundamentals/apicompat/package-validation/overview -->\n    <EnablePackageValidation>true</EnablePackageValidation>\n\n    <!-- https://github.com/dotnet/msbuild/blob/main/documentation/ProjectReference-Protocol.md#setplatform-negotiation -->\n    <EnableDynamicPlatformResolution>true</EnableDynamicPlatformResolution>\n\n    <!-- Opt in till https://github.com/NuGet/Home/issues/9803 makes this the default. -->\n    <RestoreUseStaticGraphEvaluation>true</RestoreUseStaticGraphEvaluation>\n\n    <!-- This entire repo has just one version.json file, so compute the version once and share with all projects in a large build. -->\n    <GitVersionBaseDirectory>$(MSBuildThisFileDirectory)</GitVersionBaseDirectory>\n\n    <!-- Local builds should embed PDBs so we never lose them when a subsequent build occurs. -->\n    <DebugType Condition=\" '$(CI)' != 'true' and '$(TF_BUILD)' != 'true' \">embedded</DebugType>\n\n    <PackageProjectUrl>https://github.com/microsoft/slow-cheetah</PackageProjectUrl>\n    <Company>Microsoft</Company>\n    <Authors>Microsoft</Authors>\n    <Copyright>© Microsoft Corporation. All rights reserved.</Copyright>\n    <PackageLicenseExpression>MIT</PackageLicenseExpression>\n    <PublishRepositoryUrl>true</PublishRepositoryUrl>\n    <EmbedUntrackedSources>true</EmbedUntrackedSources>\n    <IncludeSymbols Condition=\" '$(DebugType)' != 'embedded' \">true</IncludeSymbols>\n    <SymbolPackageFormat>snupkg</SymbolPackageFormat>\n  </PropertyGroup>\n\n  <PropertyGroup>\n    <LangVersion Condition=\"'$(MSBuildProjectExtension)'=='.csproj'\">14</LangVersion>\n    <LangVersion Condition=\"'$(MSBuildProjectExtension)'=='.vbproj'\">16.9</LangVersion>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <None Include=\"$(RepoRootPath)obj/NOTICE\" Pack=\"true\" PackagePath=\"\" Visible=\"false\" Condition=\" Exists('$(RepoRootPath)obj/NOTICE') \" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <AdditionalFiles Include=\"$(MSBuildThisFileDirectory)stylecop.json\" Link=\"stylecop.json\" />\n  </ItemGroup>\n\n  <ItemDefinitionGroup>\n    <!-- We always want MSBuild properties generated that point at the restored location of each package. -->\n    <PackageReference GeneratePathProperty=\"true\" />\n  </ItemDefinitionGroup>\n\n  <Target Name=\"PrepareReleaseNotes\" BeforeTargets=\"GenerateNuspec\" DependsOnTargets=\"GetBuildVersion\">\n    <PropertyGroup>\n      <PackageReleaseNotes Condition=\"'$(RepositoryUrl)'!=''\">$(RepositoryUrl)/releases/tag/v$(Version)</PackageReleaseNotes>\n    </PropertyGroup>\n  </Target>\n\n  <Import Project=\"azure-pipelines\\NuGetSbom.props\" />\n</Project>\n"
  },
  {
    "path": "Directory.Build.rsp",
    "content": "#------------------------------------------------------------------------------\n# This file contains command-line options that MSBuild will process as part of\n# every build, unless the \"/noautoresponse\" switch is specified.\n#\n# MSBuild processes the options in this file first, before processing the\n# options on the command line. As a result, options on the command line can\n# override the options in this file. However, depending on the options being\n# set, the overriding can also result in conflicts.\n#\n# NOTE: The \"/noautoresponse\" switch cannot be specified in this file, nor in\n# any response file that is referenced by this file.\n#------------------------------------------------------------------------------\n/nr:false\n/m\n/verbosity:minimal\n/clp:Summary;ForceNoAlign\n"
  },
  {
    "path": "Directory.Build.targets",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <ItemGroup>\n    <!-- Avoid compile error about missing namespace when combining ImplicitUsings with .NET Framework target frameworks. -->\n    <Using Remove=\"System.Net.Http\" Condition=\"'$(TargetFrameworkIdentifier)'=='.NETFramework'\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "Directory.Packages.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <!-- https://learn.microsoft.com/nuget/consume-packages/central-package-management -->\n  <PropertyGroup>\n    <ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>\n    <CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>\n    <MicrosoftTestingPlatformVersion>2.2.2</MicrosoftTestingPlatformVersion>\n\n    <MicroBuildVersion>2.0.226</MicroBuildVersion>\n  </PropertyGroup>\n  <ItemGroup>\n    <PackageVersion Include=\"Microsoft.IO.Redist\" Version=\"6.0.1\" />\n    <PackageVersion Include=\"Microsoft.NET.Test.Sdk\" Version=\"17.11.1\" />\n    <PackageVersion Include=\"xunit.runner.visualstudio\" Version=\"2.8.2\" />\n    <PackageVersion Include=\"xunit\" Version=\"2.9.2\" />\n    <PackageVersion Include=\"Microsoft.VisualStudio.SDK\" Version=\"17.5.33428.388\" />\n    <PackageVersion Include=\"Microsoft.Web.Xdt\" Version=\"3.1.0\" />\n    <PackageVersion Include=\"Microsoft.VisualStudio.Jdt\" Version=\"0.9.63\" />\n    <PackageVersion Include=\"NuGet.VisualStudio\" Version=\"17.6.0\" />\n    <PackageVersion Include=\"Microsoft.VSSDK.BuildTools\" Version=\"17.6.2164\" />\n    <PackageVersion Include=\"EnvDTE\" Version=\"17.6.36389\" />\n    <PackageVersion Include=\"Microsoft.Build.Utilities.Core\" Version=\"17.12.50\" />\n    <PackageVersion Include=\"MessagePack\" Version=\"2.5.187\" />\n    <PackageVersion Include=\"System.Text.Json\" Version=\"8.0.5\" />\n  </ItemGroup>\n  <ItemGroup Label=\"Library.Template\">\n    <PackageVersion Include=\"Microsoft.Testing.Extensions.CodeCoverage\" Version=\"18.6.2\" />\n    <PackageVersion Include=\"Microsoft.Testing.Extensions.CrashDump\" Version=\"$(MicrosoftTestingPlatformVersion)\" />\n    <PackageVersion Include=\"Microsoft.Testing.Extensions.HangDump\" Version=\"$(MicrosoftTestingPlatformVersion)\" />\n    <PackageVersion Include=\"Microsoft.Testing.Extensions.TrxReport\" Version=\"$(MicrosoftTestingPlatformVersion)\" />\n    <PackageVersion Include=\"Microsoft.VisualStudio.Internal.MicroBuild.NonShipping\" Version=\"$(MicroBuildVersion)\" />\n    <PackageVersion Include=\"xunit.v3.mtp-v2\" Version=\"3.2.2\" />\n  </ItemGroup>\n  <ItemGroup>\n    <!-- Put repo-specific GlobalPackageReference items in this group. -->\n  </ItemGroup>\n  <ItemGroup Label=\"Library.Template\">\n    <GlobalPackageReference Include=\"CSharpIsNullAnalyzer\" Version=\"0.1.593\" />\n    <GlobalPackageReference Include=\"DotNetAnalyzers.DocumentationAnalyzers\" Version=\"1.0.0-beta.59\" />\n    <GlobalPackageReference Include=\"Microsoft.VisualStudio.Internal.MicroBuild.VisualStudio\" Version=\"$(MicroBuildVersion)\" />\n    <!-- The condition works around https://github.com/dotnet/sdk/issues/44951 -->\n    <GlobalPackageReference Include=\"Nerdbank.GitVersioning\" Version=\"3.9.50\" Condition=\"!('$(TF_BUILD)'=='true' and '$(dotnetformat)'=='true')\" />\n    <GlobalPackageReference Include=\"PolySharp\" Version=\"1.15.0\" />\n    <GlobalPackageReference Include=\"StyleCop.Analyzers.Unstable\" Version=\"1.2.0.556\" />\n    <!--<GlobalPackageReference Include=\"StyleCop.Analyzers\" Version=\"1.1.118\" />-->\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "LICENSE",
    "content": "Microsoft.VisualStudio.SlowCheetah\nCopyright (c) Microsoft Corporation\nAll rights reserved.\n\nMIT License\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# slow-cheetah\n[![NuGet package](https://img.shields.io/nuget/v/Microsoft.VisualStudio.SlowCheetah.svg)](https://nuget.org/packages/Microsoft.VisualStudio.SlowCheetah)\n[![Build status](https://ci.appveyor.com/api/projects/status/qqvu367widkayo05/branch/master?svg=true)](https://ci.appveyor.com/project/jviau/slow-cheetah/branch/master)\n\nTransformations for XML files (such as app.config) and JSON files.\n\nIncludes two primary components:\n1. NuGet package that adds an msbuild task to perform transforms on build.\n2. Visual Studio extension for generating and previewing transforms.\n\nThis project has adopted the [Microsoft Open Source Code of\nConduct](https://opensource.microsoft.com/codeofconduct/).\nFor more information see the [Code of Conduct\nFAQ](https://opensource.microsoft.com/codeofconduct/faq/) or\ncontact [opencode@microsoft.com](mailto:opencode@microsoft.com)\nwith any additional questions or comments.\n\n## Supported Platforms\n* Visual Studio 2022: [SlowCheetah VS 2022 Extension](https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms-VS2022) (version 4.x)\n* Visual Studio 2015-2019: [SlowCheetah VS 2015-2019 Extension](https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.SlowCheetah-XMLTransforms) (version 3.x)\n\n## Supported File Types\n\nSlowCheetah supports transformations for XML files, specified by [XDT](https://msdn.microsoft.com/en-us/library/dd465326(v=vs.110).aspx) and for JSON files, specified by [JDT](https://github.com/Microsoft/json-document-transforms). Transform files created by the extension follow these formats.\n\n## Features\n\nPerform transformations of XML and JSON files on build per configuration and publish profiles.\n\nQuickly add and preview transformations to a file in the project.\n\n## [How to Perform Transformations](doc/transforming_files.md)\n\n## Trademarks\n\nThis project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft trademarks or logos is subject to and must follow [Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/legal/intellectualproperty/trademarks/usage/general). Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. Any use of third-party trademarks or logos are subject to those third-party's policies.\n"
  },
  {
    "path": "Restore.cmd",
    "content": "@echo off\nWHERE /q msbuild\nIF ERRORLEVEL 1 (\n    ECHO Error: Could not find msbuild. Make sure msbuild is in the PATH and try again.\n    EXIT /B %ERRORLEVEL%\n)\nmsbuild /t:restore %~dp0\\src\\SlowCheetah.sln"
  },
  {
    "path": "SECURITY.md",
    "content": "<!-- BEGIN MICROSOFT SECURITY.MD V0.0.5 BLOCK -->\n\n## Security\n\nMicrosoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/).\n\nIf you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://learn.microsoft.com/previous-versions/tn-archive/cc751383(v=technet.10)), please report it to us as described below.\n\n## Reporting Security Issues\n\n**Please do not report security vulnerabilities through public GitHub issues.**\n\nInstead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report).\n\nIf you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com).  If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/msrc/pgp-key-msrc).\n\nYou should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc).\n\nPlease include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue:\n\n  * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.)\n  * Full paths of source file(s) related to the manifestation of the issue\n  * The location of the affected source code (tag/branch/commit or direct URL)\n  * Any special configuration required to reproduce the issue\n  * Step-by-step instructions to reproduce the issue\n  * Proof-of-concept or exploit code (if possible)\n  * Impact of the issue, including how an attacker might exploit the issue\n\nThis information will help us triage your report more quickly.\n\nIf you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs.\n\n## Preferred Languages\n\nWe prefer all communications to be in English.\n\n## Policy\n\nMicrosoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/msrc/cvd).\n\n<!-- END MICROSOFT SECURITY.MD BLOCK -->\n"
  },
  {
    "path": "SUPPORT.md",
    "content": "# Support\n\n## How to file issues and get help\n\nThis project uses GitHub Issues to track bugs and feature requests.\nPlease search the existing issues before filing new issues to avoid duplicates.\nFor new issues, file your bug or feature request as a new Issue.\n\nFor help and questions about using this project, please create an issue.\n\n## Microsoft Support Policy\n\nSupport for this **slow-cheetah** is limited to the resources listed above.\n"
  },
  {
    "path": "ThirdPartyNotices.txt",
    "content": "NOTICES AND INFORMATION\nDo Not Translate or Localize\n\nThis software incorporates material from third parties.\nMicrosoft makes certain open source code available at https://3rdpartysource.microsoft.com,\nor you may send a check or money order for US $5.00, including the product name,\nthe open source component name, platform, and version number, to:\n\nSource Code Compliance Team\nMicrosoft Corporation\nOne Microsoft Way\nRedmond, WA 98052\nUSA\n\nNotwithstanding any other terms, you may reverse engineer this software to the extent\nrequired to debug changes to any libraries licensed under the GNU Lesser General Public License.\n\n---------------------------------------------------------\n\nStyleCop.Analyzers 1.0.0 - Apache-2.0\n\n\nCopyright Sam Harwell 2015\nCopyright James Newton-King 2008\nGetCopyrightText copyrightText WithDocumentText\ncopyrightText CircularReference InvalidReference\nCopyright Sam Harwell 2015 StyleCop DotNetAnalyzers Roslyn Diagnostic Analyzer\n\nApache License\n\nVersion 2.0, January 2004\n\nhttp://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \n\n      \"License\" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.\n\n      \n\n      \"Licensor\" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.\n\n      \n\n      \"Legal Entity\" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, \"control\" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity exercising permissions granted by this License.\n\n      \n\n      \"Source\" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.\n\n      \n\n      \"Object\" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.\n\n      \n\n      \"Work\" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).\n\n      \n\n      \"Derivative Works\" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.\n\n      \n\n      \"Contribution\" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, \"submitted\" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:\n\n      (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS\n\nAPPENDIX: How to apply the Apache License to your work.\n\nTo apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets \"[]\" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same \"printed page\" as the copyright notice for easier identification within third-party archives.\n\nCopyright [yyyy] [name of copyright owner]\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\n\nyou may not use this file except in compliance with the License.\n\nYou may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\n\ndistributed under the License is distributed on an \"AS IS\" BASIS,\n\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\nSee the License for the specific language governing permissions and\n\nlimitations under the License.\n\n---------------------------------------------------------"
  },
  {
    "path": "appveyor.yml",
    "content": "# Notes:\n#   - Minimal appveyor.yml file is an empty file. All sections are optional.\n#   - Indent each level of configuration with 2 spaces. Do not use tabs!\n#   - All section names are case-sensitive.\n#   - Section names should be unique on each level.\n\n#---------------------------------#\n#      general configuration      #\n#---------------------------------#\n\n# version format\nversion: 1.0.{build}\n\n#---------------------------------#\n#    environment configuration    #\n#---------------------------------#\n# Build worker image (VM template)\nimage: Visual Studio 2017\n\nskip_tags: true\nbranches:\n  only:\n  - master\n\nenvironment:\n  DeployExtension: false\n  Package: true\n\ncache:\n- packages -> **\\packages.config\n\nconfiguration: Release\n\n#---------------------------------#\n#       build configuration       #\n#---------------------------------#\n\nbefore_build:\n  nuget restore src\n\nbuild:\n  project: src\\SlowCheetah.sln  # path to Visual Studio solution or project\n  verbosity: normal             # MSBuild verbosity level\n\n#---------------------------------#\n#       test configuration        #\n#---------------------------------#\n\ntest:\n  assemblies:\n  - '**\\*tests.dll'\n\n#---------------------------------#\n#     artifact configuration      #\n#---------------------------------#\n\nartifacts:\n- path: 'bin\\**\\packages\\Microsoft.VisualStudio.SlowCheetah*.nupkg'\n  name: Nuget Package\n- path: 'bin\\**\\packages\\Microsoft.VisualStudio.SlowCheetah*.vsix'\n  name: VSIX Package\n"
  },
  {
    "path": "azure-pipelines/Archive-SourceCode.ps1",
    "content": "#Requires -PSEdition Core -Version 7\n<#\n.SYNOPSIS\n    Submits a source archival request for this repo.\n.PARAMETER Requester\n    The alias for the user requesting this backup.\n.PARAMETER ManagerAlias\n    The alias of the manager that owns the repo.\n.PARAMETER TeamAlias\n    The alias of the team that owns the repo.\n.PARAMETER BusinessGroupName\n    A human-readable title for your team or business group.\n.PARAMETER ProductionType\n.PARAMETER ReleaseType\n    The type of release being backed up.\n.PARAMETER ReleaseDate\n    The date of the release of your software. Defaults to today.\n.PARAMETER OwnerAlias\n    The alias of the owner.\n.PARAMETER OS\n.PARAMETER ProductLanguage\n    One or more languages.\n.PARAMETER Notes\n    Any notes to record with the backup.\n.PARAMETER FileCollection\n    One or more collections to archive.\n.PARAMETER ProductName\n    The name of the product. This will default to the repository name.\n.PARAMETER RepoUrl\n    The URL to the repository. This will default to the repository containing this script.\n.PARAMETER BackupType\n    The kind of backup to be performed.\n.PARAMETER ServerPath\n    The UNC path to the server to be backed up (if applicable).\n.PARAMETER SourceCodeArchivalUri\n    The URI to POST the source code archival request to.\n    This value will typically come automatically by a variable group associated with your pipeline.\n    You can also look it up at https://dpsopsrequestforms.azurewebsites.net/#/help -> SCA Request Help -> SCA API Help -> Description\n#>\n[CmdletBinding(SupportsShouldProcess = $true, PositionalBinding = $false)]\nparam (\n    [Parameter()]\n    [string]$Requester,\n    [Parameter(Mandatory = $true)]\n    [string]$ManagerAlias,\n    [Parameter(Mandatory = $true)]\n    [string]$TeamAlias,\n    [Parameter(Mandatory = $true)]\n    [string]$BusinessGroupName,\n    [Parameter()]\n    [string]$ProductionType = 'Visual Studio',\n    [Parameter()]\n    [string]$ReleaseType = 'RTW',\n    [Parameter()]\n    [DateTime]$ReleaseDate = [DateTime]::Today,\n    [Parameter()]\n    [string]$OwnerAlias,\n    [Parameter()]\n    [ValidateSet('64-Bit Win', '32-Bit Win', 'Linux', 'Mac', '64-Bit ARM', '32-Bit ARM')]\n    [string[]]$OS = @('64-Bit Win'),\n    [Parameter(Mandatory = $true)]\n    [ValidateSet('English', 'Chinese Simplified', 'Chinese Traditional', 'Czech', 'French', 'German', 'Italian', 'Japanese', 'Korean', 'Polish', 'Portuguese', 'Russian', 'Spanish', 'Turkish')]\n    [string[]]$ProductLanguage,\n    [Parameter()]\n    [string]$Notes = '',\n    [Parameter()]\n    [ValidateSet('Binaries', 'Localization', 'Source Code')]\n    [string[]]$FileCollection = @('Source Code'),\n    [Parameter()]\n    [string]$ProductName,\n    [Parameter()]\n    [Uri]$RepoUrl,\n    [Parameter()]\n    [ValidateSet('Server Path', 'Code Repo(Git URL/AzureDevOps)', 'Git', 'Azure Storage Account')]\n    [string]$BackupType = 'Code Repo(Git URL/AzureDevOps)',\n    [Parameter()]\n    [string]$ServerPath = '',\n    [Parameter()]\n    [Uri]$SourceCodeArchivalUri = $env:SOURCECODEARCHIVALURI,\n    [Parameter(Mandatory = $true)]\n    [string]$AccessToken\n)\n\nfunction Invoke-Git() {\n    # Make sure we invoke git from within the repo.\n    Push-Location $PSScriptRoot\n    try {\n        return (git $args)\n    }\n    finally {\n        Pop-Location\n    }\n}\n\nif (!$ProductName) {\n    if ($env:BUILD_REPOSITORY_NAME) {\n        Write-Verbose 'Using $env:BUILD_REPOSITORY_NAME for ProductName.' # single quotes are intentional so user sees the name of env var.\n        $ProductName = $env:BUILD_REPOSITORY_NAME\n    }\n    else {\n        $originUrl = [Uri](Invoke-Git remote get-url origin)\n        if ($originUrl) {\n            $lastPathSegment = $originUrl.Segments[$originUrl.Segments.Length - 1]\n            if ($lastPathSegment.EndsWith('.git')) {\n                $lastPathSegment = $lastPathSegment.Substring(0, $lastPathSegment.Length - '.git'.Length)\n            }\n            Write-Verbose 'Using origin remote URL to derive ProductName.'\n            $ProductName = $lastPathSegment\n        }\n    }\n\n    if (!$ProductName) {\n        Write-Error \"Unable to determine default value for -ProductName.\"\n    }\n}\n\nif (!$OwnerAlias) {\n    if ($env:BUILD_REQUESTEDFOREMAIL) {\n        Write-Verbose 'Using $env:BUILD_REQUESTEDFOREMAIL and slicing to just the alias for OwnerAlias.'\n        $OwnerAlias = ($env:BUILD_REQUESTEDFOREMAIL -split '@')[0]\n    } else {\n        $OwnerAlias = $TeamAlias\n    }\n\n    if (!$OwnerAlias) {\n        Write-Error \"Unable to determine default value for -OwnerAlias.\"\n    }\n}\n\nif (!$Requester) {\n    if ($env:BUILD_REQUESTEDFOREMAIL) {\n        Write-Verbose 'Using $env:BUILD_REQUESTEDFOREMAIL and slicing to just the alias for Requester.'\n        $Requester = ($env:BUILD_REQUESTEDFOREMAIL -split '@')[0]\n    }\n    else {\n        Write-Verbose 'Using $env:USERNAME for Requester.'\n        $Requester = $env:USERNAME\n    }\n    if (!$Requester) {\n        $Requester = $OwnerAlias\n    }\n}\n\nif (!$RepoUrl) {\n    $RepoUrl = $env:BUILD_REPOSITORY_URI\n    if (!$RepoUrl) {\n        $originUrl = [Uri](Invoke-Git remote get-url origin)\n        if ($originUrl) {\n            Write-Verbose 'Using git origin remote url for GitURL.'\n            $RepoUrl = $originUrl\n        }\n\n        if (!$RepoUrl) {\n            Write-Error \"Unable to determine default value for -RepoUrl.\"\n        }\n    }\n}\n\nPush-Location $PSScriptRoot\n$versionsObj = dotnet nbgv get-version -f json | ConvertFrom-Json\nPop-Location\n\n$ReleaseDateString = $ReleaseDate.ToShortDateString()\n$Version = $versionsObj.Version\n\n$BackupSize = Get-ChildItem $PSScriptRoot\\..\\.git -Recurse -File | Measure-Object -Property Length -Sum\n$DataSizeMB = [int]($BackupSize.Sum / 1mb)\n$FileCount = $BackupSize.Count\n\n$Request = @{\n    \"Requester\"                  = $Requester\n    \"Manager\"                    = $ManagerAlias\n    \"TeamAlias\"                  = $TeamAlias\n    \"AdditionalContacts\"         = $AdditionalContacts\n    \"BusinessGroupName\"          = $BusinessGroupName\n    \"ProductName\"                = $ProductName\n    \"Version\"                    = $Version\n    \"ProductionType\"             = $ProductionType\n    \"ReleaseType\"                = $ReleaseType\n    \"ReleaseDateString\"          = $ReleaseDateString\n    \"OS\"                         = [string]::Join(',', $OS)\n    \"ProductLanguage\"            = [string]::Join(',', $ProductLanguage)\n    \"FileCollection\"             = [string]::Join(',', $FileCollection)\n    \"OwnerAlias\"                 = $OwnerAlias\n    \"Notes\"                      = $Notes.Trim()\n    \"CustomerProvidedDataSizeMB\" = $DataSizeMB\n    \"CustomerProvidedFileCount\"  = $FileCount\n    \"BackupType\"                 = $BackupType\n    \"ServerPath\"                 = $ServerPath\n    \"AzureStorageAccount\"        = $AzureStorageAccount\n    \"AzureStorageContainer\"      = $AzureStorageContainer\n    \"GitURL\"                     = $RepoUrl\n}\n\n$RequestJson = ConvertTo-Json $Request\nWrite-Host \"SCA request:`n$RequestJson\"\n\nif ($PSCmdlet.ShouldProcess('source archival request', 'post')) {\n    if (!$SourceCodeArchivalUri) {\n        Write-Error \"Unable to post request without -SourceCodeArchivalUri parameter.\"\n        exit 1\n    }\n\n    $headers = @{\n        'Authorization' = \"Bearer $AccessToken\"\n    }\n\n    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n\n    $Response = Invoke-WebRequest -Uri $SourceCodeArchivalUri -Method POST -Headers $headers -Body $RequestJson -ContentType \"application/json\" -UseBasicParsing -SkipHttpErrorCheck\n    Write-Host \"Status Code : \" -NoNewline\n    if ($Response.StatusCode -eq 200) {\n        Write-Host $Response.StatusCode -ForegroundColor Green\n        Write-Host \"Ticket ID   : \" -NoNewline\n        $responseContent = ConvertFrom-Json ($Response.Content)\n        Write-Host $responseContent\n    }\n    else {\n        Write-Host $Response.StatusCode -ForegroundColor Red\n        try {\n            $responseContent = ConvertFrom-Json $Response.Content\n            Write-Host \"Message     : $($responseContent.message)\"\n        }\n        catch {\n            Write-Host \"JSON Parse Error: $($_.Exception.Message)\"\n            Write-Host \"Raw response content:\"\n            Write-Host $Response.Content\n        }\n\n        exit 2\n    }\n} elseif ($SourceCodeArchivalUri) {\n    Write-Host \"Would have posted to $SourceCodeArchivalUri\"\n}\n"
  },
  {
    "path": "azure-pipelines/BuildStageVariables.yml",
    "content": "variables:\n  DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true\n  BuildConfiguration: Release\n  NUGET_PACKAGES: $(Agent.TempDirectory)/.nuget/packages/\n"
  },
  {
    "path": "azure-pipelines/Get-InsertionPRId.ps1",
    "content": "<#\n.SYNOPSIS\n    Look up the pull request URL of the insertion PR.\n#>\n$stagingFolder = $env:BUILD_STAGINGDIRECTORY\nif (!$stagingFolder) {\n    $stagingFolder = $env:SYSTEM_DEFAULTWORKINGDIRECTORY\n    if (!$stagingFolder) {\n        Write-Error \"This script must be run in an Azure Pipeline.\"\n        exit 1\n    }\n}\n$markdownFolder = Join-Path $stagingFolder (Join-Path 'MicroBuild' 'Output')\n$markdownFile = Join-Path $markdownFolder 'PullRequestUrl.md'\nif (!(Test-Path $markdownFile)) {\n    Write-Error \"This script should be run after the MicroBuildInsertVsPayload task.\"\n    exit 2\n}\n\n$insertionPRUrl = Get-Content $markdownFile\nif (!($insertionPRUrl -match 'https:.+?/pullrequest/(\\d+)')) {\n    Write-Error \"Failed to parse pull request URL: $insertionPRUrl\"\n    exit 3\n}\n\n$Matches[1]\n"
  },
  {
    "path": "azure-pipelines/GlobalVariables.yml",
    "content": "variables:\n  # These variables are required for MicroBuild tasks\n  TeamName: VS IDE\n  TeamEmail: vsidemicrobuild@microsoft.com\n  # These variables influence insertion pipelines\n  ContainsVsix: false # This should be true when the repo builds a VSIX that should be inserted to VS.\n"
  },
  {
    "path": "azure-pipelines/Merge-CodeCoverage.ps1",
    "content": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n    Merges code coverage reports.\n.PARAMETER Path\n    The path(s) to search for Cobertura code coverage reports.\n.PARAMETER Format\n    The format for the merged result. The default is Cobertura\n.PARAMETER OutputDir\n    The directory the merged result will be written to. The default is `coveragereport` in the root of this repo.\n#>\n[CmdletBinding()]\nParam(\n    [Parameter(Mandatory=$true)]\n    [string[]]$Path,\n    [ValidateSet('Badges', 'Clover', 'Cobertura', 'CsvSummary', 'Html', 'Html_Dark', 'Html_Light', 'HtmlChart', 'HtmlInline', 'HtmlInline_AzurePipelines', 'HtmlInline_AzurePipelines_Dark', 'HtmlInline_AzurePipelines_Light', 'HtmlSummary', 'JsonSummary', 'Latex', 'LatexSummary', 'lcov', 'MarkdownSummary', 'MHtml', 'PngChart', 'SonarQube', 'TeamCitySummary', 'TextSummary', 'Xml', 'XmlSummary')]\n    [string]$Format='Cobertura',\n    [string]$OutputFile=(\"$PSScriptRoot/../coveragereport/merged.cobertura.xml\")\n)\n\n$RepoRoot = [string](Resolve-Path $PSScriptRoot/..)\nPush-Location $RepoRoot\ntry {\n    Write-Verbose \"Searching $Path for *.cobertura.xml files\"\n    $reports = Get-ChildItem -Recurse $Path -Filter *.cobertura.xml\n\n    if ($reports) {\n        $reports |% { $_.FullName } |% {\n            # In addition to replacing {reporoot}, we also normalize on one kind of slash so that the report aggregates data for a file whether data was collected on Windows or not.\n            Write-Verbose \"Processing $_\"\n            $xml = [xml](Get-Content -LiteralPath $_)\n            $xml.coverage.packages.package.classes.class |? { $_.filename} |% {\n                $_.filename = $_.filename.Replace('{reporoot}', $RepoRoot).Replace([IO.Path]::AltDirectorySeparatorChar, [IO.Path]::DirectorySeparatorChar)\n            }\n\n            $xml.Save($_)\n        }\n\n        $Inputs = $reports |% { Resolve-Path -relative $_.FullName }\n\n        if ((Split-Path $OutputFile) -and -not (Test-Path (Split-Path $OutputFile))) {\n            New-Item -Type Directory -Path (Split-Path $OutputFile) | Out-Null\n        }\n\n        & dotnet dotnet-coverage merge $Inputs -o $OutputFile -f cobertura\n    } else {\n        Write-Error \"No reports found to merge.\"\n    }\n} finally {\n    Pop-Location\n}\n"
  },
  {
    "path": "azure-pipelines/NuGetSbom.props",
    "content": "<Project>\n  <PropertyGroup>\n    <GenerateSBOMThisProject>true</GenerateSBOMThisProject>\n    <UseMicroBuildSbomPluginVersion>2</UseMicroBuildSbomPluginVersion>\n  </PropertyGroup>\n</Project>\n"
  },
  {
    "path": "azure-pipelines/PoliCheckExclusions.xml",
    "content": "<PoliCheckExclusions>\n    <!--Each of these exclusions is a folder name -if \\[name]\\exists in the file path, it will be skipped -->\n    <Exclusion Type=\"FolderPathFull\">NODE_MODULES|.STORE</Exclusion>\n    <!--Each of these exclusions is a folder name -if any folder or file starts with \"\\[name]\", it will be skipped -->\n    <!-- <Exclusion Type=\"FolderPathStart\">ABC|XYZ</Exclusion>-->\n    <!--Each of these file types will be completely skipped for the entire scan -->\n    <!-- <Exclusion Type=\"FileType\">.ABC|.XYZ</Exclusion>-->\n    <!--The specified file names will be skipped during the scan regardless which folder they are in -->\n    <!-- <Exclusion Type=\"FileName\">ABC.TXT|XYZ.CS</Exclusion>-->\n</PoliCheckExclusions>\n"
  },
  {
    "path": "azure-pipelines/PostPRMessage.ps1",
    "content": "[CmdletBinding(SupportsShouldProcess = $true)]\nparam(\n    [Parameter(Mandatory=$true)]\n    $AccessToken,\n    [Parameter(Mandatory=$true)]\n    $Markdown,\n    [ValidateSet('Active','ByDesign','Closed','Fixed','Pending','Unknown','WontFix')]\n    $CommentState='Active'\n)\n\n# See https://learn.microsoft.com/dotnet/api/microsoft.teamfoundation.sourcecontrol.webapi.commentthreadstatus\nif ($CommentState -eq 'Active') {\n    $StatusCode = 1\n} elseif ($CommentState -eq 'ByDesign') {\n    $StatusCode = 5\n} elseif ($CommentState -eq 'Closed') {\n    $StatusCode = 4\n} elseif ($CommentState -eq 'Fixed') {\n    $StatusCode = 2\n} elseif ($CommentState -eq 'Pending') {\n    $StatusCode = 6\n} elseif ($CommentState -eq 'Unknown') {\n    $StatusCode = 0\n} elseif ($CommentState -eq 'WontFix') {\n    $StatusCode = 3\n}\n\n# Build the JSON body up\n$body = ConvertTo-Json @{\n    comments = @(@{\n        parentCommentId = 0\n        content = $Markdown\n        commentType = 1\n    })\n    status = $StatusCode\n}\n\nWrite-Verbose \"Posting JSON payload: `n$Body\"\n\n# Post the message to the Pull Request\n# https://learn.microsoft.com/rest/api/azure/devops/git/pull-request-threads\n$url = \"$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/git/repositories/$($env:BUILD_REPOSITORY_NAME)/pullRequests/$($env:SYSTEM_PULLREQUEST_PULLREQUESTID)/threads?api-version=5.1\"\nif ($PSCmdlet.ShouldProcess($url, 'Post comment via REST call')) {\n    try {\n        if (!$env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI) {\n            Write-Error \"Posting to the pull request requires that the script is running in an Azure Pipelines context.\"\n            exit 1\n        }\n        Write-Host \"Posting PR comment to: $url\"\n        Invoke-RestMethod -Uri $url -Method POST -Headers @{Authorization = \"Bearer $AccessToken\"} -Body $Body -ContentType application/json\n    }\n    catch {\n        Write-Error $_\n        Write-Error $_.Exception.Message\n        exit 2\n    }\n}\n"
  },
  {
    "path": "azure-pipelines/TSAOptions.json",
    "content": "{\n  \"tsaVersion\": \"TsaV2\",\n  \"codebase\": \"NewOrUpdate\",\n  \"codebaseName\": \"SlowCheetah\",\n  \"tsaStamp\": \"DevDiv\",\n  \"tsaEnvironment\": \"PROD\",\n  \"notificationAliases\": [\n    \"vsslnx@microsoft.com\"\n  ],\n  \"codebaseAdmins\": [\n    \"REDMOND\\\\tevinstanley\"\n  ],\n  \"instanceUrl\": \"https://devdiv.visualstudio.com\",\n  \"projectName\": \"DevDiv\",\n  \"areaPath\": \"DevDiv\\\\VS Core\\\\Project\\\\SlowCheetah\",\n  \"iterationPath\": \"DevDiv\",\n  \"tools\": [\n    \"APIScan\",\n    \"CodeQL\"\n  ],\n  \"repositoryName\": \"SlowCheetah\"\n}\n"
  },
  {
    "path": "azure-pipelines/WIFtoPATauth.yml",
    "content": "parameters:\n- name: deadPATServiceConnectionId # The GUID of the PAT-based service connection whose access token must be replaced.\n  type: string\n- name: wifServiceConnectionName # The name of the WIF service connection to use to get the access token.\n  type: string\n- name: resource # The scope for which the access token is requested.\n  type: string\n  default: 499b84ac-1321-427f-aa17-267ca6975798 # Azure Artifact feeds (any of them)\n\nsteps:\n- task: AzureCLI@2\n  displayName: 🔏 Authenticate with WIF service connection\n  inputs:\n    azureSubscription: ${{ parameters.wifServiceConnectionName }}\n    scriptType: pscore\n    scriptLocation: inlineScript\n    inlineScript: |\n      $accessToken = az account get-access-token --query accessToken --resource '${{ parameters.resource }}' -o tsv\n      # Set the access token as a secret, so it doesn't get leaked in the logs\n      Write-Host \"##vso[task.setsecret]$accessToken\"\n      # Override the apitoken of the nuget service connection, for the duration of this stage\n      Write-Host \"##vso[task.setendpoint id=${{ parameters.deadPATServiceConnectionId }};field=authParameter;key=apitoken]$accessToken\"\n"
  },
  {
    "path": "azure-pipelines/apiscan.yml",
    "content": "parameters:\n- name: windowsPool\n  type: object\n- name: RealSign\n  type: boolean\n\njobs:\n- job: apiscan\n  displayName: APIScan\n  dependsOn: Windows\n  pool: ${{ parameters.windowsPool }}\n  timeoutInMinutes: 120\n  templateContext:\n    ${{ if not(parameters.RealSign) }}:\n      mb:\n        signing: # if the build is test-signed, install the signing plugin so that CSVTestSignPolicy.xml is available\n          enabled: true\n          zipSources: false\n          signType: test\n    outputs:\n    - output: pipelineArtifact\n      displayName: 📢 collect apiscan artifact\n      targetPath: $(Pipeline.Workspace)/.gdn/.r/apiscan/001/Logs\n      artifactName: apiscan-logs\n      condition: succeededOrFailed()\n  variables:\n  - name: SymbolsFeatureName\n    value: $[ dependencies.Windows.outputs['SetPipelineVariables.SymbolsFeatureName'] ]\n  - name: NBGV_MajorMinorVersion\n    value: $[ dependencies.Windows.outputs['nbgv.NBGV_MajorMinorVersion'] ]\n  - ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:\n    # https://dev.azure.com/devdiv/DevDiv/_wiki/wikis/DevDiv.wiki/25351/APIScan-step-by-step-guide-to-setting-up-a-Pipeline\n    - group: VSEng sponsored APIScan # Expected to provide ApiScanClientId\n  steps:\n    # We need TSAOptions.json\n  - checkout: self\n    fetchDepth: 1\n\n  - download: current\n    artifact: APIScanInputs\n    displayName: 🔻 Download APIScanInputs artifact\n\n  - task: APIScan@2\n    displayName: 🔍 Run APIScan\n    inputs:\n      softwareFolder: $(Pipeline.Workspace)/APIScanInputs\n      softwareName: $(SymbolsFeatureName)\n      softwareVersionNum: $(NBGV_MajorMinorVersion)\n      isLargeApp: false\n      toolVersion: Latest\n      preserveLogsFolder: true\n      azureSubscription: VSEng-APIScanSC\n    env:\n      AzureServicesAuthConnectionString: $(APIScanAuthConnectionString)\n      SYSTEM_ACCESSTOKEN: $(System.AccessToken)\n\n  # File bugs when APIScan finds issues\n  - task: TSAUpload@2\n    displayName: 🪳 TSA upload\n    inputs:\n      GdnPublishTsaOnboard: True\n      GdnPublishTsaConfigFile: $(Build.SourcesDirectory)\\azure-pipelines\\TSAOptions.json\n    condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))\n"
  },
  {
    "path": "azure-pipelines/archive-sourcecode.yml",
    "content": "trigger: none # We only want to trigger manually or based on resources\npr: none\n\n# Source archival requirements come from a compliance tenet. Review a sample task here: https://devdiv.visualstudio.com/DevDiv/_workitems/edit/1550985\n# Source code should be archived within 30 days of the release date, and at least every quarter if your product is releasing more than once every 6 months.\n# If your sources on GitHub are public open source project, then using GitHub Public Archive is sufficient.\nschedules:\n- cron: \"13 13 13 */3 *\" # Every three months\n  displayName: Periodic source archival\n  branches:\n    include:\n    - main\n\nresources:\n  repositories:\n  - repository: MicroBuildTemplate\n    type: git\n    name: 1ESPipelineTemplates/MicroBuildTemplate\n    ref: refs/tags/release\n\nparameters:\n- name: notes\n  displayName: Notes to include in the SCA request\n  type: string\n  default: ' ' # optional parameters require a non-empty default.\n- name: whatif\n  displayName: Only simulate the request\n  type: boolean\n  default: false\n\nvariables:\n- group: VS Core team # Expected to provide ManagerAlias, SourceCodeArchivalUri\n- template: GlobalVariables.yml\n\nextends:\n  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate\n  parameters:\n    sdl:\n      sourceAnalysisPool: VSEng-MicroBuildVSStable\n\n    stages:\n    - stage: archive\n      jobs:\n      - job: archive\n        pool:\n          name: AzurePipelines-EO\n          demands:\n          - ImageOverride -equals 1ESPT-Ubuntu22.04\n          os: Linux\n\n        steps:\n        - checkout: self\n          clean: true\n          fetchDepth: 0\n        - powershell: tools/Install-DotNetSdk.ps1\n          displayName: ⚙ Install .NET SDK\n        - task: NuGetAuthenticate@1\n          displayName: 🔏 Authenticate NuGet feeds\n          inputs:\n            forceReinstallCredentialProvider: true\n        - script: dotnet tool restore\n          displayName: ⚙️ Restore CLI tools\n        - powershell: tools/variables/_define.ps1\n          failOnStderr: true\n          displayName: ⚙ Set pipeline variables based on source\n        - task: AzureCLI@2\n          displayName: 🔏 Authenticate with WIF service connection\n          inputs:\n            azureSubscription: VS Core Source Code Archival\n            scriptType: pscore\n            scriptLocation: inlineScript\n            inlineScript: |\n              $accessToken = az account get-access-token --query accessToken --resource api://177cf50a-4bf5-4481-8b7e-f32900dfc8e6 -o tsv\n              Write-Host \"##vso[task.setvariable variable=scaToken;issecret=true]$accessToken\"\n        - pwsh: >\n            $TeamAlias = '$(TeamEmail)'.Substring(0, '$(TeamEmail)'.IndexOf('@'))\n\n            azure-pipelines/Archive-SourceCode.ps1\n            -ManagerAlias '$(ManagerAlias)'\n            -TeamAlias $TeamAlias\n            -BusinessGroupName '$(BusinessGroupName)'\n            -ProductName '$(SymbolsFeatureName)'\n            -ProductLanguage English\n            -Notes '${{ parameters.notes }}'\n            -AccessToken '$(scaToken)'\n            -Verbose\n            -WhatIf:$${{ parameters.whatif }}\n          displayName: 🗃️ Submit archival request\n"
  },
  {
    "path": "azure-pipelines/build.yml",
    "content": "parameters:\n##### The following parameters are not set by other YAML files that import this one,\n##### but we use parameters because they support rich types and defaults.\n##### Feel free to adjust their default value as needed.\n\n# Whether this repo uses OptProf to optimize the built binaries.\n# When enabling this, be sure to update these files:\n# - OptProf.targets: InstallationPath and match TestCase selection with what's in the VS repo.\n# - The project file(s) for the libraries to optimize must import OptProf.targets (for multi-targeted projects, only import it for ONE target).\n# - OptProf.yml: Search for LibraryName (or your library's name) and verify that those names are appropriate.\n# - OptProf_part2.yml: Search for LibraryName (or your library's name) and verify that those names are appropriate.\n# and create pipelines for OptProf.yml, OptProf_part2.yml\n- name: EnableOptProf\n  type: boolean\n  default: false\n# Whether this repo is localized.\n- name: EnableLocalization\n  type: boolean\n  default: false\n# Whether to run `dotnet format` as part of the build to ensure code style consistency.\n# This is just one of a a few mechanisms to enforce code style consistency.\n- name: EnableDotNetFormatCheck\n  type: boolean\n  default: false\n# This lists the names of the artifacts that will be published *from every OS build agent*.\n# Any new tools/artifacts/*.ps1 script needs to be added to this list.\n# If an artifact is only generated or collected on one OS, it should NOT be listed here,\n# but should be manually added to the `outputs:` field in the appropriate OS job.\n- name: artifact_names\n  type: object\n  default:\n    - name: build_logs\n    - name: coverageResults\n    - name: deployables\n      sbomEnabled: true\n    - name: projectAssetsJson\n    - name: symbols\n    - name: testResults\n      testOnly: true\n    - name: test_symbols\n      testOnly: true\n    - name: Variables\n# The Enable*Build parameters turn non-Windows agents on or off.\n# Their default value should be based on whether the build and tests are expected/required to pass on that platform.\n# Callers (e.g. Official.yml) *may* expose these parameters at queue-time in order to turn OFF optional agents.\n- name: EnableLinuxBuild\n  type: boolean\n  default: false\n- name: EnableMacOSBuild\n  type: boolean\n  default: false\n\n##### 👆🏼 You MAY change the defaults above.\n##### 👇🏼 You should NOT change the defaults below.\n\n##### The following parameters are expected to be set by other YAML files that import this one.\n##### Those without defaults require explicit values to be provided by our importers.\n\n# Indicates whether the entrypoint file is 1ESPT compliant. Use this parameter to switch between publish tasks to fit 1ES or non-1ES needs.\n- name: Is1ESPT\n  type: boolean\n\n# Indicates whether the 'official' 1ES PT templates are being used (as opposed to the unofficial ones).\n- name: Is1ESPTOfficial\n  type: boolean\n  default: false\n\n- name: RealSign\n  type: boolean\n  default: false\n\n- name: RunTests\n  type: boolean\n  default: true\n\n- name: PublishCodeCoverage\n  type: boolean\n  default: true\n\n# Whether this is a special one-off build for inserting into VS for a validation insertion PR (that will never be merged).\n- name: SkipCodesignVerify\n  type: boolean\n  default: false\n\n- name: EnableAPIScan\n  type: boolean\n  default: false\n\n# This parameter exists to provide a workaround to get a build out even when no OptProf profiling outputs can be found.\n# Entrypoint yaml files like official.yml should expose this as a queue-time setting when EnableOptProf is true in this file.\n# The OptProf.yml entrypoint sets this parameter to true so that collecting profile data isn't blocked by a prior lack of profile data.\n- name: ShouldSkipOptimize\n  type: boolean\n  default: false\n\n# The pool parameters are set to defaults that work in the azure-public AzDO account.\n# They are overridden by callers for the devdiv AzDO account to use 1ES compliant pools.\n- name: windowsPool\n  type: object\n  default:\n    vmImage: windows-2025\n- name: linuxPool\n  type: object\n  default:\n    vmImage: ubuntu-24.04\n- name: macOSPool\n  type: object\n  default:\n    vmImage: macOS-15\n\njobs:\n- job: Windows\n  pool: ${{ parameters.windowsPool }}\n  timeoutInMinutes: 180 # Give plenty of time due to real signing\n  ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:\n    templateContext:\n      mb:\n        signing:\n          enabled: true\n          zipSources: false\n          ${{ if parameters.RealSign }}:\n            signType: real\n            signWithProd: true\n          ${{ else }}:\n            signType: test\n        sbom:\n          enabled: true\n          sbomToolVersion: 5.0.3\n        localization:\n          enabled: ${{ parameters.EnableLocalization }}\n          ${{ if eq(variables['Build.Reason'], 'pullRequest') }}:\n            languages: ENU,JPN\n        optprof:\n          enabled: ${{ parameters.EnableOptProf }}\n          ProfilingInputsDropName: $(ProfilingInputsDropName)\n          GeneratePropsFile: true\n          PropsPath: $(Build.ArtifactStagingDirectory)/InsertionOutputs/$(ProfilingInputsPropsName)\n          OptimizationInputsLookupMethod: GitTagRepo\n          GitTagProject: DevDiv\n          GitTagRepo: VS\n          ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}\n          AccessToken: $(System.AccessToken)\n        mbpresteps:\n        - checkout: self\n          fetchDepth: 0 # avoid shallow clone so nbgv can do its work.\n          clean: true\n        - ${{ if parameters.EnableOptProf }}:\n          - powershell: |\n              Write-Host \"##vso[task.setvariable variable=PROFILINGINPUTSDROPNAME]$(tools/variables/ProfilingInputsDropName.ps1)\"\n              Write-Host \"##vso[task.setvariable variable=PROFILINGINPUTSPROPSNAME]$(tools/variables/ProfilingInputsPropsName.ps1)\"\n            displayName: ⚙ Setting variables for optprof\n      sdl:\n        binskim:\n          analyzeTargetGlob: $(Build.ArtifactStagingDirectory)\\symbols-Windows\\**\n\n      outputParentDirectory: $(Build.ArtifactStagingDirectory)\n      outputs:\n      - ${{ each artifact in parameters.artifact_names }}:\n        - ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:\n          - output: pipelineArtifact\n            displayName: 📢 Publish ${{ artifact.name }}-Windows\n            targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Windows\n            artifactName: ${{ artifact.name }}-Windows\n            ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:\n              sbomEnabled: true\n          - output: pipelineArtifact\n            displayName: 📢 Publish ${{ artifact.name }}-Windows (for failed attempts)\n            targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Windows\n            artifactName: ${{ artifact.name }}-Windows-$(System.PhaseAttempt)\n            ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:\n              sbomEnabled: true\n            condition: failed()\n      - output: pipelineArtifact\n        displayName: 📢 Publish VSInsertion-Windows\n        targetPath: $(Build.ArtifactStagingDirectory)/VSInsertion-Windows\n        artifactName: VSInsertion-Windows\n      - ${{ if parameters.EnableLocalization }}:\n        - output: pipelineArtifact\n          displayName: 📢 Publish LocBin-Windows\n          targetPath: $(Build.ArtifactStagingDirectory)/LocBin-Windows\n          artifactName: LocBin-Windows\n      - ${{ if parameters.EnableAPIScan }}:\n        - output: pipelineArtifact\n          displayName: 📢 Publish APIScanInputs\n          targetPath: $(Build.ArtifactStagingDirectory)/APIScanInputs-Windows\n          artifactName: APIScanInputs\n      - ${{ if parameters.EnableOptProf }}:\n        - output: artifactsDrop\n          displayName: 📢 Publish to Artifact Services - ProfilingInputs\n          dropServiceURI: https://devdiv.artifacts.visualstudio.com\n          buildNumber: $(ProfilingInputsDropName)\n          sourcePath: $(Build.ArtifactStagingDirectory)\\OptProf\\ProfilingInputs\n          toLowerCase: false\n          retentionDays: 500\n          condition: and(succeeded(), ne(variables['Build.Reason'], 'PullRequest'))\n  steps:\n  - ${{ if not(parameters.Is1ESPT) }}:\n    - checkout: self\n      fetchDepth: 0 # avoid shallow clone so nbgv can do its work.\n      clean: true\n    - ${{ if parameters.EnableOptProf }}:\n      - powershell: Write-Host \"##vso[task.setvariable variable=PROFILINGINPUTSDROPNAME]$(tools/variables/ProfilingInputsDropName.ps1)\"\n        displayName: ⚙ Set ProfilingInputsDropName for optprof\n\n  - template: install-dependencies.yml\n\n  - script: dotnet nbgv cloud -ca\n    displayName: ⚙ Set build number\n    name: nbgv\n\n  - ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:\n    - template: microbuild.before.yml\n      parameters:\n        EnableLocalization: ${{ parameters.EnableLocalization }}\n        ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}\n        RealSign: ${{ parameters.RealSign }}\n\n  - template: dotnet.yml\n    parameters:\n      Is1ESPT: ${{ parameters.Is1ESPT }}\n      RunTests: ${{ parameters.RunTests }}\n\n  - ${{ if and(parameters.EnableDotNetFormatCheck, not(parameters.EnableLinuxBuild)) }}:\n    - script: dotnet format --verify-no-changes --no-restore src\n      displayName: 💅 Verify formatted code\n      env:\n        dotnetformat: true # part of a workaround for https://github.com/dotnet/sdk/issues/44951\n\n  - ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:\n    - template: microbuild.after.yml\n      parameters:\n        SkipCodesignVerify: ${{ parameters.SkipCodesignVerify }}\n\n- ${{ if parameters.EnableLinuxBuild }}:\n  - job: Linux\n    pool: ${{ parameters.linuxPool }}\n    ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:\n      templateContext:\n        mb:\n          ${{ if parameters.RealSign }}:\n            signing:\n              enabled: false # enable when building unique artifacts on this agent that must be signed\n              signType: real\n              signWithProd: true\n        outputParentDirectory: $(Build.ArtifactStagingDirectory)\n        outputs:\n        - ${{ each artifact in parameters.artifact_names }}:\n          - ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:\n            - output: pipelineArtifact\n              displayName: 📢 Publish ${{ artifact.name }}-Linux\n              targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux\n              artifactName: ${{ artifact.name }}-Linux\n              ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:\n                sbomEnabled: true\n            - output: pipelineArtifact\n              displayName: 📢 Publish ${{ artifact.name }}-Linux (for failed attempts)\n              targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-Linux\n              artifactName: ${{ artifact.name }}-Linux-$(System.PhaseAttempt)\n              ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:\n                sbomEnabled: true\n              condition: failed()\n    steps:\n    - checkout: self\n      fetchDepth: 0 # avoid shallow clone so nbgv can do its work.\n      clean: true\n    - template: install-dependencies.yml\n    - template: dotnet.yml\n      parameters:\n        Is1ESPT: ${{ parameters.Is1ESPT }}\n        RunTests: ${{ parameters.RunTests }}\n        BuildRequiresAccessToken: ${{ parameters.RealSign }} # Real signing on non-Windows machines requires passing through access token to build steps that sign\n    - ${{ if parameters.EnableDotNetFormatCheck }}:\n      - script: dotnet format --verify-no-changes\n        displayName: 💅 Verify formatted code\n        env:\n          dotnetformat: true # part of a workaround for https://github.com/dotnet/sdk/issues/44951\n    - template: expand-template.yml\n\n- ${{ if parameters.EnableMacOSBuild }}:\n  - job: macOS\n    pool: ${{ parameters.macOSPool }}\n    ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:\n      templateContext:\n        mb:\n          ${{ if parameters.RealSign }}:\n            signing:\n              enabled: false # enable when building unique artifacts on this agent that must be signed\n              signType: real\n              signWithProd: true\n        outputParentDirectory: $(Build.ArtifactStagingDirectory)\n        outputs:\n        - ${{ each artifact in parameters.artifact_names }}:\n          - ${{ if or(ne(artifact.testOnly, 'true'), parameters.RunTests) }}:\n            - output: pipelineArtifact\n              displayName: 📢 Publish ${{ artifact.name }}-macOS\n              targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-macOS\n              artifactName: ${{ artifact.name }}-macOS\n              ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:\n                sbomEnabled: true\n            - output: pipelineArtifact\n              displayName: 📢 Publish ${{ artifact.name }}-macOS (for failed attempts)\n              targetPath: $(Build.ArtifactStagingDirectory)/${{ artifact.name }}-macOS\n              artifactName: ${{ artifact.name }}-macOS-$(System.PhaseAttempt)\n              ${{ if and(parameters.Is1ESPTOfficial, eq(artifact.sbomEnabled, 'true')) }}:\n                sbomEnabled: true\n              condition: failed()\n    steps:\n    - checkout: self\n      fetchDepth: 0 # avoid shallow clone so nbgv can do its work.\n      clean: true\n    - template: install-dependencies.yml\n    - template: dotnet.yml\n      parameters:\n        Is1ESPT: ${{ parameters.Is1ESPT }}\n        RunTests: ${{ parameters.RunTests }}\n        BuildRequiresAccessToken: ${{ parameters.RealSign }} # Real signing on non-Windows machines requires passing through access token to build steps that sign\n    - template: expand-template.yml\n\n- job: WrapUp\n  dependsOn:\n  - Windows\n  - ${{ if parameters.EnableLinuxBuild }}:\n    - Linux\n  - ${{ if parameters.EnableMacOSBuild }}:\n    - macOS\n  pool: ${{ parameters.windowsPool }} # Use Windows agent because PublishSymbols task requires it (https://github.com/microsoft/azure-pipelines-tasks/issues/13821).\n  condition: succeededOrFailed()\n  variables:\n    ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build jobs, we don't need it here\n  ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:\n    templateContext:\n      ${{ if not(parameters.RealSign) }}:\n        mb:\n          signing: # if the build is test-signed, install the signing plugin so that CSVTestSignPolicy.xml is available\n            enabled: true\n            zipSources: false\n            signType: test\n      outputParentDirectory: $(Build.ArtifactStagingDirectory)\n      outputs:\n        - output: pipelineArtifact\n          displayName: 📢 Publish symbols-legacy\n          targetPath: $(Build.ArtifactStagingDirectory)/symbols-legacy\n          artifactName: symbols-legacy\n          condition: succeededOrFailed()\n  steps:\n  - checkout: self\n    fetchDepth: 0 # avoid shallow clone so nbgv can do its work.\n    clean: true\n  - template: install-dependencies.yml\n    parameters:\n      initArgs: -NoRestore\n  - template: publish-symbols.yml\n    parameters:\n      EnableLinuxBuild: ${{ parameters.EnableLinuxBuild }}\n      EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}\n  - ${{ if and(parameters.RunTests, parameters.PublishCodeCoverage) }}:\n    - template: publish-codecoverage.yml\n      parameters:\n        EnableLinuxBuild: ${{ parameters.EnableLinuxBuild }}\n        EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}\n\n- ${{ if parameters.EnableAPIScan }}:\n  - template: apiscan.yml\n    parameters:\n      windowsPool: ${{ parameters.windowsPool }}\n      RealSign: ${{ parameters.RealSign }}\n"
  },
  {
    "path": "azure-pipelines/dotnet.yml",
    "content": "parameters:\n- name: RunTests\n- name: Is1ESPT\n  type: boolean\n- name: BuildRequiresAccessToken\n  type: boolean\n  default: false\n\nsteps:\n\n\n- task: VSBuild@1\n  inputs:\n    solution: src/SlowCheetah.sln\n    msbuildArgs: /t:build,pack /bl:\"$(Build.ArtifactStagingDirectory)/build_logs/build.binlog\"\n    configuration: $(BuildConfiguration)\n  displayName: 🛠 Build\n\n- powershell: tools/dotnet-test-cloud.ps1 -Configuration $(BuildConfiguration) -Agent $(Agent.JobName) -PublishResults\n  displayName: 🧪 dotnet test\n  condition: and(succeeded(), ${{ parameters.RunTests }})\n\n- powershell: tools/variables/_define.ps1\n  failOnStderr: true\n  displayName: ⚙ Update pipeline variables based on build outputs\n  condition: succeededOrFailed()\n\n- ${{ if parameters.Is1ESPT }}:\n  - powershell: azure-pipelines/publish_artifacts.ps1 -StageOnly -AvoidSymbolicLinks -ArtifactNameSuffix \"-$(Agent.JobName)\" -Verbose\n    failOnStderr: true\n    displayName: 📢 Stage artifacts\n    condition: succeededOrFailed()\n- ${{ else }}:\n  - powershell: azure-pipelines/publish_artifacts.ps1 -ArtifactNameSuffix \"-$(Agent.JobName)\" -Verbose\n    failOnStderr: true\n    displayName: 📢 Publish artifacts\n    condition: succeededOrFailed()\n\n- ${{ if parameters.RunTests }}:\n  - powershell: |\n      $ArtifactStagingFolder = & \"tools/Get-ArtifactsStagingDirectory.ps1\"\n      $CoverageResultsFolder = Join-Path $ArtifactStagingFolder \"coverageResults-$(Agent.JobName)\"\n      tools/publish-CodeCov.ps1 -CodeCovToken \"$(CODECOV_TOKEN)\" -PathToCodeCoverage \"$CoverageResultsFolder\" -Name \"$(Agent.JobName) Coverage Results\" -Flags \"$(Agent.JobName)\"\n    displayName: 📢 Publish code coverage results to codecov.io\n    timeoutInMinutes: 3\n    continueOnError: true\n    # Set the CODECOV_TOKEN variable in your Azure Pipeline to enable code coverage reporting\n    # Get a token from https://codecov.io/\n    condition: and(succeeded(), ne(variables['CODECOV_TOKEN'], ''))\n"
  },
  {
    "path": "azure-pipelines/falsepositives.gdnsuppress",
    "content": "{\n  \"version\": \"latest\",\n  \"suppressionSets\": {\n    \"falsepositives\": {\n      \"name\": \"falsepositives\",\n      \"createdDate\": \"2021-12-03 00:23:08Z\",\n      \"lastUpdatedDate\": \"2021-12-03 00:23:08Z\"\n    }\n  },\n  \"results\": {\n  }\n}\n"
  },
  {
    "path": "azure-pipelines/install-dependencies.yml",
    "content": "parameters:\n- name: initArgs\n  type: string\n  default: ''\n- name: needsAzurePublicFeeds\n  type: boolean\n  default: true # If nuget.config pulls from the azure-public account, we need to authenticate when building on the devdiv account.\n\nsteps:\n- ${{ if and(parameters.needsAzurePublicFeeds, eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9')) }}:\n  - template: WIFtoPATauth.yml\n    parameters:\n      wifServiceConnectionName: azure-public/vside package pull\n      deadPATServiceConnectionId: 0ae39abc-4d06-4436-a7b5-865833df49db # azure-public/msft_consumption\n\n- task: NuGetAuthenticate@1\n  displayName: 🔏 Authenticate NuGet feeds\n  inputs:\n    ${{ if and(parameters.needsAzurePublicFeeds, eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9')) }}:\n      nuGetServiceConnections: azure-public/msft_consumption\n\n- powershell: |\n    $AccessToken = '$(System.AccessToken)' # Avoid specifying the access token directly on the init.ps1 command line to avoid it showing up in errors\n    .\\init.ps1 -AccessToken $AccessToken ${{ parameters['initArgs'] }} -UpgradePrerequisites -NoNuGetCredProvider\n    dotnet --info\n\n    # Print mono version if it is present.\n    if (Get-Command mono -ErrorAction SilentlyContinue) {\n      mono --version\n    }\n  displayName: ⚙ Install prerequisites\n\n- powershell: tools/variables/_define.ps1\n  failOnStderr: true\n  displayName: ⚙ Set pipeline variables based on source\n  name: SetPipelineVariables\n"
  },
  {
    "path": "azure-pipelines/libtemplate-update.yml",
    "content": "# This pipeline schedules regular merges of Library.Template into a repo that is based on it.\n# Only Azure Repos are supported. GitHub support comes via a GitHub Actions workflow.\n\ntrigger: none\npr: none\nschedules:\n- cron: \"0 3 * * Mon\" # Sun @ 8 or 9 PM Mountain Time (depending on DST)\n  displayName: Weekly trigger\n  branches:\n    include:\n    - main\n  always: true\n\nresources:\n  repositories:\n  - repository: MicroBuildTemplate\n    type: git\n    name: 1ESPipelineTemplates/MicroBuildTemplate\n    ref: refs/tags/release\n\nparameters:\n- name: AutoComplete\n  displayName: Auto-complete pull request\n  type: boolean\n  default: false\n\nvariables:\n- template: GlobalVariables.yml\n\nextends:\n  template: azure-pipelines/MicroBuild.1ES.Unofficial.yml@MicroBuildTemplate\n  parameters:\n    sdl:\n      sourceAnalysisPool:\n        name: AzurePipelines-EO\n        demands:\n        - ImageOverride -equals 1ESPT-Windows2022\n      credscan:\n        enabled: false\n\n    stages:\n    - stage: Merge\n      jobs:\n      - job: merge\n        pool:\n          name: AzurePipelines-EO\n          demands:\n          - ImageOverride -equals 1ESPT-Ubuntu22.04\n          os: Linux\n        steps:\n        - checkout: self\n          fetchDepth: 0\n          clean: true\n        - pwsh: |\n            $LibTemplateBranch = & ./tools/Get-LibTemplateBasis.ps1 -ErrorIfNotRelated\n            if ($LASTEXITCODE -ne 0) {\n              exit $LASTEXITCODE\n            }\n\n            git fetch https://github.com/aarnott/Library.Template $LibTemplateBranch\n            if ($LASTEXITCODE -ne 0) {\n              exit $LASTEXITCODE\n            }\n            $LibTemplateCommit = git rev-parse FETCH_HEAD\n\n            if ((git rev-list FETCH_HEAD ^HEAD --count) -eq 0) {\n              Write-Host \"There are no Library.Template updates to merge.\"\n              exit 0\n            }\n\n            $UpdateBranchName = 'auto/libtemplateUpdate'\n            git -c http.extraheader=\"AUTHORIZATION: bearer $(System.AccessToken)\" push origin -f FETCH_HEAD:refs/heads/$UpdateBranchName\n\n            Write-Host \"Creating pull request\"\n            $contentType = 'application/json';\n            $headers = @{ Authorization = 'Bearer $(System.AccessToken)' };\n            $rawRequest = @{\n              sourceRefName = \"refs/heads/$UpdateBranchName\";\n              targetRefName = \"refs/heads/main\";\n              title = 'Merge latest Library.Template';\n              description = \"This merges the latest features and fixes from [Library.Template's $LibTemplateBranch branch](https://github.com/AArnott/Library.Template/tree/$LibTemplateBranch).\";\n            }\n            $request = ConvertTo-Json $rawRequest\n\n            $prApiBaseUri = '$(System.TeamFoundationCollectionUri)/$(System.TeamProject)/_apis/git/repositories/$(Build.Repository.ID)/pullrequests'\n            $prCreationUri = $prApiBaseUri + \"?api-version=6.0\"\n            Write-Host \"POST $prCreationUri\"\n            Write-Host $request\n\n            $prCreationResult = Invoke-RestMethod -uri $prCreationUri -method POST -Headers $headers -ContentType $contentType -Body $request\n            $prUrl = \"$($prCreationResult.repository.webUrl)/pullrequest/$($prCreationResult.pullRequestId)\"\n            Write-Host \"Pull request: $prUrl\"\n            $prApiBaseUri += \"/$($prCreationResult.pullRequestId)\"\n\n            $SummaryPath = Join-Path '$(Agent.TempDirectory)' 'summary.md'\n            Set-Content -Path $SummaryPath -Value \"[Insertion pull request]($prUrl)\"\n            Write-Host \"##vso[task.uploadsummary]$SummaryPath\"\n\n            # Tag the PR\n            $tagUri = \"$prApiBaseUri/labels?api-version=7.0\"\n            $rawRequest = @{\n              name = 'auto-template-merge';\n            }\n            $request = ConvertTo-Json $rawRequest\n            Invoke-RestMethod -uri $tagUri -method POST -Headers $headers -ContentType $contentType -Body $request | Out-Null\n\n            # Add properties to the PR that we can programatically parse later.\n            Function Set-PRProperties($properties) {\n              $rawRequest = $properties.GetEnumerator() |% {\n                @{\n                  op = 'add'\n                  path = \"/$($_.key)\"\n                  from = $null\n                  value = $_.value\n                }\n              }\n              $request = ConvertTo-Json $rawRequest\n              $setPrPropertyUri = \"$prApiBaseUri/properties?api-version=7.0\"\n              Write-Debug \"$request\"\n              $setPrPropertyResult = Invoke-RestMethod -uri $setPrPropertyUri -method PATCH -Headers $headers -ContentType 'application/json-patch+json' -Body $request -StatusCodeVariable setPrPropertyStatus -SkipHttpErrorCheck\n              if ($setPrPropertyStatus -ne 200) {\n                Write-Host \"##vso[task.logissue type=warning]Failed to set pull request properties. Result: $setPrPropertyStatus. $($setPrPropertyResult.message)\"\n              }\n            }\n            Write-Host \"Setting pull request properties\"\n            Set-PRProperties @{\n              'AutomatedMerge.SourceBranch' = $LibTemplateBranch\n              'AutomatedMerge.SourceCommit' = $LibTemplateCommit\n            }\n\n            # Add an *active* PR comment to warn users to *merge* the pull request instead of squash it.\n            $request = ConvertTo-Json @{\n              comments = @(\n                @{\n                  parentCommentId = 0\n                  content = \"Do **not** squash this pull request when completing it. You must *merge* it.\"\n                  commentType = 'system'\n                }\n              )\n              status = 'active'\n            }\n            $result = Invoke-RestMethod -uri \"$prApiBaseUri/threads?api-version=7.1\" -method POST -Headers $headers -ContentType $contentType -Body $request -StatusCodeVariable addCommentStatus -SkipHttpErrorCheck\n            if ($addCommentStatus -ne 200) {\n              Write-Host \"##vso[task.logissue type=warning]Failed to post comment on pull request. Result: $addCommentStatus. $($result.message)\"\n            }\n\n            # Set auto-complete on the PR\n            if ('${{ parameters.AutoComplete }}' -eq 'True') {\n              Write-Host \"Setting auto-complete\"\n              $mergeMessage = \"Merged PR $($prCreationResult.pullRequestId): \" + $commitMessage\n              $rawRequest = @{\n                autoCompleteSetBy = @{\n                  id = $prCreationResult.createdBy.id\n                };\n                completionOptions = @{\n                  deleteSourceBranch = $true;\n                  mergeCommitMessage = $mergeMessage;\n                  mergeStrategy = 'noFastForward';\n                };\n              }\n              $request = ConvertTo-Json $rawRequest\n              Write-Host $request\n              $uri = \"$($prApiBaseUri)?api-version=6.0\"\n              $result = Invoke-RestMethod -uri $uri -method PATCH -Headers $headers -ContentType $contentType -Body $request -StatusCodeVariable autoCompleteStatus -SkipHttpErrorCheck\n              if ($autoCompleteStatus -ne 200) {\n                Write-Host \"##vso[task.logissue type=warning]Failed to set auto-complete on pull request. Result: $autoCompleteStatus. $($result.message)\"\n              }\n            }\n\n          displayName: Create pull request\n"
  },
  {
    "path": "azure-pipelines/microbuild.after.yml",
    "content": "parameters:\n- name: SkipCodesignVerify\n  type: boolean\n\nsteps:\n- ${{ if not(parameters.SkipCodesignVerify) }}:\n  - task: MicroBuildCodesignVerify@3\n    displayName: 🔍 Verify Signed Files\n    inputs:\n      ApprovalListPathForSigs: $(Build.SourcesDirectory)\\azure-pipelines\\no_strongname.txt\n      ApprovalListPathForCerts: $(Build.SourcesDirectory)\\azure-pipelines\\no_authenticode.txt\n      TargetFolders: |\n        $(Build.SourcesDirectory)/bin/Packages/$(BuildConfiguration)\n    condition: and(succeeded(), eq(variables['Agent.OS'], 'Windows_NT'))\n"
  },
  {
    "path": "azure-pipelines/microbuild.before.yml",
    "content": "parameters:\n- name: EnableLocalization\n  type: boolean\n  default: false\n- name: ShouldSkipOptimize\n  type: boolean\n  default: false\n- name: RealSign\n  type: boolean\n\nsteps:\n- ${{ if ne(variables['Build.Reason'], 'PullRequest') }}:\n  # notice@0 requires CG detection to run first, and non-default branches don't inject it automatically.\n  # default branch injection (main) is happening too late for notice@0 to run successfully. Adding this as a workaround.\n  - task: ComponentGovernanceComponentDetection@0\n    displayName: 🔍 Component Detection\n\n  - task: notice@0\n    displayName: 🛠️ Generate NOTICE file\n    inputs:\n      outputfile: $(System.DefaultWorkingDirectory)/obj/NOTICE\n      outputformat: text\n    retryCountOnTaskFailure: 10 # fails when the cloud service is overloaded\n    continueOnError: ${{ not(parameters.RealSign) }} # Tolerate failures when we're not building something that may ship.\n"
  },
  {
    "path": "azure-pipelines/no_authenticode.txt",
    "content": "bin\\packages\\release\\vsix\\_manifest\\manifest.cat,sbom signed\nbin\\packages\\release\\vsix\\_manifest\\spdx_2.2\\manifest.cat,sbom signed\n"
  },
  {
    "path": "azure-pipelines/no_strongname.txt",
    "content": ""
  },
  {
    "path": "azure-pipelines/official.yml",
    "content": "trigger:\n  branches:\n    include:\n    - main\n\nschedules:\n# Monthly compliance sweep: runs at 03:00 UTC (8 PM PST previous day) on the 1st of every month.\n# `always: true` ensures it runs even if there have been no code changes since the last successful build,\n# so we can detect regressions in compliance tooling (APIScan, PoliCheck, CodeSignValidation, etc.).\n- cron: \"0 3 1 * *\"\n  displayName: Monthly compliance sweep\n  branches:\n    include:\n    - main\n  always: true\n\n\nparameters:\n# As an entrypoint pipeline yml file, all parameters here show up in the Queue Run dialog.\n# If any paramaters should NOT be queue-time options, they should be removed from here\n# and references to them in this file replaced with hard-coded values.\n# - name: ShouldSkipOptimize # Uncomment this and references to it below when setting EnableOptProf to true in build.yml.\n#   displayName: Skip OptProf optimization\n#   type: boolean\n#   default: false\n- name: EnableMacOSBuild\n  displayName: Build on macOS\n  type: boolean\n  default: false # macOS is often bogged down in Azure Pipelines\n- name: RunTests\n  displayName: Run tests\n  type: boolean\n  default: true\n- name: EnableAPIScan\n  displayName: Include APIScan with compliance tools\n  type: boolean\n  default: true # enable in individual repos only AFTER updating TSAOptions.json with your own values\n- name: PublishCodeCoverage\n  displayName: Publish code coverage\n  type: boolean\n  default: true\n\nresources:\n  repositories:\n  - repository: MicroBuildTemplate\n    type: git\n    name: 1ESPipelineTemplates/MicroBuildTemplate\n    ref: refs/tags/release\n\nvariables:\n- template: GlobalVariables.yml\n\nextends:\n  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate\n  parameters:\n    sdl:\n      sourceAnalysisPool: VSEng-MicroBuildVSStable\n      codeSignValidation:\n        enabled: true\n        break: true\n        additionalTargetsGlobPattern: -|Variables-*\\*.ps1;-|LocBin-*\\**;-|APIScanInputs-*\\**;-|test_symbols-*\\**;-|MicroBuild\\**;-|$(Build.ArtifactStagingDirectory)\\VSInsertion-Windows\\vs-insertion-script.ps1\n      policheck:\n        enabled: true\n        exclusionsFile: $(System.DefaultWorkingDirectory)\\azure-pipelines\\PoliCheckExclusions.xml\n      suppression:\n        suppressionFile: $(System.DefaultWorkingDirectory)\\azure-pipelines\\falsepositives.gdnsuppress\n      sbom:\n        enabled: false # Skip 1ES SBOM because microbuild has our own sbom system\n    stages:\n    - stage: Build\n      variables:\n      - template: /azure-pipelines/BuildStageVariables.yml@self\n      jobs:\n      - template: /azure-pipelines/build.yml@self\n        parameters:\n          Is1ESPT: true\n          Is1ESPTOfficial: true\n          RealSign: true\n          # ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}\n          EnableAPIScan: ${{ parameters.EnableAPIScan }}\n          windowsPool: VSEng-MicroBuildVSStable\n          linuxPool:\n            name: AzurePipelines-EO\n            demands:\n            - ImageOverride -equals 1ESPT-Ubuntu22.04\n            os: Linux\n          macOSPool:\n            name: Azure Pipelines\n            vmImage: macOS-15\n            os: macOS\n          EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}\n          RunTests: ${{ parameters.RunTests }}\n          PublishCodeCoverage: ${{ parameters.PublishCodeCoverage }}\n    - template: /azure-pipelines/prepare-insertion-stages.yml@self\n      parameters:\n        RealSign: true\n"
  },
  {
    "path": "azure-pipelines/prepare-insertion-stages.yml",
    "content": "parameters:\n- name: ArchiveSymbols\n  type: boolean\n  default: true\n- name: RealSign\n  displayName: Real sign?\n  type: boolean\n- name: PackagePush\n  type: boolean\n  default: false # Switch to true to enable the push job below\n\nstages:\n- ${{ if or(parameters.ArchiveSymbols, parameters.PackagePush) }}:\n  - stage: release\n    displayName: Publish\n    jobs:\n    - ${{ if parameters.ArchiveSymbols }}:\n      - job: symbol_archive\n        displayName: Archive symbols\n        pool: VSEng-MicroBuildVSStable\n        variables:\n          ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build stages, we don't need it here\n        steps:\n        - checkout: none\n        - download: current\n          artifact: Variables-Windows\n          displayName: 🔻 Download Variables-Windows artifact\n        - powershell: $(Pipeline.Workspace)/Variables-Windows/_define.ps1\n          displayName: ⚙️ Set pipeline variables based on artifacts\n        - download: current\n          artifact: symbols-legacy\n          displayName: 🔻 Download symbols-legacy artifact\n        - task: MicroBuildArchiveSymbols@6\n          displayName: 🔣 Archive symbols to Symweb\n          inputs:\n            SymbolsFeatureName: $(SymbolsFeatureName)\n            SymbolsProject: VS\n            SymbolsAgentPath: $(Pipeline.Workspace)/symbols-legacy\n            azureSubscription: Vseng-SymbolsUpload\n          env:\n            SYSTEM_ACCESSTOKEN: $(System.AccessToken)\n\n    - ${{ if parameters.PackagePush }}:\n      - job: push\n        ${{ if parameters.RealSign }}:\n          displayName: azure-public/vs-impl feed\n        ${{ else }}:\n          displayName: devdiv/vs-impl feed # Leave this as-is, since non-signed builds must not be pushed to public feeds.\n        ${{ if parameters.ArchiveSymbols }}:\n          dependsOn: symbol_archive\n        pool:\n          name: AzurePipelines-EO\n          demands:\n          - ImageOverride -equals 1ESPT-Ubuntu22.04\n          os: Linux\n        templateContext:\n          outputs:\n          - output: nuget\n            displayName: 📦 Push nuget packages\n            packagesToPush: '$(Pipeline.Workspace)/deployables-Windows/NuGet/*.nupkg'\n            packageParentPath: $(Pipeline.Workspace)/deployables-Windows/NuGet\n            allowPackageConflicts: true\n            ${{ if parameters.RealSign }}:\n              nuGetFeedType: external\n              publishFeedCredentials: azure-public/vs-impl\n            ${{ else }}:\n              nuGetFeedType: internal\n              publishVstsFeed: vs-impl # Leave this as-is, since non-signed builds must not be pushed to public feeds.\n        variables:\n          ONEES_ENFORCED_CODEQL_ENABLED: false # CodeQL runs on build stages, we don't need it here\n        steps:\n        - checkout: none\n        - download: current\n          artifact: Variables-Windows\n          displayName: 🔻 Download Variables-Windows artifact\n        - powershell: $(Pipeline.Workspace)/Variables-Windows/_define.ps1\n          displayName: ⚙️ Set pipeline variables based on artifacts\n        - download: current\n          artifact: deployables-Windows\n          displayName: 🔻 Download deployables-Windows artifact\n        - ${{ if parameters.RealSign }}:\n          - template: WIFtoPATauth.yml\n            parameters:\n              wifServiceConnectionName: azure-public/vside package push\n              deadPATServiceConnectionId: 207efd62-fd0f-43e7-aeae-17c4febcc660 # azure-public/vs-impl\n"
  },
  {
    "path": "azure-pipelines/publish-codecoverage.yml",
    "content": "parameters:\n- name: EnableMacOSBuild\n  type: boolean\n- name: EnableLinuxBuild\n  type: boolean\n\nsteps:\n- download: current\n  artifact: coverageResults-Windows\n  displayName: 🔻 Download Windows code coverage results\n  continueOnError: true\n- ${{ if parameters.EnableLinuxBuild }}:\n  - download: current\n    artifact: coverageResults-Linux\n    displayName: 🔻 Download Linux code coverage results\n    continueOnError: true\n- ${{ if parameters.EnableMacOSBuild }}:\n  - download: current\n    artifact: coverageResults-macOS\n    displayName: 🔻 Download macOS code coverage results\n    continueOnError: true\n- powershell: azure-pipelines/Merge-CodeCoverage.ps1 -Path '$(Pipeline.Workspace)' -OutputFile coveragereport/merged.cobertura.xml -Format Cobertura -Verbose\n  displayName: ⚙ Merge coverage\n- task: PublishCodeCoverageResults@2\n  displayName: 📢 Publish code coverage results to Azure DevOps\n  inputs:\n    summaryFileLocation: coveragereport/merged.cobertura.xml\n    failIfCoverageEmpty: true\n"
  },
  {
    "path": "azure-pipelines/publish-symbols.yml",
    "content": "parameters:\n- name: EnableMacOSBuild\n  type: boolean\n- name: EnableLinuxBuild\n  type: boolean\n\nsteps:\n- task: DownloadPipelineArtifact@2\n  inputs:\n    artifact: symbols-Windows\n    path: $(Pipeline.Workspace)/symbols/Windows\n  displayName: 🔻 Download Windows symbols\n  continueOnError: true\n- ${{ if parameters.EnableLinuxBuild }}:\n  - task: DownloadPipelineArtifact@2\n    inputs:\n      artifact: symbols-Linux\n      path: $(Pipeline.Workspace)/symbols/Linux\n    displayName: 🔻 Download Linux symbols\n    continueOnError: true\n- ${{ if parameters.EnableMacOSBuild }}:\n  - task: DownloadPipelineArtifact@2\n    inputs:\n      artifact: symbols-macOS\n      path: $(Pipeline.Workspace)/symbols/macOS\n    displayName: 🔻 Download macOS symbols\n    continueOnError: true\n\n- task: DownloadPipelineArtifact@2\n  inputs:\n    artifact: test_symbols-Windows\n    path: $(Pipeline.Workspace)/test_symbols/Windows\n  displayName: 🔻 Download Windows test symbols\n  continueOnError: true\n- ${{ if parameters.EnableLinuxBuild }}:\n  - task: DownloadPipelineArtifact@2\n    inputs:\n      artifact: test_symbols-Linux\n      path: $(Pipeline.Workspace)/test_symbols/Linux\n    displayName: 🔻 Download Linux test symbols\n    continueOnError: true\n- ${{ if parameters.EnableMacOSBuild }}:\n  - task: DownloadPipelineArtifact@2\n    inputs:\n      artifact: test_symbols-macOS\n      path: $(Pipeline.Workspace)/test_symbols/macOS\n    displayName: 🔻 Download macOS test symbols\n    continueOnError: true\n\n- task: PublishSymbols@2\n  inputs:\n    SymbolsFolder: $(Pipeline.Workspace)/symbols\n    SearchPattern: '**/*.pdb'\n    IndexSources: false\n    SymbolServerType: TeamServices\n  displayName: 📢 Publish symbols\n\n- task: PublishSymbols@2\n  inputs:\n    SymbolsFolder: $(Pipeline.Workspace)/test_symbols\n    SearchPattern: '**/*.pdb'\n    IndexSources: false\n    SymbolServerType: TeamServices\n  displayName: 📢 Publish test symbols\n\n- powershell: tools/Prepare-Legacy-Symbols.ps1 -Path $(Pipeline.Workspace)/symbols/Windows\n  displayName: ⚙ Prepare symbols for symbol archival\n"
  },
  {
    "path": "azure-pipelines/publish_artifacts.ps1",
    "content": "<#\n.SYNOPSIS\n    This script translates all the artifacts described by _all.ps1\n    into commands that instruct Azure Pipelines to actually collect those artifacts.\n#>\n\n[CmdletBinding()]\nparam (\n    [string]$ArtifactNameSuffix,\n    [switch]$StageOnly,\n    [switch]$AvoidSymbolicLinks\n)\n\nFunction Set-PipelineVariable($name, $value) {\n    if ((Test-Path \"Env:\\$name\") -and (Get-Item \"Env:\\$name\").Value -eq $value) {\n        return # already set\n    }\n\n    #New-Item -LiteralPath \"Env:\\$name\".ToUpper() -Value $value -Force | Out-Null\n    Write-Host \"##vso[task.setvariable variable=$name]$value\"\n}\n\nFunction Test-ArtifactUploaded($artifactName) {\n    $varName = \"ARTIFACTUPLOADED_$($artifactName.ToUpper())\"\n    Test-Path \"env:$varName\"\n}\n\n& \"$PSScriptRoot/../tools/artifacts/_stage_all.ps1\" -ArtifactNameSuffix $ArtifactNameSuffix -AvoidSymbolicLinks:$AvoidSymbolicLinks |% {\n    # Set a variable which will out-live this script so that a subsequent attempt to collect and upload artifacts\n    # will skip this one from a check in the _all.ps1 script.\n    Set-PipelineVariable \"ARTIFACTSTAGED_$($_.Name.ToUpper())\" 'true'\n    Write-Host \"Staged artifact $($_.Name) to $($_.Path)\"\n\n    if (!$StageOnly) {\n        if (Test-ArtifactUploaded $_.Name) {\n            Write-Host \"Skipping $($_.Name) because it has already been uploaded.\" -ForegroundColor DarkGray\n        } else {\n            Write-Host \"##vso[artifact.upload containerfolder=$($_.Name);artifactname=$($_.Name);]$($_.Path)\"\n\n            # Set a variable which will out-live this script so that a subsequent attempt to collect and upload artifacts\n            # will skip this one from a check in the _all.ps1 script.\n            Set-PipelineVariable \"ARTIFACTUPLOADED_$($_.Name.ToUpper())\" 'true'\n        }\n    }\n}\n"
  },
  {
    "path": "azure-pipelines/release-deployment-prep.yml",
    "content": "steps:\n- download: CI\n  artifact: Variables-Windows\n  displayName: 🔻 Download Variables-Windows artifact\n- powershell: $(Pipeline.Workspace)/CI/Variables-Windows/_define.ps1\n  displayName: ⚙️ Set pipeline variables based on artifacts\n"
  },
  {
    "path": "azure-pipelines/release.yml",
    "content": "trigger: none # We only want to trigger manually or based on resources\npr: none\n\nresources:\n  repositories:\n  - repository: MicroBuildTemplate\n    type: git\n    name: 1ESPipelineTemplates/MicroBuildTemplate\n    ref: refs/tags/release\n  pipelines:\n  - pipeline: CI\n    source: slow-cheetah-ci\n    trigger:\n      tags:\n      - auto-release\n\nvariables:\n- template: GlobalVariables.yml\n\nextends:\n  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate\n  parameters:\n    sdl:\n      sourceAnalysisPool: VSEng-MicroBuildVSStable\n\n    stages:\n    - stage: release\n      jobs:\n      - job: nuget\n        displayName: 📦 Push nuget.org packages\n        pool:\n          name: AzurePipelines-EO\n          demands:\n          - ImageOverride -equals 1ESPT-Ubuntu22.04\n          os: Linux\n        templateContext:\n          outputs:\n          - output: nuget\n            displayName: 📦 Push packages to nuget.org\n            packagesToPush: '$(Pipeline.Workspace)/CI/deployables-Windows/NuGet/*.nupkg'\n            packageParentPath: $(Pipeline.Workspace)/CI/deployables-Windows/NuGet\n            allowPackageConflicts: true\n            nuGetFeedType: external\n            publishFeedCredentials: VisualStudioExtensibility (nuget.org)\n        steps:\n        - checkout: none\n        - download: CI\n          artifact: deployables-Windows\n          displayName: 🔻 Download deployables-Windows artifact\n          patterns: 'NuGet/*'\n      - job: github\n        displayName: 📢 GitHub release\n        dependsOn: nuget\n        pool:\n          name: AzurePipelines-EO\n          demands:\n          - ImageOverride -equals 1ESPT-Ubuntu22.04\n          os: Linux\n        templateContext:\n          type: releaseJob\n          isProduction: true\n          inputs:\n          - input: pipelineArtifact\n            pipeline: CI\n            artifactName: deployables-Windows\n            targetPath: $(Pipeline.Workspace)/CI/deployables-Windows\n        steps:\n        - checkout: none\n        - powershell: |\n            Write-Host \"##vso[build.updatebuildnumber]$(resources.pipeline.CI.runName)\"\n            if ('$(resources.pipeline.CI.runName)'.Contains('-')) {\n              Write-Host \"##vso[task.setvariable variable=IsPrerelease]true\"\n            } else {\n              Write-Host \"##vso[task.setvariable variable=IsPrerelease]false\"\n            }\n          displayName: ⚙ Set up pipeline\n        - task: GitHubRelease@1\n          displayName: 📢 GitHub release (create)\n          inputs:\n            gitHubConnection: ttstanley # service connection\n            repositoryName: $(Build.Repository.Name)\n            target: $(resources.pipeline.CI.sourceCommit)\n            tagSource: userSpecifiedTag\n            tag: v$(resources.pipeline.CI.runName)\n            title: v$(resources.pipeline.CI.runName)\n            isDraft: true # After running this step, visit the new draft release, edit, and publish.\n            isPreRelease: $(IsPrerelease)\n            assets: $(Pipeline.Workspace)/CI/deployables-Windows/NuGet/*.nupkg\n            changeLogCompareToRelease: lastNonDraftRelease\n            changeLogType: issueBased\n            changeLogLabels: |\n              [\n                { \"label\" : \"breaking change\", \"displayName\" : \"Breaking changes\", \"state\" : \"closed\" },\n                { \"label\" : \"bug\", \"displayName\" : \"Fixes\", \"state\" : \"closed\" },\n                { \"label\" : \"enhancement\", \"displayName\": \"Enhancements\", \"state\" : \"closed\" }\n              ]\n"
  },
  {
    "path": "azure-pipelines/unofficial.yml",
    "content": "trigger:\n  batch: true\n  branches:\n    include:\n    - main\n    - microbuild\n    - 'validate/*'\n  paths:\n    exclude:\n    - doc/\n    - '*.md'\n    - .vscode/\n    - azure-pipelines/release.yml\n    - azure-pipelines/vs-insertion.yml\n\nparameters:\n# As an entrypoint pipeline yml file, all parameters here show up in the Queue Run dialog.\n# If any paramaters should NOT be queue-time options, they should be removed from here\n# and references to them in this file replaced with hard-coded values.\n# - name: ShouldSkipOptimize # Uncomment this and references to it below when setting EnableOptProf to true in build.yml.\n#   displayName: Skip OptProf optimization\n#   type: boolean\n#   default: false\n- name: EnableMacOSBuild\n  displayName: Build on macOS\n  type: boolean\n  default: false # macOS is often bogged down in Azure Pipelines\n- name: RunTests\n  displayName: Run tests\n  type: boolean\n  default: true\n- name: EnableAPIScan\n  displayName: Include APIScan with compliance tools\n  type: boolean\n  default: false\n- name: EnableProductionSDL\n  displayName: Enable Production SDL\n  type: boolean\n  default: false\n- name: PublishCodeCoverage\n  displayName: Publish code coverage\n  type: boolean\n  default: true\n\nresources:\n  repositories:\n  - repository: MicroBuildTemplate\n    type: git\n    name: 1ESPipelineTemplates/MicroBuildTemplate\n    ref: refs/tags/release\n\nvariables:\n- template: GlobalVariables.yml\n\nextends:\n  template: azure-pipelines/MicroBuild.1ES.Unofficial.yml@MicroBuildTemplate\n  parameters:\n    sdl:\n      sourceAnalysisPool: VSEng-MicroBuildVSStable\n      credscan:\n        enabled: false\n      suppression:\n        suppressionFile: $(System.DefaultWorkingDirectory)\\azure-pipelines\\falsepositives.gdnsuppress\n      enableProductionSDL: ${{ parameters.EnableProductionSDL }}\n      codeSignValidation:\n        enabled: ${{ parameters.EnableProductionSDL }}\n        break: true\n        additionalTargetsGlobPattern: -|Variables-*\\*.ps1;-|APIScanInputs-*\\**;-|test_symbols-*\\**;-|MicroBuild\\**;-|$(Build.ArtifactStagingDirectory)\\VSInsertion-Windows\\vs-insertion-script.ps1\n        policyFile: $(MBSIGN_APPFOLDER)\\CSVTestSignPolicy.xml\n      policheck:\n        enabled: ${{ parameters.EnableProductionSDL }}\n        exclusionsFile: $(System.DefaultWorkingDirectory)\\azure-pipelines\\PoliCheckExclusions.xml\n      sbom:\n        enabled: false # Skip 1ES SBOM because microbuild has our own sbom system\n    stages:\n    - stage: Build\n      variables:\n      - template: /azure-pipelines/BuildStageVariables.yml@self\n      jobs:\n      - template: /azure-pipelines/build.yml@self\n        parameters:\n          Is1ESPT: true\n          RealSign: false\n          # ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}\n          EnableAPIScan: ${{ parameters.EnableAPIScan }}\n          windowsPool: VSEng-MicroBuildVSStable\n          linuxPool:\n            name: AzurePipelines-EO\n            demands:\n            - ImageOverride -equals 1ESPT-Ubuntu22.04\n            os: Linux\n          macOSPool:\n            name: Azure Pipelines\n            vmImage: macOS-15\n            os: macOS\n          EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}\n          RunTests: ${{ parameters.RunTests }}\n          PublishCodeCoverage: ${{ parameters.PublishCodeCoverage }}\n"
  },
  {
    "path": "azure-pipelines/vs-insertion-script.ps1",
    "content": "# List of build artifact files [Source => Destination] to be committed into the VS repo.\n$FilesToCommit = @{\n    \"$env:PROFILINGINPUTSPROPSNAME\" = \"src/Tests/config/runsettings/Official/OptProf/External/$env:PROFILINGINPUTSPROPSNAME\";\n}\n\nforeach ($File in $FilesToCommit.GetEnumerator()) {\n    $SourcePath = Join-Path $PSScriptRoot $File.Key\n    if (Test-Path $SourcePath) {\n        $DestinationPath = Join-Path (Get-Location) $File.Value\n        Write-Host \"Copying $SourcePath to $DestinationPath\"\n        Copy-Item -Path $SourcePath -Destination $DestinationPath\n        git add $DestinationPath\n    }\n    else {\n        Write-Host \"$SourcePath is not present, skipping\"\n    }\n}\n"
  },
  {
    "path": "azure-pipelines/vs-insertion.yml",
    "content": "trigger: none # We only want to trigger manually or based on resources\npr: none\n\nresources:\n  repositories:\n  - repository: MicroBuildTemplate\n    type: git\n    name: 1ESPipelineTemplates/MicroBuildTemplate\n    ref: refs/tags/release\n  pipelines:\n  - pipeline: CI\n    source: Library # TODO: This should match the name of your CI pipeline\n    tags:\n    - Real signed\n    trigger:\n      tags:\n      - Real signed\n\nvariables:\n- template: GlobalVariables.yml\n\nextends:\n  template: azure-pipelines/MicroBuild.1ES.Official.yml@MicroBuildTemplate\n  parameters:\n    sdl:\n      sourceAnalysisPool: VSEng-MicroBuildVSStable\n      sbom:\n        enabled: false\n\n    stages:\n    - stage: insertion\n      jobs:\n      - job: insertion\n        displayName: VS insertion\n        pool: VSEng-MicroBuildVSStable\n        templateContext:\n          outputParentDirectory: $(Pipeline.Workspace)/CI\n        steps:\n        - checkout: none\n        - powershell: Write-Host \"##vso[build.updatebuildnumber]$(resources.pipeline.CI.runName)\"\n          displayName: ⚙️ Set pipeline name\n        - template: azure-pipelines/release-deployment-prep.yml@self\n        - download: CI\n          artifact: VSInsertion-Windows\n          displayName: 🔻 Download VSInsertion-Windows artifact\n        - ${{ if eq(variables['ContainsVsix'], 'true') }}:\n          - task: 1ES.MicroBuildVstsDrop@1\n            displayName: 🔺 Upload VSTS Drop\n            inputs:\n              dropFolder: $(Pipeline.Workspace)/CI/VSInsertion-windows/Vsix\n              dropName: $(VstsDropNames)\n              accessToken: $(System.AccessToken)\n        - task: 1ES.PublishNuget@1\n          displayName: 📦 Push VS-repo packages to VS feed\n          inputs:\n            packagesToPush: '$(Pipeline.Workspace)/CI/VSInsertion-Windows/*.nupkg'\n            packageParentPath: $(Pipeline.Workspace)/CI/VSInsertion-Windows\n            allowPackageConflicts: true\n            publishVstsFeed: VS\n        - task: MicroBuildInsertVsPayload@5\n          displayName: 🏭 Insert VS Payload\n          inputs:\n            TeamName: $(TeamName)\n            TeamEmail: $(TeamEmail)\n            InsertionPayloadName: $(Build.Repository.Name) $(Build.BuildNumber)\n            InsertionBuildPolicies: Request Perf DDRITs\n            InsertionReviewers: $(Build.RequestedFor) # Append `,Your team name` (without quotes)\n            CustomScriptExecutionCommand: $(Pipeline.Workspace)\\CI\\VSInsertion-Windows\\vs-insertion-script.ps1\n            AutoCompletePR: true\n            AutoCompleteMergeStrategy: Squash\n            ShallowClone: true\n            ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:\n              ConnectedVSDropServiceName: 'VSEng-VSDrop-MI'\n          env:\n            SYSTEM_ACCESSTOKEN: $(System.AccessToken)\n\n        - powershell: |\n            $contentType = 'application/json';\n            $headers = @{ Authorization = 'Bearer $(System.AccessToken)' };\n            $rawRequest = @{ daysValid = 365 * 2; definitionId = $(resources.pipeline.CI.pipelineID); ownerId = 'User:$(Build.RequestedForId)'; protectPipeline = $false; runId = $(resources.pipeline.CI.runId) };\n            $request = ConvertTo-Json @($rawRequest);\n            Write-Host $request\n            $uri = \"$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases?api-version=6.0-preview.1\";\n            Invoke-RestMethod -uri $uri -method POST -Headers $headers -ContentType $contentType -Body $request;\n          displayName: 🗻 Retain inserted builds\n"
  },
  {
    "path": "azure-pipelines/vs-validation.yml",
    "content": "# This is a top-level pipeline file, which is designed to be added as an optional PR build policy\n# so that a VS insertion and all the validation that entails can be done before ever merging the PR\n# in its original repo.\n\ntrigger: none # We only want to trigger manually or based on resources\npr: none\n\n# parameters:\n# - name: ShouldSkipOptimize # Uncomment this and references to it below when setting EnableOptProf to true in build.yml.\n#   displayName: Skip OptProf optimization\n#   type: boolean\n#   default: false\n\nresources:\n  repositories:\n  - repository: MicroBuildTemplate\n    type: git\n    name: 1ESPipelineTemplates/MicroBuildTemplate\n    ref: refs/tags/release\n\nvariables:\n- template: GlobalVariables.yml\n- name: MicroBuild_NuPkgSigningEnabled\n  value: false # test-signed nuget packages fail to restore in the VS insertion PR validations. Just don't sign them *at all*.\n\nextends:\n  template: azure-pipelines/MicroBuild.1ES.Unofficial.yml@MicroBuildTemplate\n  parameters:\n    sdl:\n      sourceAnalysisPool: VSEng-MicroBuildVSStable\n      credscan:\n        enabled: false\n\n    stages:\n    - stage: Build\n      variables:\n      - template: /azure-pipelines/BuildStageVariables.yml@self\n      - name: SkipCodesignVerify\n        value: true\n\n      jobs:\n      - template: /azure-pipelines/build.yml@self\n        parameters:\n          Is1ESPT: true\n          RealSign: false\n          # ShouldSkipOptimize: ${{ parameters.ShouldSkipOptimize }}\n          windowsPool: VSEng-MicroBuildVSStable\n          linuxPool:\n            name: AzurePipelines-EO\n            demands:\n            - ImageOverride -equals 1ESPT-Ubuntu22.04\n            os: Linux\n          macOSPool:\n            name: Azure Pipelines\n            vmImage: macOS-15\n            os: macOS\n          EnableMacOSBuild: false\n          RunTests: false\n          SkipCodesignVerify: true\n\n    - template: /azure-pipelines/prepare-insertion-stages.yml@self\n      parameters:\n        ArchiveSymbols: false\n        RealSign: false\n\n    - stage: insertion\n      displayName: VS insertion\n      jobs:\n      - job: insertion\n        displayName: VS insertion\n        pool: VSEng-MicroBuildVSStable\n        steps:\n        - checkout: self\n          clean: true\n          fetchDepth: 1\n        - download: current\n          artifact: Variables-Windows\n          displayName: 🔻 Download Variables-Windows artifact\n        - powershell: $(Pipeline.Workspace)/Variables-Windows/_define.ps1\n          displayName: ⚙️ Set pipeline variables based on artifacts\n        - download: current\n          artifact: VSInsertion-Windows\n          displayName: 🔻 Download VSInsertion-Windows artifact\n        - ${{ if eq(variables['ContainsVsix'], 'true') }}:\n          - task: 1ES.MicroBuildVstsDrop@1\n            displayName: 🔺 Upload VSTS Drop\n            inputs:\n              dropFolder: $(Pipeline.Workspace)/VSInsertion-windows/Vsix\n              dropName: $(VstsDropNames)\n              accessToken: $(System.AccessToken)\n        - task: 1ES.PublishNuget@1\n          displayName: 📦 Push VS-repo packages to VS feed\n          inputs:\n            packagesToPush: '$(Pipeline.Workspace)/VSInsertion-Windows/*.nupkg'\n            packageParentPath: $(Pipeline.Workspace)/VSInsertion-Windows\n            allowPackageConflicts: true\n            publishVstsFeed: VS\n        - task: MicroBuildInsertVsPayload@5\n          displayName: 🏭 Insert VS Payload\n          inputs:\n            TeamName: $(TeamName)\n            TeamEmail: $(TeamEmail)\n            InsertionPayloadName: $(Build.Repository.Name) VALIDATION BUILD $(Build.BuildNumber) ($(Build.SourceBranch)) [Skip-SymbolCheck] [Skip-HashCheck] [Skip-SignCheck]\n            InsertionDescription: |\n              This PR is for **validation purposes only** for !$(System.PullRequest.PullRequestId). **Do not complete**.\n            CustomScriptExecutionCommand: $(Pipeline.Workspace)\\VSInsertion-Windows\\vs-insertion-script.ps1; src\\VSSDK\\NuGet\\AllowUnstablePackages.ps1\n            InsertionBuildPolicies: Request Perf DDRITs\n            InsertionReviewers: $(Build.RequestedFor)\n            DraftPR: false # set to true and update InsertionBuildPolicy when we can specify all the validations we want to run (https://dev.azure.com/devdiv/DevDiv/_workitems/edit/2224288)\n            AutoCompletePR: false\n            ShallowClone: true\n            ${{ if eq(variables['system.collectionId'], '011b8bdf-6d56-4f87-be0d-0092136884d9') }}:\n              ConnectedVSDropServiceName: 'VSEng-VSDrop-MI'\n          env:\n            SYSTEM_ACCESSTOKEN: $(System.AccessToken)\n        - powershell: |\n            $insertionPRId = azure-pipelines/Get-InsertionPRId.ps1\n            $Markdown = @\"\n            Validation insertion pull request created: !$insertionPRId\n            Please check status there before proceeding to merge this PR.\n            Remember to Abandon and (if allowed) to Delete Source Branch on that insertion PR when validation is complete.\n            \"@\n            azure-pipelines/PostPRMessage.ps1 -AccessToken '$(System.AccessToken)' -Markdown $Markdown -Verbose\n          displayName: ✏️ Comment on pull request\n          condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))\n"
  },
  {
    "path": "azure-pipelines.yml",
    "content": "trigger:\n  batch: true\n  branches:\n    include:\n    - main\n    - 'v*.*'\n    - microbuild\n    - 'validate/*'\n  paths:\n    exclude:\n    - doc/\n    - '*.md'\n    - .vscode/\n    - .github/\n    - azure-pipelines/release.yml\n\nparameters:\n- name: EnableMacOSBuild\n  displayName: Build on macOS\n  type: boolean\n  default: false # macOS is often bogged down in Azure Pipelines\n- name: RunTests\n  displayName: Run tests\n  type: boolean\n  default: true\n\nvariables:\n- template: /azure-pipelines/BuildStageVariables.yml@self\n\njobs:\n- template: azure-pipelines/build.yml\n  parameters:\n    Is1ESPT: false\n    EnableMacOSBuild: ${{ parameters.EnableMacOSBuild }}\n    RunTests: ${{ parameters.RunTests }}\n"
  },
  {
    "path": "doc/targets.md",
    "content": "# SlowCheetah Build Targets\n\n### Summary\nSlowCheetah alters the build process for projects to ensure that the transformations are executed in the correct order and that the transformed files are used properly. To allow users to extend the behavior for their own build process, this document outlines all the native targets for SlowCheetah, including properties and items that can be modified to alter existing target behavior.\n\n## Main\n\n### Targets\n\n**ScCollectTransformFiles**: Collects all the files with *TransformOnBuild* true and adds them to *ScFilesToTransform*, with the necessary metadata for transformation. Runs before *ScApplyTransforms*.\n\n**ScApplyTransforms**: First creates the destination directory for all the transformations that will occur. Then, applies the transform task to each item of *ScFilesToTransform* per their metadata. Runs after *CopyFilesToOutputDirectory*.\n\n### Properties\n\n**ScAllowReferencedConfig**: Whether config files from referenced projects are allowed when resolving references. Defaults to true.\n\n**BuildDependsOn**: List of targets that should be run as part of the build process. *ScApplyTransforms* get appended to this.\n\n### ItemGroups\n\n**ScFilesToTransform**: Populated in ScCollectTransformationFiles. Contains all the data for files that should be transformed. Metadata:\n\n- *SourceFile*: Transformation source.\n\n- *TransformFile*: Transformation input.\n\n- *DestinationFile*: Output file of transformation. The directory for this file is created in case it does not previously exist.\n\n## App\n\n### Targets\n\n**ScCollectAppFiles**: Removes the app.config file from *ScFilesToTransform* and adds it to ScAppConfigToTransform for separate transformation. Copies the original app.config to *ScIntermediateAppConfig*. Depends on *ScCollectTransformFiles*. Runs before *ScApplyTransforms*.\n\n**ScTransformAppConfig**: Performs transformations on *ScIntermediateAppConfig*. Replaces the app config location before it is copied to the output. Depends on *ScCollectAppFiles*. Runs before *_CopyAppConfig*.\n\n### Properties\n\n**ScIsApp**: Whether the project is an application. Used in *SetupProject* and *ClickOnce* targets. If *ScIsWap* is true, sets to false. Defaults to true.\n\n**ScAppConfigName**: Name of the application configuration file that should be especially transformed. Defaults to “app.config”.\n\n### Item Groups\n\n**ScAppConfigToTransform**: Populated in *ScCollectAppFiles*. Contains data for application configuration files that should be transformed. For metadata, see *ScFilesToTransform*.\n\n## Web\n\n### Targets\n\n**ScCollectWebFiles**: Gets the publish configuration and adds publish transformation data to ScFilesToTransform. Depends on *ScCollectTransformFiles*. Runs before *ScApplyWebTransforms*.\n\n**ScApplyWebTransforms**: Inserted into the deploy pipeline. Depends on *ScApplyTransforms*.\n\n### Properties\n\n**ScIsWap**: Whether the project is a web application. Verifies the project GUIDs. Defaults to false.\n\n**ScAppConfigName**: Changed to “web.config”.\n\n### ItemGroups\n\n**ScFilesToTransform**: Adds publish transform metadata:\n- *PublishDestinationFile*: Location of the temporary directory used to publish from\n- *PublishTransformFile*: Location of the publish profile transform file.\n\n## Additional Targets\n\n### SetupProject\n\nEnsures a Setup Project uses the correct location for copying output files. Enabled if *ScEnableSetupProjects* is true (default is true).\n\n### ClickOnce\n\nEnsures that the published files are extracted from the correct location for Click Once publishing."
  },
  {
    "path": "doc/transforming_files.md",
    "content": "# Transforming Files with SlowCheetah\n\n## Summary\nThe [SlowCheetah Visual Studio extension](https://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms) allows you to add and preview transformation to files in your project.\n\nThe [SlowCheetah NuGet package](https://www.nuget.org/packages/Microsoft.VisualStudio.SlowCheetah) is required for build-time transformations, which are discussed in more detail below.\n\n## Getting Started\n\nOnce the SlowCheetah extension has been installed, transformations are added by right-clicking a file. If the file type is supported, the `Add Transform` option should be visible.\n\n![Add Transform](AddTransforms.png)\n\nSelecting this option will add transform files according to your project's [build configurations](https://docs.microsoft.com/en-us/visualstudio/ide/understanding-build-configurations). If the project has any publish profiles, transform files are also created for them.\n\n![Transform files](TransformFiles.png)\n\nTo quickly preview the transformations, right-click any of the transform files and select the `Preview Transform` option.\n\n![Transform files](PreviewTransform.png)\n\n![Transform files](PreviewDiff.png)\n\n## Executing Build-Time Transformations\n\nThe SlowCheetah NuGet package adds transformations logic to the build process of the project. By adding transforms using the extension and having the package installed to the project, transformations will be executed on build.\n\nIt is possible to perform build-time transformation using only the NuGet package. Files that should be transformed require the `TransformOnBuild` metadata set to true. Files that specify the transformations should have the `IsTransformFile` metadata set to true. If your project supports the `DependentUpon` metadata, add that to the transform files, specifying the original file. The resulting project file would look similar to this:\n\n``` xml\n<None Include=\"App.config\">\n    <TransformOnBuild>true</TransformOnBuild>\n</None>\n<None Include=\"App.Debug.config\">\n    <DependentUpon>App.config</DependentUpon>\n    <IsTransformFile>True</IsTransformFile>\n</None>\n<None Include=\"App.Release.config\">\n    <DependentUpon>App.config</DependentUpon>\n    <IsTransformFile>True</IsTransformFile>\n</None>\n```\n"
  },
  {
    "path": "doc/update.md",
    "content": "# SlowCheetah in VS 2017 \n\nWe have made significant changes to the SlowCheetah extension and NuGet package. This is because the old version had the following limitations:\n- Installation methods were inconsistent throughout versions, mixing VS extensions with NuGet packages\n- Build tools were installed directly to the local app data\n- Users' project files were manually edited to include SC files\n- Unnecessary files were imported into the project\n\nTo fix these issues, the new version includes the following: \n- Support for Visual Studio 2015 and 2017 \n- A VS extension that assists with adding and previewing transform \n- A NuGet package that handles all the build and transformation logic \n\nTo use this new version, the older one must be manually removed from your project before installing the new version. From here on, all updates to the extension and NuGet packages will be handled by their respective platform.  \n\n## Instructions \n\nIf SlowCheetah has never been installed on your computer or used in any of your projects, simply install the latest Nuget package [here](https://www.nuget.org/packages/Microsoft.VisualStudio.SlowCheetah/).\n\nVersion 3.0.61 and higher of the SlowCheetah Extension should prompt the user to automatically remove any present older installations. If you have issues with this, the following instructions guide you through manually updating your project.\n\nIf you have used SlowCheetah before, remove the following lines from your project file. \n\nFirst, a PropertyGroup that looks like this:\n\n``` XML\n<PropertyGroup Label=\"SlowCheetah\">\n  <SlowCheetahToolsPath>$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\\..\\packages\\SlowCheetah.2.5.15\\tools\\))</SlowCheetahToolsPath>\n  <SlowCheetah_EnableImportFromNuGet Condition=\" '$(SlowCheetah_EnableImportFromNuGet)'=='' \">true</SlowCheetah_EnableImportFromNuGet>\n  <SlowCheetah_NuGetImportPath Condition=\" '$(SlowCheetah_NuGetImportPath)'=='' \">$([System.IO.Path]::GetFullPath( $(MSBuildProjectDirectory)\\Properties\\SlowCheetah\\SlowCheetah.Transforms.targets ))</SlowCheetah_NuGetImportPath>\n  <SlowCheetahTargets Condition=\" '$(SlowCheetah_EnableImportFromNuGet)'=='true' and Exists('$(SlowCheetah_NuGetImportPath)') \">$(SlowCheetah_NuGetImportPath)</SlowCheetahTargets>\n</PropertyGroup>\n```\nThen, remove an import that looks like this:\n\n``` XML\n<Import Project=\"$(SlowCheetahTargets)\" Condition=\"Exists('$(SlowCheetahTargets)')\" Label=\"SlowCheetah\" />\n```\n\nLastly, remove the following includes:\n\n``` XML\n<None Include=\"packageRestore.proj\" />\n<None Include=\"Properties\\SlowCheetah\\SlowCheetah.Transforms.targets\" />\n```\n\nAlso, delete the `Properties\\SlowCheetah` folder and the `packageRestore.proj` file from your project if they are present. If there are any other lines in the project file or any items in the project tree related to SlowCheetah, those should also be removed. All SlowCheetah related lines that  should be present are the transformation files which are marked with `<IsTransformFile>true</IsTransformFile>` on the project file.\n\nNow, install or update to the latest SlowCheetah package through the NuGet package manager and download the latest extension from the Visual Studio extension gallery.\n\nOptionally, if you no longer plan on using the older version of SlowCheetah on any projects, you may safely delete the `%LocalAppData%\\Microsoft\\MSBuild\\SlowCheetah` folder.\n"
  },
  {
    "path": "docfx/.gitignore",
    "content": "_site/\napi/\n"
  },
  {
    "path": "docfx/docfx.json",
    "content": "{\n    \"metadata\": [\n        {\n            \"src\": [\n                {\n                    \"src\": \"../src/Library\",\n                    \"files\": [\n                        \"**/*.csproj\"\n                    ]\n                }\n            ],\n            \"dest\": \"api\"\n        }\n    ],\n    \"build\": {\n        \"content\": [\n            {\n                \"files\": [\n                    \"**/*.{md,yml}\"\n                ],\n                \"exclude\": [\n                    \"_site/**\"\n                ]\n            }\n        ],\n        \"resource\": [\n            {\n                \"files\": [\n                    \"images/**\"\n                ]\n            }\n        ],\n        \"xref\": [\n            \"https://learn.microsoft.com/en-us/dotnet/.xrefmap.json\"\n        ],\n        \"output\": \"_site\",\n        \"template\": [\n            \"default\",\n            \"modern\"\n        ],\n        \"globalMetadata\": {\n            \"_appName\": \"Library\",\n            \"_appTitle\": \"Library\",\n            \"_enableSearch\": true,\n            \"pdf\": false\n        }\n    }\n}\n"
  },
  {
    "path": "docfx/docs/features.md",
    "content": "# Features\n\nTODO\n"
  },
  {
    "path": "docfx/docs/getting-started.md",
    "content": "# Getting Started\n\n## Installation\n\nConsume this library via its NuGet Package.\nClick on the badge to find its latest version and the instructions for consuming it that best apply to your project.\n\n[![NuGet package](https://img.shields.io/nuget/v/Library.svg)](https://nuget.org/packages/Library)\n\n## Usage\n\nTODO\n"
  },
  {
    "path": "docfx/docs/toc.yml",
    "content": "items:\n- name: Features\n  href: features.md\n- name: Getting Started\n  href: getting-started.md\n"
  },
  {
    "path": "docfx/index.md",
    "content": "---\n_layout: landing\n---\n\n# Overview\n\nThis is your docfx landing page.\n\nClick \"Docs\" across the top to get started.\n"
  },
  {
    "path": "docfx/toc.yml",
    "content": "items:\n- name: Docs\n  href: docs/\n- name: API\n  href: api/\n"
  },
  {
    "path": "global.json",
    "content": "{\n  \"sdk\": {\n    \"version\": \"10.0.204\",\n    \"rollForward\": \"patch\",\n    \"allowPrerelease\": false\n  },\n  \"msbuild-sdks\": {\n    \"Microsoft.Build.NoTargets\": \"3.7.56\",\n    \"Microsoft.Build.Traversal\": \"3.1.6\"\n  }\n}\n"
  },
  {
    "path": "init.cmd",
    "content": "@echo off\nSETLOCAL\nset PS1UnderCmd=1\n\n:: Get the datetime in a format that can go in a filename.\nset _my_datetime=%date%_%time%\nset _my_datetime=%_my_datetime: =_%\nset _my_datetime=%_my_datetime::=%\nset _my_datetime=%_my_datetime:/=_%\nset _my_datetime=%_my_datetime:.=_%\nset CmdEnvScriptPath=%temp%\\envvarscript_%_my_datetime%.cmd\n\npowershell.exe -NoProfile -NoLogo -ExecutionPolicy bypass -Command \"try { & '%~dpn0.ps1' %*; exit $LASTEXITCODE } catch { write-host $_; exit 1 }\"\n\n:: Set environment variables in the parent cmd.exe process.\nIF EXIST \"%CmdEnvScriptPath%\" (\n    ENDLOCAL\n    CALL \"%CmdEnvScriptPath%\"\n    DEL \"%CmdEnvScriptPath%\"\n)\n"
  },
  {
    "path": "init.ps1",
    "content": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n    Installs dependencies required to build and test the projects in this repository.\n.DESCRIPTION\n    This MAY not require elevation, as the SDK and runtimes are installed to a per-user location,\n    unless the `-InstallLocality` switch is specified directing to a per-repo or per-machine location.\n    See detailed help on that switch for more information.\n\n    The CmdEnvScriptPath environment variable may be optionally set to a path to a cmd shell script to be created (or appended to if it already exists) that will set the environment variables in cmd.exe that are set within the PowerShell environment.\n    This is used by init.cmd in order to reapply any new environment variables to the parent cmd.exe process that were set in the powershell child process.\n.PARAMETER InstallLocality\n    A value indicating whether dependencies should be installed locally to the repo or at a per-user location.\n    Per-user allows sharing the installed dependencies across repositories and allows use of a shared expanded package cache.\n    Visual Studio will only notice and use these SDKs/runtimes if VS is launched from the environment that runs this script.\n    Per-repo allows for high isolation, allowing for a more precise recreation of the environment within an Azure Pipelines build.\n    When using 'repo', environment variables are set to cause the locally installed dotnet SDK to be used.\n    Per-repo can lead to file locking issues when dotnet.exe is left running as a build server and can be mitigated by running `dotnet build-server shutdown`.\n    Per-machine requires elevation and will download and install all SDKs and runtimes to machine-wide locations so all applications can find it.\n.PARAMETER NoPrerequisites\n    Skips the installation of prerequisite software (e.g. SDKs, tools).\n.PARAMETER NoNuGetCredProvider\n    Skips the installation of the NuGet credential provider. Useful in pipelines with the `NuGetAuthenticate` task, as a workaround for https://github.com/microsoft/artifacts-credprovider/issues/244.\n    This switch is ignored and installation is skipped when -NoPrerequisites is specified.\n.PARAMETER UpgradePrerequisites\n    Takes time to install prerequisites even if they are already present in case they need to be upgraded.\n    No effect if -NoPrerequisites is specified.\n.PARAMETER NoRestore\n    Skips the package restore step.\n.PARAMETER NoToolRestore\n    Skips the dotnet tool restore step.\n.PARAMETER Signing\n    Install the MicroBuild signing plugin for building test-signed builds on desktop machines.\n.PARAMETER Localization\n    Install the MicroBuild localization plugin for building loc builds on desktop machines.\n    The environment is configured to build pseudo-loc for JPN only, but may be used to build\n    all languages with shipping-style loc by using the `/p:loctype=full,loclanguages=vs`\n    when building.\n.PARAMETER Setup\n    Install the MicroBuild setup plugin for building VSIXv3 packages.\n.PARAMETER OptProf\n    Install the MicroBuild OptProf plugin for building optimized assemblies on desktop machines.\n.PARAMETER Sbom\n    Install the MicroBuild SBOM plugin.\n.PARAMETER AccessToken\n    An optional access token for authenticating to Azure Artifacts authenticated feeds.\n.PARAMETER Interactive\n    Runs NuGet restore in interactive mode. This can turn authentication failures into authentication challenges.\n#>\n[CmdletBinding(SupportsShouldProcess = $true)]\nParam (\n    [ValidateSet('repo', 'user', 'machine')]\n    [string]$InstallLocality = 'user',\n    [Parameter()]\n    [switch]$NoPrerequisites,\n    [Parameter()]\n    [switch]$NoNuGetCredProvider,\n    [Parameter()]\n    [switch]$UpgradePrerequisites,\n    [Parameter()]\n    [switch]$NoRestore,\n    [Parameter()]\n    [switch]$NoToolRestore,\n    [Parameter()]\n    [switch]$Signing,\n    [Parameter()]\n    [switch]$Localization,\n    [Parameter()]\n    [switch]$Setup,\n    [Parameter()]\n    [switch]$OptProf,\n    [Parameter()]\n    [switch]$SBOM,\n    [Parameter()]\n    [string]$AccessToken,\n    [Parameter()]\n    [switch]$Interactive\n)\n\n$EnvVars = @{}\n$PrependPath = @()\n\nif (!$NoPrerequisites) {\n    if (!$NoNuGetCredProvider) {\n        & \"$PSScriptRoot\\tools\\Install-NuGetCredProvider.ps1\" -AccessToken $AccessToken -Force:$UpgradePrerequisites\n    }\n\n    & \"$PSScriptRoot\\tools\\Install-DotNetSdk.ps1\" -InstallLocality $InstallLocality\n    if ($LASTEXITCODE -eq 3010) {\n        Exit 3010\n    }\n\n    # The procdump tool and env var is required for dotnet test to collect hang/crash dumps of tests.\n    # But it only works on Windows.\n    if ($env:OS -eq 'Windows_NT') {\n        $EnvVars['PROCDUMP_PATH'] = & \"$PSScriptRoot\\tools\\Get-ProcDump.ps1\"\n    }\n}\n\n# Workaround nuget credential provider bug that causes very unreliable package restores on Azure Pipelines\n$env:NUGET_PLUGIN_HANDSHAKE_TIMEOUT_IN_SECONDS = 20\n$env:NUGET_PLUGIN_REQUEST_TIMEOUT_IN_SECONDS = 20\n\nPush-Location $PSScriptRoot\ntry {\n    $HeaderColor = 'Green'\n\n    $RestoreArguments = @()\n    if ($Interactive) {\n        $RestoreArguments += '--interactive'\n    }\n\n    if (!$NoRestore -and $PSCmdlet.ShouldProcess(\"NuGet packages\", \"Restore\")) {\n        Write-Host \"Restoring NuGet packages\" -ForegroundColor $HeaderColor\n        dotnet restore @RestoreArguments src\n        if ($lastexitcode -ne 0) {\n            throw \"Failure while restoring packages.\"\n        }\n    }\n\n    if (!$NoToolRestore -and $PSCmdlet.ShouldProcess(\"dotnet tool\", \"restore\")) {\n        dotnet tool restore @RestoreArguments\n        if ($lastexitcode -ne 0) {\n            throw \"Failure while restoring dotnet CLI tools.\"\n        }\n    }\n\n    $InstallNuGetPkgScriptPath = \"$PSScriptRoot\\tools\\Install-NuGetPackage.ps1\"\n    $nugetVerbosity = 'quiet'\n    if ($Verbose) { $nugetVerbosity = 'normal' }\n    $MicroBuildPackageSource = 'https://pkgs.dev.azure.com/devdiv/_packaging/MicroBuildToolset%40Local/nuget/v3/index.json'\n    if ($Signing) {\n        Write-Host \"Installing MicroBuild signing plugin\" -ForegroundColor $HeaderColor\n        & $InstallNuGetPkgScriptPath MicroBuild.Plugins.Signing -source $MicroBuildPackageSource -Verbosity $nugetVerbosity\n        $EnvVars['SignType'] = \"Test\"\n    }\n\n    if ($Setup) {\n        Write-Host \"Installing MicroBuild SwixBuild plugin...\" -ForegroundColor $HeaderColor\n        & $InstallNuGetPkgScriptPath Microsoft.VisualStudioEng.MicroBuild.Plugins.SwixBuild -source $MicroBuildPackageSource -Verbosity $nugetVerbosity\n    }\n\n    if ($OptProf) {\n        Write-Host \"Installing MicroBuild OptProf plugin\" -ForegroundColor $HeaderColor\n        & $InstallNuGetPkgScriptPath MicroBuild.Plugins.OptProf -source $MicroBuildPackageSource -Verbosity $nugetVerbosity\n        $EnvVars['OptProfEnabled'] = '1'\n    }\n\n    if ($Localization) {\n        Write-Host \"Installing MicroBuild localization plugin\" -ForegroundColor $HeaderColor\n        & $InstallNuGetPkgScriptPath MicroBuild.Plugins.Localization -source $MicroBuildPackageSource -Verbosity $nugetVerbosity\n        $EnvVars['LocType'] = \"Pseudo\"\n        $EnvVars['LocLanguages'] = \"JPN\"\n    }\n\n    if ($SBOM) {\n        Write-Host \"Installing MicroBuild SBOM plugin\" -ForegroundColor $HeaderColor\n        & $InstallNuGetPkgScriptPath MicroBuild.Plugins.Sbom -source $MicroBuildPackageSource -Verbosity $nugetVerbosity\n        # The feed with the latest versions of the tool is at 'https://1essharedassets.pkgs.visualstudio.com/1esPkgs/_packaging/SBOMTool/nuget/v3/index.json',\n        # but we'll use the feed that the SBOM task itself uses to install the tool for consistency.\n        $PkgMicrosoft_ManifestTool_CrossPlatform = & $InstallNuGetPkgScriptPath Microsoft.ManifestTool.CrossPlatform -source $MicroBuildPackageSource -Verbosity $nugetVerbosity\n        $EnvVars['GenerateSBOM'] = \"true\"\n        $EnvVars['PkgMicrosoft_ManifestTool_CrossPlatform'] = $PkgMicrosoft_ManifestTool_CrossPlatform\n    }\n\n    & \"$PSScriptRoot/tools/Set-EnvVars.ps1\" -Variables $EnvVars -PrependPath $PrependPath | Out-Null\n}\ncatch {\n    Write-Error $error[0]\n    exit $lastexitcode\n}\nfinally {\n    Pop-Location\n}\n"
  },
  {
    "path": "nuget.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <config>\n    <add key=\"repositorypath\" value=\"packages\" />\n  </config>\n  <packageSources>\n    <!--To inherit the global NuGet package sources remove the <clear/> line below -->\n    <clear />\n    <add key=\"msft_consumption\" value=\"https://pkgs.dev.azure.com/azure-public/vside/_packaging/msft_consumption/nuget/v3/index.json\" />\n    <!-- <add key=\"msft_consumption\" value=\"https://pkgs.dev.azure.com/devdiv/DevDiv/_packaging/VS-Platform/nuget/v3/index.json\" /> -->\n  </packageSources>\n  <disabledPackageSources>\n    <!-- Defend against user or machine level disabling of sources that we list in this file. -->\n    <clear />\n  </disabledPackageSources>\n</configuration>"
  },
  {
    "path": "samples/FSharpDemo/FSharpDemo.fsproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProductVersion>8.0.30703</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{85361198-db0e-4528-a513-80e025de74a0}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>FSharpDemo</RootNamespace>\n    <AssemblyName>FSharpDemo</AssemblyName>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n    <TargetFrameworkProfile>Client</TargetFrameworkProfile>\n    <Name>FSharpDemo</Name>\n    <SccProjectName>\n    </SccProjectName>\n    <SccProvider>\n    </SccProvider>\n    <SccAuxPath>\n    </SccAuxPath>\n    <SccLocalPath>\n    </SccLocalPath>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <Tailcalls>false</Tailcalls>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <WarningLevel>3</WarningLevel>\n    <PlatformTarget>x86</PlatformTarget>\n    <DocumentationFile>bin\\Debug\\FSharpDemo.XML</DocumentationFile>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <Tailcalls>true</Tailcalls>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <WarningLevel>3</WarningLevel>\n    <PlatformTarget>x86</PlatformTarget>\n    <DocumentationFile>bin\\Release\\FSharpDemo.XML</DocumentationFile>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SlowCheetahTargets Condition=\" '$(SlowCheetahTargets)'=='' \">$(LOCALAPPDATA)\\Microsoft\\MSBuild\\SlowCheetah\\v1\\SlowCheetah.Transforms.targets</SlowCheetahTargets>\n  </PropertyGroup>\n  <PropertyGroup>\n    <MinimumVisualStudioVersion Condition=\"'$(MinimumVisualStudioVersion)' == ''\">11</MinimumVisualStudioVersion>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath32)\\..\\Microsoft SDKs\\F#\\3.0\\Framework\\v4.0\\Microsoft.FSharp.Targets\" Condition=\"Exists('$(MSBuildExtensionsPath32)\\..\\Microsoft SDKs\\F#\\3.0\\Framework\\v4.0\\Microsoft.FSharp.Targets')\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\..\\Microsoft F#\\v4.0\\Microsoft.FSharp.Targets\" Condition=\"(!Exists('$(MSBuildExtensionsPath32)\\..\\Microsoft SDKs\\F#\\3.0\\Framework\\v4.0\\Microsoft.FSharp.Targets')) And (Exists('$(MSBuildExtensionsPath32)\\..\\Microsoft F#\\v4.0\\Microsoft.FSharp.Targets'))\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\FSharp\\1.0\\Microsoft.FSharp.Targets\" Condition=\"(!Exists('$(MSBuildExtensionsPath32)\\..\\Microsoft SDKs\\F#\\3.0\\Framework\\v4.0\\Microsoft.FSharp.Targets')) And (!Exists('$(MSBuildExtensionsPath32)\\..\\Microsoft F#\\v4.0\\Microsoft.FSharp.Targets')) And (Exists('$(MSBuildExtensionsPath32)\\FSharp\\1.0\\Microsoft.FSharp.Targets'))\" />\n  <ItemGroup>\n    <Compile Include=\"Program.fs\" />\n    <None Include=\"app.config\">\n      <TransformOnBuild>true</TransformOnBuild>\n    </None>\n    <None Include=\"app.Debug.config\">\n      <IsTransformFile>True</IsTransformFile>\n    </None>\n    <None Include=\"app.Release.config\">\n      <IsTransformFile>True</IsTransformFile>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Reference Include=\"mscorlib\" />\n    <Reference Include=\"FSharp.Core\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Numerics\" />\n  </ItemGroup>\n  <Import Project=\"$(SlowCheetahTargets)\" Condition=\"Exists('$(SlowCheetahTargets)')\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n\t     Other similar extension points exist, see Microsoft.Common.targets.\n\t<Target Name=\"BeforeBuild\">\n\t</Target>\n\t<Target Name=\"AfterBuild\">\n\t</Target>\n\t-->\n</Project>"
  },
  {
    "path": "samples/FSharpDemo/Program.fs",
    "content": "﻿// Learn more about F# at http://fsharp.net\nlet settingOne = System.Configuration.ConfigurationManager.AppSettings.[\"settingOne\"];\nlet settingTwo = System.Configuration.ConfigurationManager.AppSettings.[\"settingTwo\"];\nlet settingthree = System.Configuration.ConfigurationManager.AppSettings.[\"settingThree\"];\n\n\nprintfn \"settingOne: %s\" settingOne\nprintfn \"settingTwo: %s\" settingTwo\nprintfn \"settingThree: %s\" settingthree\n\nprintfn \" \"\nprintfn \"Press any key to close\"\nSystem.Console.ReadKey(true)"
  },
  {
    "path": "samples/FSharpDemo/app.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <appSettings>\n    <add key=\"settingOne\" value=\"one Debug\"\n         xdt:Locator=\"Match(key)\" xdt:Transform=\"Replace\" />\n    \n    <add key=\"settingTwo\" value=\"two Debug\"\n         xdt:Locator=\"Match(key)\" xdt:Transform=\"Replace\" />\n    \n    <add key=\"settingThree\" value=\"three Debug\"\n         xdt:Locator=\"Match(key)\" xdt:Transform=\"Replace\" />\n  </appSettings>\n</configuration>"
  },
  {
    "path": "samples/FSharpDemo/app.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <appSettings>\n    <add key=\"settingOne\" value=\"one Release\"\n         xdt:Locator=\"Match(key)\" xdt:Transform=\"Replace\" />\n\n    <add key=\"settingTwo\" value=\"two Release\"\n         xdt:Locator=\"Match(key)\" xdt:Transform=\"Replace\" />\n\n    <add key=\"settingThree\" value=\"three Release\"\n         xdt:Locator=\"Match(key)\" xdt:Transform=\"Replace\" />\n  </appSettings>\n</configuration>"
  },
  {
    "path": "samples/FSharpDemo/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"settingOne\" value=\"one default value\"/>\n    <add key=\"settingTwo\" value=\"two default value\"/>\n    <add key=\"settingThree\" value=\"three default value\"/>\n  </appSettings>\n</configuration>\n"
  },
  {
    "path": "samples/Linked-files/connectionStrings.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<connectionStrings xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  \n    <add name=\"RecordsDb\" connectionString=\".\\SQLExpress;Initial Catalog=RecordsDb-DEBUG;Integrated Security=true\"\n         xdt:Transform=\"Replace\" xdt:Locator=\"Match(name)\"/>\n  \n</connectionStrings>"
  },
  {
    "path": "samples/Linked-files/connectionStrings.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<connectionStrings xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  \n  <add name=\"RecordsDb\" connectionString=\"db.contoso.com;Initial Catalog=RecordsDb-RELEASE;Integrated Security=true\"\n         xdt:Transform=\"Replace\" xdt:Locator=\"Match(name)\"/>\n  <add name=\"InventoryDb\" connectionString=\"db.constos.com;Initial Catalog=InventoryDb-RELEASE;Integrated Security=true\"\n       xdt:Transform=\"Insert\" xdt:Locator=\"Match(name)\" />\n  \n</connectionStrings>"
  },
  {
    "path": "samples/Linked-files/connectionStrings.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<connectionStrings>\n  <clear />\n  <add name=\"RecordsDb\" connectionString=\".\\SQLExpress;Initial Catalog=RecordsDb-Default;Integrated Security=true\"/>\n</connectionStrings>"
  },
  {
    "path": "samples/SlowCheetah.Samples.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 2012\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Wpf.Transform\", \"Wpf.Transform\\Wpf.Transform.csproj\", \"{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}\"\nEndProject\nProject(\"{54435603-DBB4-11D2-8724-00A0C9A8B90C}\") = \"TransformSetupProject\", \"TransformSetupProject\\TransformSetupProject.vdproj\", \"{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}\"\nEndProject\nProject(\"{F2A71F9B-5D33-465A-A702-920D77279786}\") = \"FSharpDemo\", \"FSharpDemo\\FSharpDemo.fsproj\", \"{85361198-DB0E-4528-A513-80E025DE74A0}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WebDemo\", \"WebDemo\\WebDemo.csproj\", \"{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Azure\", \"Azure\", \"{08423D14-F6E1-467E-94FC-53077FBB0D71}\"\nEndProject\nProject(\"{CC5FD16D-436D-48AD-A40C-5A424C6E3E79}\") = \"WindowsAzure1\", \"WindowsAzure1\\WindowsAzure1.ccproj\", \"{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"WorkerRole1\", \"WorkerRole1\\WorkerRole1.csproj\", \"{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|Mixed Platforms = Debug|Mixed Platforms\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|Mixed Platforms = Release|Mixed Platforms\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Debug|Any CPU.Build.0 = Debug|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Debug|Mixed Platforms.ActiveCfg = Debug|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Debug|Mixed Platforms.Build.0 = Debug|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Debug|x86.Build.0 = Debug|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Release|Any CPU.Build.0 = Release|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Release|Mixed Platforms.ActiveCfg = Release|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Release|Mixed Platforms.Build.0 = Release|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Release|x86.ActiveCfg = Release|x86\n\t\t{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}.Release|x86.Build.0 = Release|x86\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Debug|Any CPU.ActiveCfg = Debug\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Debug|Any CPU.Build.0 = Debug\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Debug|Mixed Platforms.ActiveCfg = Debug\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Debug|Mixed Platforms.Build.0 = Debug\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Debug|x86.ActiveCfg = Debug\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Release|Any CPU.ActiveCfg = Release\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Release|Any CPU.Build.0 = Release\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Release|Mixed Platforms.ActiveCfg = Release\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Release|Mixed Platforms.Build.0 = Release\n\t\t{2B730C2F-9E22-49CE-8908-E40E82CBAE9E}.Release|x86.ActiveCfg = Release\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Debug|Any CPU.ActiveCfg = Debug|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Debug|Mixed Platforms.ActiveCfg = Debug|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Debug|Mixed Platforms.Build.0 = Debug|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Debug|x86.ActiveCfg = Debug|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Debug|x86.Build.0 = Debug|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Release|Any CPU.ActiveCfg = Release|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Release|Any CPU.Build.0 = Release|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Release|Mixed Platforms.ActiveCfg = Release|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Release|Mixed Platforms.Build.0 = Release|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Release|x86.ActiveCfg = Release|x86\n\t\t{85361198-DB0E-4528-A513-80E025DE74A0}.Release|x86.Build.0 = Release|x86\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Release|Mixed Platforms.Build.0 = Release|Any CPU\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}.Release|x86.ActiveCfg = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(NestedProjects) = preSolution\n\t\t{0F00D743-DBAE-48CE-AAA0-CB9B407551D9} = {08423D14-F6E1-467E-94FC-53077FBB0D71}\n\t\t{DAE9103D-C4AF-48AE-8008-F0425E33F0EB} = {08423D14-F6E1-467E-94FC-53077FBB0D71}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "samples/TransformSetupProject/.gitignore",
    "content": "# Folders\nDebug\nRelease\n\n# Files"
  },
  {
    "path": "samples/TransformSetupProject/TransformSetupProject.vdproj",
    "content": "﻿\"DeployProject\"\n{\n\"VSVersion\" = \"3:800\"\n\"ProjectType\" = \"8:{978C614F-708E-4E1A-B201-565925725DBA}\"\n\"IsWebType\" = \"8:FALSE\"\n\"ProjectName\" = \"8:TransformSetupProject\"\n\"LanguageId\" = \"3:1033\"\n\"CodePage\" = \"3:1252\"\n\"UILanguageId\" = \"3:1033\"\n\"SccProjectName\" = \"8:\"\n\"SccLocalPath\" = \"8:\"\n\"SccAuxPath\" = \"8:\"\n\"SccProvider\" = \"8:\"\n    \"Hierarchy\"\n    {\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_F27A358992344590BBC1C5CA77A38F30\"\n        \"OwnerKey\" = \"8:_UNDEFINED\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n        \"Entry\"\n        {\n        \"MsmKey\" = \"8:_UNDEFINED\"\n        \"OwnerKey\" = \"8:_F27A358992344590BBC1C5CA77A38F30\"\n        \"MsmSig\" = \"8:_UNDEFINED\"\n        }\n    }\n    \"Configurations\"\n    {\n        \"Debug\"\n        {\n        \"DisplayName\" = \"8:Debug\"\n        \"IsDebugOnly\" = \"11:TRUE\"\n        \"IsReleaseOnly\" = \"11:FALSE\"\n        \"OutputFilename\" = \"8:Debug\\\\TransformSetupProject.msi\"\n        \"PackageFilesAs\" = \"3:2\"\n        \"PackageFileSize\" = \"3:-2147483648\"\n        \"CabType\" = \"3:1\"\n        \"Compression\" = \"3:2\"\n        \"SignOutput\" = \"11:FALSE\"\n        \"CertificateFile\" = \"8:\"\n        \"PrivateKeyFile\" = \"8:\"\n        \"TimeStampServer\" = \"8:\"\n        \"InstallerBootstrapper\" = \"3:2\"\n            \"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}\"\n            {\n            \"Enabled\" = \"11:TRUE\"\n            \"PromptEnabled\" = \"11:TRUE\"\n            \"PrerequisitesLocation\" = \"2:1\"\n            \"Url\" = \"8:\"\n            \"ComponentsUrl\" = \"8:\"\n                \"Items\"\n                {\n                    \"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.0,Profile=Client\"\n                    {\n                    \"Name\" = \"8:Microsoft .NET Framework 4 Client Profile (x86 and x64)\"\n                    \"ProductCode\" = \"8:.NETFramework,Version=v4.0,Profile=Client\"\n                    }\n                    \"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1\"\n                    {\n                    \"Name\" = \"8:Windows Installer 3.1\"\n                    \"ProductCode\" = \"8:Microsoft.Windows.Installer.3.1\"\n                    }\n                }\n            }\n        }\n        \"Release\"\n        {\n        \"DisplayName\" = \"8:Release\"\n        \"IsDebugOnly\" = \"11:FALSE\"\n        \"IsReleaseOnly\" = \"11:TRUE\"\n        \"OutputFilename\" = \"8:Release\\\\TransformSetupProject.msi\"\n        \"PackageFilesAs\" = \"3:2\"\n        \"PackageFileSize\" = \"3:-2147483648\"\n        \"CabType\" = \"3:1\"\n        \"Compression\" = \"3:2\"\n        \"SignOutput\" = \"11:FALSE\"\n        \"CertificateFile\" = \"8:\"\n        \"PrivateKeyFile\" = \"8:\"\n        \"TimeStampServer\" = \"8:\"\n        \"InstallerBootstrapper\" = \"3:2\"\n            \"BootstrapperCfg:{63ACBE69-63AA-4F98-B2B6-99F9E24495F2}\"\n            {\n            \"Enabled\" = \"11:TRUE\"\n            \"PromptEnabled\" = \"11:TRUE\"\n            \"PrerequisitesLocation\" = \"2:1\"\n            \"Url\" = \"8:\"\n            \"ComponentsUrl\" = \"8:\"\n                \"Items\"\n                {\n                    \"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.0,Profile=Client\"\n                    {\n                    \"Name\" = \"8:Microsoft .NET Framework 4 Client Profile (x86 and x64)\"\n                    \"ProductCode\" = \"8:.NETFramework,Version=v4.0,Profile=Client\"\n                    }\n                    \"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.Windows.Installer.3.1\"\n                    {\n                    \"Name\" = \"8:Windows Installer 3.1\"\n                    \"ProductCode\" = \"8:Microsoft.Windows.Installer.3.1\"\n                    }\n                }\n            }\n        }\n    }\n    \"Deployable\"\n    {\n        \"CustomAction\"\n        {\n        }\n        \"DefaultFeature\"\n        {\n        \"Name\" = \"8:DefaultFeature\"\n        \"Title\" = \"8:\"\n        \"Description\" = \"8:\"\n        }\n        \"ExternalPersistence\"\n        {\n            \"LaunchCondition\"\n            {\n                \"{A06ECF26-33A3-4562-8140-9B0E340D4F24}:_71517CAEDC524221A9EDD84DED877D59\"\n                {\n                \"Name\" = \"8:.NET Framework\"\n                \"Message\" = \"8:[VSDNETMSG]\"\n                \"FrameworkVersion\" = \"8:.NETFramework,Version=v4.0,Profile=Client\"\n                \"AllowLaterVersions\" = \"11:FALSE\"\n                \"InstallUrl\" = \"8:http://go.microsoft.com/fwlink/?LinkId=131000\"\n                }\n            }\n        }\n        \"File\"\n        {\n        }\n        \"FileType\"\n        {\n        }\n        \"Folder\"\n        {\n            \"{1525181F-901A-416C-8A58-119130FE478E}:_742E28C099B4475A81762B1574DF4C0C\"\n            {\n            \"Name\" = \"8:#1919\"\n            \"AlwaysCreate\" = \"11:FALSE\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Property\" = \"8:ProgramMenuFolder\"\n                \"Folders\"\n                {\n                }\n            }\n            \"{3C67513D-01DD-4637-8A68-80971EB9504F}:_89C62D7C835442DCA303478A82CAD89B\"\n            {\n            \"DefaultLocation\" = \"8:[ProgramFilesFolder][Manufacturer]\\\\[ProductName]\"\n            \"Name\" = \"8:#1925\"\n            \"AlwaysCreate\" = \"11:FALSE\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Property\" = \"8:TARGETDIR\"\n                \"Folders\"\n                {\n                }\n            }\n            \"{1525181F-901A-416C-8A58-119130FE478E}:_C4D9D6411394445CB40C88AA843AB193\"\n            {\n            \"Name\" = \"8:#1916\"\n            \"AlwaysCreate\" = \"11:FALSE\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Property\" = \"8:DesktopFolder\"\n                \"Folders\"\n                {\n                }\n            }\n        }\n        \"LaunchCondition\"\n        {\n        }\n        \"Locator\"\n        {\n        }\n        \"MsiBootstrapper\"\n        {\n        \"LangId\" = \"3:1033\"\n        \"RequiresElevation\" = \"11:FALSE\"\n        }\n        \"Product\"\n        {\n        \"Name\" = \"8:Microsoft Visual Studio\"\n        \"ProductName\" = \"8:TransformSetupProject\"\n        \"ProductCode\" = \"8:{F5369A89-3C1D-4C1F-9106-4DDB0DE62372}\"\n        \"PackageCode\" = \"8:{2DD46CDB-8679-4313-B6AE-800BDC482D64}\"\n        \"UpgradeCode\" = \"8:{022F29ED-59D2-43E7-8BA8-164F91D9AE65}\"\n        \"AspNetVersion\" = \"8:4.0.30319.0\"\n        \"RestartWWWService\" = \"11:FALSE\"\n        \"RemovePreviousVersions\" = \"11:FALSE\"\n        \"DetectNewerInstalledVersion\" = \"11:TRUE\"\n        \"InstallAllUsers\" = \"11:FALSE\"\n        \"ProductVersion\" = \"8:1.0.0\"\n        \"Manufacturer\" = \"8:SlowCheetah\"\n        \"ARPHELPTELEPHONE\" = \"8:\"\n        \"ARPHELPLINK\" = \"8:\"\n        \"Title\" = \"8:TransformSetupProject\"\n        \"Subject\" = \"8:\"\n        \"ARPCONTACT\" = \"8:SlowCheetah\"\n        \"Keywords\" = \"8:\"\n        \"ARPCOMMENTS\" = \"8:\"\n        \"ARPURLINFOABOUT\" = \"8:\"\n        \"ARPPRODUCTICON\" = \"8:\"\n        \"ARPIconIndex\" = \"3:0\"\n        \"SearchPath\" = \"8:\"\n        \"UseSystemSearchPath\" = \"11:TRUE\"\n        \"TargetPlatform\" = \"3:0\"\n        \"PreBuildEvent\" = \"8:\"\n        \"PostBuildEvent\" = \"8:\"\n        \"RunPostBuildEvent\" = \"3:0\"\n        }\n        \"Registry\"\n        {\n            \"HKLM\"\n            {\n                \"Keys\"\n                {\n                    \"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_1D47AC607192492795B501101C97184D\"\n                    {\n                    \"Name\" = \"8:Software\"\n                    \"Condition\" = \"8:\"\n                    \"AlwaysCreate\" = \"11:FALSE\"\n                    \"DeleteAtUninstall\" = \"11:FALSE\"\n                    \"Transitive\" = \"11:FALSE\"\n                        \"Keys\"\n                        {\n                            \"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_D4F77F0403764FF2AFD7CDEDF156A4D4\"\n                            {\n                            \"Name\" = \"8:[Manufacturer]\"\n                            \"Condition\" = \"8:\"\n                            \"AlwaysCreate\" = \"11:FALSE\"\n                            \"DeleteAtUninstall\" = \"11:FALSE\"\n                            \"Transitive\" = \"11:FALSE\"\n                                \"Keys\"\n                                {\n                                }\n                                \"Values\"\n                                {\n                                }\n                            }\n                        }\n                        \"Values\"\n                        {\n                        }\n                    }\n                }\n            }\n            \"HKCU\"\n            {\n                \"Keys\"\n                {\n                    \"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_BDFF528BD9394B3EB3237262AC9A062F\"\n                    {\n                    \"Name\" = \"8:Software\"\n                    \"Condition\" = \"8:\"\n                    \"AlwaysCreate\" = \"11:FALSE\"\n                    \"DeleteAtUninstall\" = \"11:FALSE\"\n                    \"Transitive\" = \"11:FALSE\"\n                        \"Keys\"\n                        {\n                            \"{60EA8692-D2D5-43EB-80DC-7906BF13D6EF}:_2F854B15E50641B29117685E19D30D11\"\n                            {\n                            \"Name\" = \"8:[Manufacturer]\"\n                            \"Condition\" = \"8:\"\n                            \"AlwaysCreate\" = \"11:FALSE\"\n                            \"DeleteAtUninstall\" = \"11:FALSE\"\n                            \"Transitive\" = \"11:FALSE\"\n                                \"Keys\"\n                                {\n                                }\n                                \"Values\"\n                                {\n                                }\n                            }\n                        }\n                        \"Values\"\n                        {\n                        }\n                    }\n                }\n            }\n            \"HKCR\"\n            {\n                \"Keys\"\n                {\n                }\n            }\n            \"HKU\"\n            {\n                \"Keys\"\n                {\n                }\n            }\n            \"HKPU\"\n            {\n                \"Keys\"\n                {\n                }\n            }\n        }\n        \"Sequences\"\n        {\n        }\n        \"Shortcut\"\n        {\n        }\n        \"UserInterface\"\n        {\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_2655780606CC4E7FBD7ED7FD032A7059\"\n            {\n            \"Name\" = \"8:#1901\"\n            \"Sequence\" = \"3:1\"\n            \"Attributes\" = \"3:2\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_1AFC385270184EEE965265BD99F06C7E\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Progress\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdProgressDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"ShowProgress\"\n                            {\n                            \"Name\" = \"8:ShowProgress\"\n                            \"DisplayName\" = \"8:#1009\"\n                            \"Description\" = \"8:#1109\"\n                            \"Type\" = \"3:5\"\n                            \"ContextData\" = \"8:1;True=1;False=0\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:0\"\n                            \"Value\" = \"3:1\"\n                            \"DefaultValue\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_2863FE074CE044B783610E64B41EE551\"\n            {\n            \"Name\" = \"8:#1902\"\n            \"Sequence\" = \"3:1\"\n            \"Attributes\" = \"3:3\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_F5A581076C9B4C38B113299A8D30011C\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Finished\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdFinishedDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"UpdateText\"\n                            {\n                            \"Name\" = \"8:UpdateText\"\n                            \"DisplayName\" = \"8:#1058\"\n                            \"Description\" = \"8:#1158\"\n                            \"Type\" = \"3:15\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:1\"\n                            \"Value\" = \"8:#1258\"\n                            \"DefaultValue\" = \"8:#1258\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_4F6B30A8778B493A8B781A89AE074CDA\"\n            {\n            \"Name\" = \"8:#1901\"\n            \"Sequence\" = \"3:2\"\n            \"Attributes\" = \"3:2\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_17A7A0A918724F24A92D9137DA562309\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Progress\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminProgressDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"ShowProgress\"\n                            {\n                            \"Name\" = \"8:ShowProgress\"\n                            \"DisplayName\" = \"8:#1009\"\n                            \"Description\" = \"8:#1109\"\n                            \"Type\" = \"3:5\"\n                            \"ContextData\" = \"8:1;True=1;False=0\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:0\"\n                            \"Value\" = \"3:1\"\n                            \"DefaultValue\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_4FA92381D3BA4C67A28338E4DD759371\"\n            {\n            \"Name\" = \"8:#1900\"\n            \"Sequence\" = \"3:1\"\n            \"Attributes\" = \"3:1\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_88F47C13FEDE4052A0F9428CF4F29C06\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Welcome\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdWelcomeDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"CopyrightWarning\"\n                            {\n                            \"Name\" = \"8:CopyrightWarning\"\n                            \"DisplayName\" = \"8:#1002\"\n                            \"Description\" = \"8:#1102\"\n                            \"Type\" = \"3:3\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:1\"\n                            \"Value\" = \"8:#1202\"\n                            \"DefaultValue\" = \"8:#1202\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"Welcome\"\n                            {\n                            \"Name\" = \"8:Welcome\"\n                            \"DisplayName\" = \"8:#1003\"\n                            \"Description\" = \"8:#1103\"\n                            \"Type\" = \"3:3\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:1\"\n                            \"Value\" = \"8:#1203\"\n                            \"DefaultValue\" = \"8:#1203\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A6E7528FE2E14FF8B695E1FDED92FC84\"\n                    {\n                    \"Sequence\" = \"3:300\"\n                    \"DisplayName\" = \"8:Confirm Installation\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdConfirmDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_B8FA2E13763E452AABB24FD1399CE001\"\n                    {\n                    \"Sequence\" = \"3:200\"\n                    \"DisplayName\" = \"8:Installation Folder\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdFolderDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"InstallAllUsersVisible\"\n                            {\n                            \"Name\" = \"8:InstallAllUsersVisible\"\n                            \"DisplayName\" = \"8:#1059\"\n                            \"Description\" = \"8:#1159\"\n                            \"Type\" = \"3:5\"\n                            \"ContextData\" = \"8:1;True=1;False=0\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:0\"\n                            \"Value\" = \"3:1\"\n                            \"DefaultValue\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_5F0D8C62FAA54FB68F2B251D0BEAFBB3\"\n            {\n            \"Name\" = \"8:#1902\"\n            \"Sequence\" = \"3:2\"\n            \"Attributes\" = \"3:3\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_98D7A78C70C244FA8AAA9B382734E006\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Finished\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminFinishedDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n            \"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_86C6586C0B5C4118AA748158D303B196\"\n            {\n            \"UseDynamicProperties\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdUserInterface.wim\"\n            }\n            \"{2479F3F5-0309-486D-8047-8187E2CE5BA0}:_ABCF9DF9706E440EA24701B416346A62\"\n            {\n            \"UseDynamicProperties\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdBasicDialogs.wim\"\n            }\n            \"{DF760B10-853B-4699-99F2-AFF7185B4A62}:_F8C9C62BD0FC476293AEEB70BE4B8504\"\n            {\n            \"Name\" = \"8:#1900\"\n            \"Sequence\" = \"3:2\"\n            \"Attributes\" = \"3:1\"\n                \"Dialogs\"\n                {\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_267F6E53A1BE4E32BD698358C396339C\"\n                    {\n                    \"Sequence\" = \"3:200\"\n                    \"DisplayName\" = \"8:Installation Folder\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminFolderDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_A0BBB8149B7F4BECA5DE6AC16A6A386C\"\n                    {\n                    \"Sequence\" = \"3:100\"\n                    \"DisplayName\" = \"8:Welcome\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminWelcomeDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"CopyrightWarning\"\n                            {\n                            \"Name\" = \"8:CopyrightWarning\"\n                            \"DisplayName\" = \"8:#1002\"\n                            \"Description\" = \"8:#1102\"\n                            \"Type\" = \"3:3\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:1\"\n                            \"Value\" = \"8:#1202\"\n                            \"DefaultValue\" = \"8:#1202\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                            \"Welcome\"\n                            {\n                            \"Name\" = \"8:Welcome\"\n                            \"DisplayName\" = \"8:#1003\"\n                            \"Description\" = \"8:#1103\"\n                            \"Type\" = \"3:3\"\n                            \"ContextData\" = \"8:\"\n                            \"Attributes\" = \"3:0\"\n                            \"Setting\" = \"3:1\"\n                            \"Value\" = \"8:#1203\"\n                            \"DefaultValue\" = \"8:#1203\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                    \"{688940B3-5CA9-4162-8DEE-2993FA9D8CBC}:_E51A4B5361724CB287ECC69CD821C7B9\"\n                    {\n                    \"Sequence\" = \"3:300\"\n                    \"DisplayName\" = \"8:Confirm Installation\"\n                    \"UseDynamicProperties\" = \"11:TRUE\"\n                    \"IsDependency\" = \"11:FALSE\"\n                    \"SourcePath\" = \"8:<VsdDialogDir>\\\\VsdAdminConfirmDlg.wid\"\n                        \"Properties\"\n                        {\n                            \"BannerBitmap\"\n                            {\n                            \"Name\" = \"8:BannerBitmap\"\n                            \"DisplayName\" = \"8:#1001\"\n                            \"Description\" = \"8:#1101\"\n                            \"Type\" = \"3:8\"\n                            \"ContextData\" = \"8:Bitmap\"\n                            \"Attributes\" = \"3:4\"\n                            \"Setting\" = \"3:1\"\n                            \"UsePlugInResources\" = \"11:TRUE\"\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        \"MergeModule\"\n        {\n        }\n        \"ProjectOutput\"\n        {\n            \"{5259A561-127C-4D43-A0A1-72F10C7B3BF8}:_F27A358992344590BBC1C5CA77A38F30\"\n            {\n            \"SourcePath\" = \"8:..\\\\Wpf.Transform\\\\obj\\\\x86\\\\Debug\\\\Wpf.Transform.exe\"\n            \"TargetName\" = \"8:\"\n            \"Tag\" = \"8:\"\n            \"Folder\" = \"8:_89C62D7C835442DCA303478A82CAD89B\"\n            \"Condition\" = \"8:\"\n            \"Transitive\" = \"11:FALSE\"\n            \"Vital\" = \"11:TRUE\"\n            \"ReadOnly\" = \"11:FALSE\"\n            \"Hidden\" = \"11:FALSE\"\n            \"System\" = \"11:FALSE\"\n            \"Permanent\" = \"11:FALSE\"\n            \"SharedLegacy\" = \"11:FALSE\"\n            \"PackageAs\" = \"3:1\"\n            \"Register\" = \"3:1\"\n            \"Exclude\" = \"11:FALSE\"\n            \"IsDependency\" = \"11:FALSE\"\n            \"IsolateTo\" = \"8:\"\n            \"ProjectOutputGroupRegister\" = \"3:1\"\n            \"OutputConfiguration\" = \"8:\"\n            \"OutputGroupCanonicalName\" = \"8:Built\"\n            \"OutputProjectGuid\" = \"8:{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}\"\n            \"ShowKeyOutput\" = \"11:TRUE\"\n                \"ExcludeFilters\"\n                {\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "samples/WebDemo/Default.aspx",
    "content": "﻿<%@ Page Language=\"C#\" AutoEventWireup=\"true\" CodeBehind=\"Default.aspx.cs\" Inherits=\"WebDemo.Default\" %>\n\n<!DOCTYPE html>\n\n<html>\n<body>\n    <h3>For web projects the transforms are only applied on package/publish.\n    This project has a package example. You can right click and select Publish and the\n    publish the package.</h3>\n</body>\n</html>\n"
  },
  {
    "path": "samples/WebDemo/Default.aspx.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Web;\nusing System.Web.UI;\nusing System.Web.UI.WebControls;\n\nnamespace WebDemo\n{\n    public partial class Default : System.Web.UI.Page\n    {\n        protected void Page_Load(object sender, EventArgs e)\n        {\n\n        }\n    }\n}"
  },
  {
    "path": "samples/WebDemo/Default.aspx.designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated. \n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace WebDemo {\n    \n    \n    public partial class Default {\n    }\n}\n"
  },
  {
    "path": "samples/WebDemo/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"WebDemo\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"WebDemo\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2012\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"31dab456-6ab1-402b-a9dd-57d6c54cfb9a\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "samples/WebDemo/Web.Debug.config",
    "content": "﻿<?xml version=\"1.0\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>\n"
  },
  {
    "path": "samples/WebDemo/Web.Release.config",
    "content": "﻿<?xml version=\"1.0\"?>\n\n<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>\n"
  },
  {
    "path": "samples/WebDemo/Web.config",
    "content": "﻿<?xml version=\"1.0\"?>\n\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  http://go.microsoft.com/fwlink/?LinkId=169433\n  -->\n\n<configuration>\n    <system.web>\n        <compilation debug=\"true\" targetFramework=\"4.0\" />\n    </system.web>\n\n</configuration>\n"
  },
  {
    "path": "samples/WebDemo/WebDemo.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{B6F0849F-279E-4BDA-B7CF-8E83D4BF88AA}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>WebDemo</RootNamespace>\n    <AssemblyName>WebDemo</AssemblyName>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n    <UseIISExpress>false</UseIISExpress>\n    <FileUpgradeFlags>\n    </FileUpgradeFlags>\n    <UpgradeBackupLocation>\n    </UpgradeBackupLocation>\n    <OldToolsVersion>4.0</OldToolsVersion>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SlowCheetahTargets Condition=\" '$(SlowCheetahTargets)'=='' \">$(LOCALAPPDATA)\\Microsoft\\MSBuild\\SlowCheetah\\v1\\SlowCheetah.Transforms.targets</SlowCheetahTargets>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Default.aspx\" />\n    <Content Include=\"Web.config\" />\n    <Content Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </Content>\n    <Content Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Default.aspx.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n      <SubType>ASPXCodeBehind</SubType>\n    </Compile>\n    <Compile Include=\"Default.aspx.designer.cs\">\n      <DependentUpon>Default.aspx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"connectionStrings.config\">\n      <TransformOnBuild>true</TransformOnBuild>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"connectionStrings.Debug.config\">\n      <DependentUpon>connectionStrings.config</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n    </None>\n    <None Include=\"connectionStrings.Release.config\">\n      <DependentUpon>connectionStrings.config</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"connectionStrings.ToPkg.config\">\n      <DependentUpon>connectionStrings.config</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"Properties\\PublishProfiles\\ToPkg.pubxml\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>False</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>6332</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>\n          </IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <Import Project=\"$(SlowCheetahTargets)\" Condition=\"Exists('$(SlowCheetahTargets)')\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "samples/WebDemo/connectionStrings.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<connectionStrings xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  \n    <add name=\"RecordsDb\" connectionString=\".\\SQLExpress;Initial Catalog=RecordsDb-DEBUG;Integrated Security=true\"\n         xdt:Transform=\"Replace\" xdt:Locator=\"Match(name)\"/>\n  \n</connectionStrings>"
  },
  {
    "path": "samples/WebDemo/connectionStrings.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<connectionStrings xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  \n  <add name=\"RecordsDb\" connectionString=\"db.contoso.com;Initial Catalog=RecordsDb-RELEASE;Integrated Security=true\"\n         xdt:Transform=\"Replace\" xdt:Locator=\"Match(name)\"/>\n  <add name=\"InventoryDb\" connectionString=\"db.constos.com;Initial Catalog=InventoryDb-RELEASE;Integrated Security=true\"\n       xdt:Transform=\"Insert\" xdt:Locator=\"Match(name)\" />\n  \n</connectionStrings>"
  },
  {
    "path": "samples/WebDemo/connectionStrings.ToPkg.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations\n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<connectionStrings xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n\n  <add name=\"RecordsDb\" connectionString=\"db.contoso.com;Initial Catalog=RecordsDb-ToPkg;Integrated Security=true\"\n         xdt:Transform=\"Replace\" xdt:Locator=\"Match(name)\"/>\n\n  <add name=\"FROM-TOPKG\" connectionString=\"from-publishprofile-transform\"\n       xdt:Transform=\"Insert\" />\n\n</connectionStrings>"
  },
  {
    "path": "samples/WebDemo/connectionStrings.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<connectionStrings>\n  <clear />\n  <add name=\"RecordsDb\" connectionString=\".\\SQLExpress;Initial Catalog=RecordsDb-Default;Integrated Security=true\"/>\n</connectionStrings>"
  },
  {
    "path": "samples/WindowsAzure1/ServiceConfiguration.Cloud.cscfg",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceConfiguration serviceName=\"WindowsAzure1\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration\" osFamily=\"2\" osVersion=\"*\" schemaVersion=\"2012-10.1.8\">\n  <Role name=\"WorkerRole1\">\n    <Instances count=\"1\" />\n    <ConfigurationSettings>\n      <Setting name=\"Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString\" value=\"UseDevelopmentStorage=true\" />\n    </ConfigurationSettings>\n  </Role>\n</ServiceConfiguration>"
  },
  {
    "path": "samples/WindowsAzure1/ServiceConfiguration.Local.cscfg",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceConfiguration serviceName=\"WindowsAzure1\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration\" osFamily=\"2\" osVersion=\"*\" schemaVersion=\"2012-10.1.8\">\n  <Role name=\"WorkerRole1\">\n    <Instances count=\"1\" />\n    <ConfigurationSettings>\n      <Setting name=\"Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString\" value=\"UseDevelopmentStorage=true\" />\n    </ConfigurationSettings>\n  </Role>\n</ServiceConfiguration>"
  },
  {
    "path": "samples/WindowsAzure1/ServiceDefinition.csdef",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ServiceDefinition name=\"WindowsAzure1\" xmlns=\"http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition\" schemaVersion=\"2012-10.1.8\">\n  <WorkerRole name=\"WorkerRole1\" vmsize=\"Small\">\n    <Imports>\n      <Import moduleName=\"Diagnostics\" />\n    </Imports>\n  </WorkerRole>\n</ServiceDefinition>"
  },
  {
    "path": "samples/WindowsAzure1/WindowsAzure1.ccproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>1.8</ProductVersion>\n    <ProjectGuid>0f00d743-dbae-48ce-aaa0-cb9b407551d9</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>WindowsAzure1</RootNamespace>\n    <AssemblyName>WindowsAzure1</AssemblyName>\n    <StartDevelopmentStorage>True</StartDevelopmentStorage>\n    <Name>WindowsAzure1</Name>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <!-- Items for the project -->\n  <ItemGroup>\n    <ServiceDefinition Include=\"ServiceDefinition.csdef\" />\n    <ServiceConfiguration Include=\"ServiceConfiguration.Local.cscfg\" />\n    <ServiceConfiguration Include=\"ServiceConfiguration.Cloud.cscfg\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ProjectReference Include=\"..\\WorkerRole1\\WorkerRole1.csproj\">\n      <Name>WorkerRole1</Name>\n      <Project>{dae9103d-c4af-48ae-8008-f0425e33f0eb}</Project>\n      <Private>True</Private>\n      <RoleType>Worker</RoleType>\n      <RoleName>WorkerRole1</RoleName>\n      <UpdateDiagnosticsConnectionStringOnPublish>True</UpdateDiagnosticsConnectionStringOnPublish>\n    </ProjectReference>\n  </ItemGroup>\n  <!-- Import the target files for this project template -->\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\" '$(VisualStudioVersion)' == '' \">10.0</VisualStudioVersion>\n    <CloudExtensionsDir Condition=\" '$(CloudExtensionsDir)' == '' \">$(MSBuildExtensionsPath)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)\\Windows Azure Tools\\1.8\\</CloudExtensionsDir>\n  </PropertyGroup>\n  <Import Project=\"$(CloudExtensionsDir)Microsoft.WindowsAzure.targets\" />\n</Project>"
  },
  {
    "path": "samples/WorkerRole1/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"WorkerRole1\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"WorkerRole1\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2012\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"d68bc4d9-d829-478c-921c-7bc2c500962c\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "samples/WorkerRole1/WorkerRole.cs",
    "content": "using System;\nusing System.Collections.Generic;\nusing System.Diagnostics;\nusing System.Linq;\nusing System.Net;\nusing System.Threading;\nusing Microsoft.WindowsAzure;\nusing Microsoft.WindowsAzure.Diagnostics;\nusing Microsoft.WindowsAzure.ServiceRuntime;\nusing Microsoft.WindowsAzure.StorageClient;\nusing System.Configuration;\n\nnamespace WorkerRole1 {\n    public class WorkerRole : RoleEntryPoint {\n        public override void Run() {\n            // This is a sample worker implementation. Replace with your logic.\n            Trace.WriteLine(\"WorkerRole1 entry point called\", \"Information\");\n\n            foreach (var key in ConfigurationManager.AppSettings.AllKeys) {\n                Trace.Write(string.Format(\"[key='{0}',value='{1}']\",key,ConfigurationManager.AppSettings[key]));\n            }\n\n            while (true) {\n                Thread.Sleep(10000);\n                Trace.WriteLine(\"Working\", \"Information\");\n            }\n        }\n\n        public override bool OnStart() {\n            // Set the maximum number of concurrent connections \n            ServicePointManager.DefaultConnectionLimit = 12;\n\n            // For information on handling configuration changes\n            // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.\n\n            return base.OnStart();\n        }\n    }\n}\n"
  },
  {
    "path": "samples/WorkerRole1/WorkerRole1.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>8.0.30703</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{DAE9103D-C4AF-48AE-8008-F0425E33F0EB}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>WorkerRole1</RootNamespace>\n    <AssemblyName>WorkerRole1</AssemblyName>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <RoleType>Worker</RoleType>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SlowCheetahTargets Condition=\" '$(SlowCheetahTargets)'=='' \">$(LOCALAPPDATA)\\Microsoft\\MSBuild\\SlowCheetah\\v1\\SlowCheetah.Transforms.targets</SlowCheetahTargets>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.WindowsAzure.Configuration, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\Microsoft.WindowsAzure.ConfigurationManager.1.8.0.0\\lib\\net35-full\\Microsoft.WindowsAzure.Configuration.dll</HintPath>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.Diagnostics, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\">\n      <Private>True</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.ServiceRuntime, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\">\n      <Private>False</Private>\n    </Reference>\n    <Reference Include=\"Microsoft.WindowsAzure.StorageClient, Version=1.7.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL\">\n      <HintPath>..\\packages\\WindowsAzure.Storage.1.7.0.0\\lib\\net35-full\\Microsoft.WindowsAzure.StorageClient.dll</HintPath>\n    </Reference>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.configuration\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.Services.Client\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n    <Compile Include=\"WorkerRole.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"app.config\">\n      <TransformOnBuild>true</TransformOnBuild>\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"app.Debug.config\">\n      <DependentUpon>app.config</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"app.Release.config\">\n      <DependentUpon>app.config</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n      <SubType>Designer</SubType>\n    </None>\n    <None Include=\"packages.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"XMLFile1.xml\" />\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(SlowCheetahTargets)\" Condition=\"Exists('$(SlowCheetahTargets)')\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "samples/WorkerRole1/XMLFile1.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?> \n"
  },
  {
    "path": "samples/WorkerRole1/app.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <appSettings>\n    <add key=\"from-debug\" value=\"from-debug\" xdt:Transform=\"Insert\"/>\n  </appSettings>\n</configuration>"
  },
  {
    "path": "samples/WorkerRole1/app.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <appSettings>\n    <add key=\"from-release\" value=\"from-release\" xdt:Transform=\"Insert\"/>\n  </appSettings>\n\n</configuration>"
  },
  {
    "path": "samples/WorkerRole1/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"one\" value=\"default\"/>\n  </appSettings>\n    <system.diagnostics>\n        <trace>\n            <listeners>\n                <add type=\"Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\"\n                    name=\"AzureDiagnostics\">\n                    <filter type=\"\" />\n                </add>\n            </listeners>\n        </trace>\n    </system.diagnostics>\n</configuration>"
  },
  {
    "path": "samples/WorkerRole1/contacts.Debug.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<Contacts xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <Contact FirstName=\"From\" LastName=\"Debug\" xdt:Transform=\"Insert\"/>\n</Contacts>"
  },
  {
    "path": "samples/WorkerRole1/contacts.Release.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<Contacts xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <Contact FirstName=\"From\" LastName=\"Release\" xdt:Transform=\"Insert\"/>\n</Contacts>"
  },
  {
    "path": "samples/WorkerRole1/contacts.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<Contacts>\n  <Contact FirstName=\"Sayed\" LastName=\"Hashimi\"/>\n</Contacts>"
  },
  {
    "path": "samples/WorkerRole1/packages.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<packages>\n  <package id=\"Microsoft.WindowsAzure.ConfigurationManager\" version=\"1.8.0.0\" targetFramework=\"net40\" />\n  <package id=\"WindowsAzure.Storage\" version=\"1.7.0.0\" targetFramework=\"net40\" />\n</packages>"
  },
  {
    "path": "samples/Wpf.Transform/App.xaml",
    "content": "﻿<Application x:Class=\"Wpf.Transform.App\"\n             xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n             xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n             StartupUri=\"MainWindow.xaml\">\n    <Application.Resources>\n        <ResourceDictionary Source=\"Assets/BureauBlue.xaml\" />\n    </Application.Resources>\n</Application>\n"
  },
  {
    "path": "samples/Wpf.Transform/App.xaml.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.Data;\nusing System.Linq;\nusing System.Windows;\n\nnamespace Wpf.Transform {\n    /// <summary>\n    /// Interaction logic for App.xaml\n    /// </summary>\n    public partial class App : Application {\n    }\n}\n"
  },
  {
    "path": "samples/Wpf.Transform/Assets/BureauBlue.xaml",
    "content": "﻿<!--\n// (c) Copyright Microsoft Corporation.\n// This source is subject to Microsoft Public License (Ms-PL).\n// Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details.\n// All other rights reserved.\n-->\n\n<ResourceDictionary\n  xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n  xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n  xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\"\n  mc:Ignorable=\"d\"\n  xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\">\n\n    <SolidColorBrush x:Key=\"OutsideFontColor\" Color=\"#FF000000\" />\n\n    <LinearGradientBrush x:Key=\"NormalBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFFFFFFF\" Offset=\"0\" />\n        <GradientStop Color=\"#FF8AAEDA\" Offset=\"0.521\" />\n        <GradientStop Color=\"#FFC6D6EC\" Offset=\"0.194\" />\n        <GradientStop Color=\"#FFB4C9E5\" Offset=\"0.811\" />\n        <GradientStop Color=\"#FFB7C8E0\" Offset=\"0.507\" />\n        <GradientStop Color=\"#FFD1DEF0\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"NormalBorderBrush\" EndPoint=\"0.5,0\" StartPoint=\"0.5,1\">\n        <GradientStop Color=\"#FF84B2D4\" />\n        <GradientStop Color=\"#FFADC7DE\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"NormalHighlightBrush\" Color=\"#FFFFFFFF\"/>\n    <LinearGradientBrush x:Key=\"MouseOverBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFFFFFFF\" Offset=\"0\" />\n        <GradientStop Color=\"#FFFEF3B5\" Offset=\"0.318\" />\n        <GradientStop Color=\"#FFFFEB70\" Offset=\"0.488\" />\n        <GradientStop Color=\"#FFFFD02E\" Offset=\"0.502\" />\n        <GradientStop Color=\"#FFFFD932\" Offset=\"0.834\" />\n        <GradientStop Color=\"#FFFFF48B\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"MouseOverBorderBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFEEE8CF\" Offset=\"0\" />\n        <GradientStop Color=\"#FFC4AF8C\" Offset=\"0.536\" />\n        <GradientStop Color=\"#FFDCD1BF\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"MouseOverHighlightBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFFFFFFB\" Offset=\"0\" />\n        <GradientStop Color=\"#FFFEF3B5\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"PressedBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFC3BCAE\" Offset=\"0\" />\n        <GradientStop Color=\"#FFFDCE9D\" Offset=\"0.046\" />\n        <GradientStop Color=\"#FFFFA35B\" Offset=\"0.452\" />\n        <GradientStop Color=\"#FFFF8A2C\" Offset=\"0.461\" />\n        <GradientStop Color=\"#FFFF9F30\" Offset=\"0.724\" />\n        <GradientStop Color=\"#FFFFC472\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"PressedBorderBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FF8E8165\" Offset=\"0\" />\n        <GradientStop Color=\"#FFC3BCAE\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"PressedHighlightBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFFFFFFF\" Offset=\"0.665\" />\n        <GradientStop Color=\"#FFC3BCAE\" Offset=\"0\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"DisabledBackgroundBrush\" Color=\"#A5FFFFFF\"/>\n    <SolidColorBrush x:Key=\"DisabledBorderBrush\" Color=\"#66FFFFFF\"/>\n    <SolidColorBrush x:Key=\"FocusBrush\" Color=\"#FFE99862\"/>\n\n    <LinearGradientBrush x:Key=\"ControlBackgroundBrush\" EndPoint=\"1.204,0.5\" StartPoint=\"0.056,0.5\">\n        <GradientStop Color=\"#FFFFFFFF\" Offset=\"0\" />\n        <GradientStop Color=\"#FFD4D7DB\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"ControlBorderBrush\" Color=\"#FFB1703C\"/>\n\n    <SolidColorBrush x:Key=\"GlyphBrush\" Color=\"#FF527DB5\"/>\n\n    <!-- CheckBox Brushes -->\n\n    <SolidColorBrush x:Key=\"CheckBoxBackgroundBrush\" Color=\"#FFF4F4F4\"/>\n    <SolidColorBrush x:Key=\"CheckBoxBorderBrush\" Color=\"#FF868686\"/>\n    <SolidColorBrush x:Key=\"CheckBoxInnerBoxBackgroundBrush\" Color=\"#FFCACFD5\"/>\n    <LinearGradientBrush x:Key=\"CheckBoxInnerBoxBorderBrush\" EndPoint=\"-0.007,-0.012\" StartPoint=\"0.915,0.92\">\n        <GradientStop Color=\"#FFE4E5E9\" />\n        <GradientStop Color=\"#FFA2ACB9\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"CheckBoxBackgroundFillBrush\" Color=\"#FFDEEAFA\"/>\n    <SolidColorBrush x:Key=\"CheckBoxMouseOverBrush\" Color=\"#FFFCE7AF\"/>\n    <LinearGradientBrush x:Key=\"CheckBoxPressBorderBrush\" EndPoint=\"0.055,0.119\" StartPoint=\"0.886,0.808\">\n        <GradientStop Color=\"#FFF4D9BE\" />\n        <GradientStop Color=\"#FFF28A27\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"CheckBoxInnerBoxGradientBrush\" StartPoint=\"0.238,0.228\" EndPoint=\"0.752,0.749\">\n        <GradientStop Color=\"#00F6F6F6\" Offset=\"0.254\" />\n        <GradientStop Color=\"#53F8F8F8\" Offset=\"0.54\" />\n        <GradientStop Color=\"#BFFFFFFF\" Offset=\"0.996\" />\n    </LinearGradientBrush>\n\n    <!-- RadioButton Brushes -->\n\n    <SolidColorBrush x:Key=\"RadioButtonBackgroundBrush\" Color=\"#FFEDEDEE\"/>\n    <SolidColorBrush x:Key=\"RadioButtonBorderBrush\" Color=\"#FF597AA5\"/>\n    <LinearGradientBrush x:Key=\"RadioButtonInnerCircleBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFC8CDD2\" />\n        <GradientStop Color=\"#FFF2F2F2\" Offset=\"0.531\" />\n        <GradientStop Color=\"#FFF5F5F5\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"RadioButtonInnerCircleBorderBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFB3B8BD\" Offset=\"0.004\" />\n        <GradientStop Color=\"#FFE0E0E0\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"RadioButtonMouseOverBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFE3DBA9\" />\n        <GradientStop Color=\"#FFFEF5DD\" Offset=\"0.531\" />\n        <GradientStop Color=\"#FFFEF5DD\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"RadioButtonMouseOverBorderBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFE3CF87\" Offset=\"0.004\" />\n        <GradientStop Color=\"#FFFCF0D3\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"RadioButtonPressBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFC8CDD2\" />\n        <GradientStop Color=\"#FFF2F2F2\" Offset=\"0.531\" />\n        <GradientStop Color=\"#FFF5F5F5\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"RadioButtonPressBorderBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFAC773F\" Offset=\"0.004\" />\n        <GradientStop Color=\"#FFC8B5A3\" Offset=\"0.987\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"RadioButtonCheckIconBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFFDDC8B\" Offset=\"0.013\" />\n        <GradientStop Color=\"#FFFDDC8B\" Offset=\"0.188\" />\n        <GradientStop Color=\"#FFF9952F\" Offset=\"0.491\" />\n        <GradientStop Color=\"#FFF9954A\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"RadioButtonCheckIconBorderBrush\" Color=\"#FFDA8229\"/>\n\n    <!-- ScrollBar RepeatButtonBrushes -->\n\n    <LinearGradientBrush x:Key=\"ScrollBarRepeatButtonBrush\" EndPoint=\"0.5,0\" StartPoint=\"0.5,1\">\n        <GradientStop Color=\"#FFF1F6FE\" Offset=\"0.5\" />\n        <GradientStop Color=\"#FFC7D9F1\" Offset=\"0.513\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"ScrollBarRepeatButtonBorderBrush\" Color=\"#FF8C97A5\"/>\n    <LinearGradientBrush x:Key=\"ScrollBarRepeatButtonPressedBrush\" EndPoint=\"0.5,0\" StartPoint=\"0.5,1\">\n        <GradientStop Color=\"#FFF1F6FE\" Offset=\"0.5\" />\n        <GradientStop Color=\"#FFD1D6DD\" Offset=\"0.513\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"ScrollBarRepeatButtonPressedBorderBrush\" Color=\"#FF19598A\"/>\n\n    <!-- ScrollBar ThumbBrushes -->\n\n    <LinearGradientBrush x:Key=\"ScrollBarThumbBrush\" EndPoint=\"-0.062,0.5\" StartPoint=\"1.062,0.5\">\n        <GradientStop Color=\"#FFD1DBE6\" Offset=\"0\" />\n        <GradientStop Color=\"#FFD1DAE4\" Offset=\"0.5\" />\n        <GradientStop Color=\"#FFE6E9F0\" Offset=\"0.513\" />\n        <GradientStop Color=\"#FFE8E9E9\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"ScrollBarThumbBorderBrush\" Color=\"#FF606F94\"/>\n    <LinearGradientBrush x:Key=\"ScrollBarThumbMouseOverBrush\" EndPoint=\"-0.062,0.5\" StartPoint=\"1.062,0.5\">\n        <GradientStop Color=\"#FFB4D1F7\" Offset=\"0\" />\n        <GradientStop Color=\"#FFAACBF6\" Offset=\"0.5\" />\n        <GradientStop Color=\"#FFCADFFA\" Offset=\"0.513\" />\n        <GradientStop Color=\"#FFBED0E8\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"ScrollBarThumbMouseOverBorderBrush\" Color=\"#FF3C6EB0\"/>\n    <LinearGradientBrush x:Key=\"ScrollBarThumbPressedBrush\" EndPoint=\"-0.062,0.5\" StartPoint=\"1.062,0.5\">\n        <GradientStop Color=\"#FFB4D1F7\" Offset=\"0\" />\n        <GradientStop Color=\"#FF6EA6F0\" Offset=\"0.5\" />\n        <GradientStop Color=\"#FFA4C7F6\" Offset=\"0.513\" />\n        <GradientStop Color=\"#FF9CBBE5\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"ScrollBarThumbPressedBorderBrush\" Color=\"#FF17498A\"/>\n\n    <!-- ListItem Brushes -->\n\n    <LinearGradientBrush x:Key=\"ListItemSelectedBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFFFFFFF\" Offset=\"0.046\" />\n        <GradientStop Color=\"#FFD7E0EA\" Offset=\"0.194\" />\n        <GradientStop Color=\"#FFBCC5D5\" Offset=\"0.507\" />\n        <GradientStop Color=\"#FFA4ADBB\" Offset=\"0.521\" />\n        <GradientStop Color=\"#FFBAC1CF\" Offset=\"0.811\" />\n        <GradientStop Color=\"#FFE3E4E6\" Offset=\"0.982\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"ListItemSelectedBorderBrush\" EndPoint=\"0.5,0\" StartPoint=\"0.5,1\">\n        <GradientStop Color=\"#FF8B8B8B\" />\n        <GradientStop Color=\"#FFADADAD\" Offset=\"1\" />\n    </LinearGradientBrush>\n\n    <!-- Expander ToggleButton Brushes -->\n    <LinearGradientBrush x:Key=\"ExpanderToggleButtonBrush\" EndPoint=\"0.293,0.43\" StartPoint=\"0.742,0.43\">\n        <GradientStop Color=\"#FFD6E8FF\" />\n        <GradientStop Color=\"#FFE2EEFF\" Offset=\"0.539\" />\n        <GradientStop Color=\"#FFD6E8FF\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"ExpanderToggleButtonBottomBrush\" Color=\"#FFADD1FF\"/>\n    <LinearGradientBrush x:Key=\"ExpanderToggleButtonHoverBrush\" EndPoint=\"0.667,0.528\" StartPoint=\"0.266,0.528\">\n        <GradientStop Color=\"#FFE3EFFF\" Offset=\"0\" />\n        <GradientStop Color=\"#FFFFFFFF\" Offset=\"0.548\" />\n        <GradientStop Color=\"#FFE3EFFF\" Offset=\"1\" />\n    </LinearGradientBrush>\n\n    <SolidColorBrush x:Key=\"ExpanderToggleArrow2Stroke\" Color=\"#FF567DB1\"/>\n    <SolidColorBrush x:Key=\"ExpanderToggleArrowStroke\" Color=\"#FF567DB1\"/>\n\n    <!-- ProgressBar Brushes -->\n\n    <LinearGradientBrush x:Key=\"ProgressBarIndicatorBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFC6D6EC\" Offset=\"0\" />\n        <GradientStop Color=\"#FFBDD6FF\" Offset=\"0.502\" />\n        <GradientStop Color=\"#FF71A7FD\" Offset=\"0.522\" />\n        <GradientStop Color=\"#FF94BDFD\" Offset=\"0.763\" />\n        <GradientStop Color=\"#FFA9CAFF\" Offset=\"1\" />\n    </LinearGradientBrush>\n\n    <!-- TabControlBrushes -->\n\n    <SolidColorBrush x:Key=\"TabControlHeaderBrush\" Color=\"#FFBFDBFF\"/>\n    <SolidColorBrush x:Key=\"TabControlContentBrush\" Color=\"#FFE0EAF6\"/>\n    <SolidColorBrush x:Key=\"TabControlContentBorderBrush\" Color=\"#FF9ABBE6\"/>\n\n    <!-- TabItemBrushes -->\n\n    <RadialGradientBrush x:Key=\"TabItemHoverBrush\" GradientOrigin=\"0.503,1.06\">\n        <RadialGradientBrush.RelativeTransform>\n            <TransformGroup>\n                <ScaleTransform CenterX=\"0.5\" CenterY=\"0.5\" ScaleX=\"2.06\" ScaleY=\"2.418\" />\n                <SkewTransform CenterX=\"0.5\" CenterY=\"0.5\" />\n                <RotateTransform CenterX=\"0.5\" CenterY=\"0.5\" Angle=\"-180\" />\n                <TranslateTransform X=\"0\" Y=\"0.315\" />\n            </TransformGroup>\n        </RadialGradientBrush.RelativeTransform>\n        <GradientStop Color=\"#00FFFFFF\" Offset=\"0.362\" />\n        <GradientStop Color=\"#AEE8E6E6\" Offset=\"0.496\" />\n        <GradientStop Color=\"#F2E7D39C\" Offset=\"0.629\" />\n    </RadialGradientBrush>\n    <SolidColorBrush x:Key=\"TabItemHoverBorderBrush\" Color=\"#FFDDEFFF\"/>\n    <SolidColorBrush x:Key=\"TabItemHoverHighlightBrush\" Color=\"#FF9FBCF0\"/>\n    <LinearGradientBrush x:Key=\"TabItemSelectedBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFEFF6FE\" Offset=\"0\" />\n        <GradientStop Color=\"#FFE0EAF6\" Offset=\"0.384\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"TabItemSelectedBorderBrush\" Color=\"#FFF3F8FF\"/>\n    <LinearGradientBrush x:Key=\"TabItemBorderTopBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,-0.5\">\n        <GradientStop Color=\"#FFECF9FA\" Offset=\"0\" />\n        <GradientStop Color=\"#FFB4E0F4\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"TabItemHighlightTopBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFF3F8FF\" Offset=\"0\" />\n        <GradientStop Color=\"#D8ECF8FC\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"TabItemBorderTop2Brush\" Color=\"#FF9ABBE6\"/>\n    <LinearGradientBrush x:Key=\"TabItemFocusBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#99F7C53B\" Offset=\"0\" />\n        <GradientStop Color=\"#99F2B93F\" Offset=\"1\" />\n    </LinearGradientBrush>\n\n    <!-- SliderThumbBrushes -->\n    <SolidColorBrush x:Key=\"SliderThumbBorderBrush\" Color=\"#FF496FA2\"/>\n    <SolidColorBrush x:Key=\"SliderThumbBrush\" Color=\"#FFC1C1C1\"/>\n\n    <!-- SliderBrushes -->\n    <LinearGradientBrush x:Key=\"SliderBackgroundBrush\" EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FF324D70\" Offset=\"0.493\" />\n        <GradientStop Color=\"#FF6A8BB6\" Offset=\"1\" />\n    </LinearGradientBrush>\n\n    <Color x:Key=\"BlackColor\">#FF000000</Color>\n    <Color x:Key=\"WhiteColor\">#FFFFFFFF</Color>\n\n    <SolidColorBrush x:Key=\"DisabledForegroundBrush\" Color=\"#888\" />\n\n    <!-- TextControlsBrushes-->\n    <LinearGradientBrush x:Key=\"TextControlBorderBrush\"  EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n        <GradientStop Color=\"#FFABAEB3\"/>\n        <GradientStop Color=\"#FFE2E8EE\" Offset=\"1\"/>\n    </LinearGradientBrush>\n\n    <SolidColorBrush x:Key=\"WindowBackgroundBrush\" Color=\"#FFF\" />\n\n    <Style x:Key=\"NuclearButtonFocusVisual\">\n        <Setter Property=\"Control.Template\">\n            <Setter.Value>\n                <ControlTemplate>\n                    <Border>\n                        <Rectangle Margin=\"2\" Stroke=\"#60000000\" StrokeThickness=\"1\" StrokeDashArray=\"1 2\" />\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style TargetType=\"{x:Type Button}\" BasedOn=\"{x:Null}\">\n        <Setter Property=\"FocusVisualStyle\" Value=\"{DynamicResource NuclearButtonFocusVisual}\" />\n        <Setter Property=\"Foreground\" Value=\"#FF042271\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"3\" />\n\n<Setter Property=\"Template\" Value=\"{DynamicResource ButtonTemplate}\" />\n    </Style>\n    \n    <ControlTemplate x:Key=\"ButtonTemplate\" TargetType=\"{x:Type Button}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundOver\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundOver_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0.65\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundOver_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"0.84\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgoundPressed_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0.65\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgoundPressed_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"DisabledOn\">\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"DisabledVisualElement\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"DisabledOverlay\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid x:Name=\"Grid\">\n                        <Border x:Name=\"BackgroundNorm\" BorderThickness=\"1\" CornerRadius=\"1.75\" Background=\"{DynamicResource NormalBrush}\" BorderBrush=\"{DynamicResource NormalBorderBrush}\"/>\n                        <Border x:Name=\"BackgroundNorm_highlight\" Margin=\"1\" BorderBrush=\"{DynamicResource NormalHighlightBrush}\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0.65\" />\n                        <Border x:Name=\"BackgroundOver\" BorderThickness=\"1\" CornerRadius=\"1.75\" Opacity=\"0\" Background=\"{DynamicResource MouseOverBrush}\" BorderBrush=\"{DynamicResource MouseOverBorderBrush}\"/>\n                        <Border x:Name=\"BackgroundOver_Highlight\" Margin=\"1\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0\" BorderBrush=\"{DynamicResource MouseOverHighlightBrush}\"/>\n                        <Border x:Name=\"BackgroundPressed\" BorderThickness=\"1\" CornerRadius=\"1.75\" Opacity=\"0\" Background=\"{DynamicResource PressedBrush}\" BorderBrush=\"{DynamicResource PressedBorderBrush}\"/>\n                        <Border x:Name=\"BackgoundPressed_Highlight\" Margin=\"1\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0\" BorderBrush=\"{DynamicResource PressedHighlightBrush}\"/>\n                        <Border x:Name=\"DisabledVisualElement\" IsHitTestVisible=\"false\" Background=\"{DynamicResource DisabledBackgroundBrush}\" BorderBrush=\"{DynamicResource DisabledBorderBrush}\" BorderThickness=\"1\" Opacity=\"0\" />\n\n                        <ContentPresenter x:Name=\"contentPresenter\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" Margin=\"{TemplateBinding Padding}\" />\n                        <TextBlock Panel.ZIndex=\"1\" x:Name=\"DisabledOverlay\" Text=\"{TemplateBinding Content}\" Foreground=\"#FF8E96A2\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" Margin=\"{TemplateBinding Padding}\" Visibility=\"Collapsed\" />\n                        <Border x:Name=\"FocusVisualElement\" Margin=\"-1\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"1\" CornerRadius=\"2.75\" IsHitTestVisible=\"false\" Opacity=\"0\" />\n                        <Border x:Name=\"DefaultBorder\" Margin=\"-1\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"1\" CornerRadius=\"2.75\" IsHitTestVisible=\"false\" Opacity=\"0\" />\n                    </Grid>\n\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsDefault\" Value=\"True\">\n                            <Setter Property=\"Opacity\" TargetName=\"DefaultBorder\" Value=\"1\" />\n                        </Trigger>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard x:Name=\"FocusedOn_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOn}\" />\n                            </Trigger.EnterActions>\n                            <Trigger.ExitActions>\n                                <BeginStoryboard x:Name=\"FocusedOff_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOff}\" />\n                            </Trigger.ExitActions>\n                        </Trigger>\n                        <Trigger Property=\"IsKeyboardFocused\" Value=\"true\">\n\n                            <Trigger.ExitActions>\n                                <BeginStoryboard x:Name=\"FocusedOff_BeginStoryboard1\" Storyboard=\"{StaticResource FocusedOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard x:Name=\"FocusedOn_BeginStoryboard1\" Storyboard=\"{StaticResource FocusedOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"true\" />\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource DisabledOn}\" />\n                            </Trigger.EnterActions>\n\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                            <Setter Property=\"Opacity\" TargetName=\"DisabledVisualElement\" Value=\"1\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n\n    <Style x:Key=\"RadioButtonFocusVisual\">\n        <Setter Property=\"Control.Template\">\n            <Setter.Value>\n                <ControlTemplate>\n                    <Border>\n                        <Rectangle Margin=\"15,0,0,0\" Stroke=\"#60000000\" StrokeThickness=\"1\" StrokeDashArray=\"1 2\" />\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style x:Key=\"CheckBoxFocusVisual\">\n        <Setter Property=\"Control.Template\">\n            <Setter.Value>\n                <ControlTemplate>\n                    <Border>\n                        <Rectangle Margin=\"15,0,0,0\" Stroke=\"#60000000\" StrokeThickness=\"1\" StrokeDashArray=\"1 2\" />\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style TargetType=\"{x:Type CheckBox}\">\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"FocusVisualStyle\" Value=\"{DynamicResource CheckBoxFocusVisual}\" />\n        <Setter Property=\"Foreground\" Value=\"{StaticResource OutsideFontColor}\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Top\" />\n        <Setter Property=\"Padding\" Value=\"4,1,0,0\" />\n<Setter Property=\"Template\" Value=\"{DynamicResource CheckBoxTemplate}\" />\n    </Style>\n        \n<ControlTemplate x:Key=\"CheckBoxTemplate\" TargetType=\"{x:Type CheckBox}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BoxOver\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BoxOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOn\">\n                            <ColorAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BoxOver\" Storyboard.TargetProperty=\"(Shape.Stroke).(GradientBrush.GradientStops)[1].(GradientStop.Color)\" To=\"#FFF28A27\" />\n                            <ColorAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BoxOver\" Storyboard.TargetProperty=\"(Shape.Stroke).(GradientBrush.GradientStops)[0].(GradientStop.Color)\" To=\"#FFF4D9BE\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BoxOver\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundFill\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOff\">\n                            <ColorAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BoxOver\" Storyboard.TargetProperty=\"(Shape.Stroke).(GradientBrush.GradientStops)[1].(GradientStop.Color)\" To=\"#FFFDDA81\" />\n                            <ColorAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BoxOver\" Storyboard.TargetProperty=\"(Shape.Stroke).(GradientBrush.GradientStops)[0].(GradientStop.Color)\" To=\"#FFFCE7AF\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BoxOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundFill\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"DisabledOn\">\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"DisabledVisualElement\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BoxPress\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"CheckIcon\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BoxPress\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"CheckIcon\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.4000000\" Value=\"{x:Static Visibility.Collapsed}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"IndeterminateOn\">\n\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"IndeterminateIcon\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"IndeterminateOff\">\n\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"IndeterminateIcon\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Collapsed}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusedVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusedVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <BulletDecorator Background=\"Transparent\">\n                        <BulletDecorator.Bullet>\n                            <Grid>\n                                <Rectangle x:Name=\"Background\" Margin=\"1\" Width=\"13\" Height=\"13\" RadiusX=\"0\" RadiusY=\"0\" Fill=\"{DynamicResource CheckBoxBackgroundBrush}\" Stroke=\"{DynamicResource CheckBoxBorderBrush}\" StrokeThickness=\"1\" />\n                                <Rectangle x:Name=\"BoxFill\" Width=\"9\" Height=\"9\" RadiusX=\"0\" RadiusY=\"0\" Fill=\"{DynamicResource CheckBoxInnerBoxBackgroundBrush}\" StrokeThickness=\"1\" Stroke=\"{DynamicResource CheckBoxInnerBoxBorderBrush}\"/>\n                                <Rectangle x:Name=\"BackgroundFill\" Margin=\"1\" Width=\"13\" Height=\"13\" RadiusX=\"0\" RadiusY=\"0\" Fill=\"{DynamicResource CheckBoxBackgroundFillBrush}\" Stroke=\"#FF5577A3\" StrokeThickness=\"1\" Opacity=\"0\" />\n                                <Rectangle x:Name=\"BoxOver\" Margin=\"3\" Width=\"9\" Height=\"9\" RadiusX=\"0\" RadiusY=\"0\" Fill=\"{DynamicResource CheckBoxMouseOverBrush}\" StrokeThickness=\"1\" Opacity=\"0\">\n                                    <Rectangle.Stroke>\n                                        <LinearGradientBrush EndPoint=\"0.055,0.119\" StartPoint=\"0.886,0.808\">\n                                            <GradientStop Color=\"#FFFCE7AF\" />\n                                            <GradientStop Color=\"#FFFDDA81\" Offset=\"1\" />\n                                        </LinearGradientBrush>\n                                    </Rectangle.Stroke>\n                                </Rectangle>\n                                <Rectangle x:Name=\"BoxPress\" Margin=\"3\" Width=\"9\" Height=\"9\" RadiusX=\"0\" RadiusY=\"0\" StrokeThickness=\"1\" Opacity=\"0\" Stroke=\"{DynamicResource CheckBoxPressBorderBrush}\"/>\n                                <Rectangle x:Name=\"BoxGradient\" Width=\"7\" Height=\"7\" RadiusX=\"0\" RadiusY=\"0\" StrokeThickness=\"1\" Fill=\"{DynamicResource CheckBoxInnerBoxGradientBrush}\"/>\n                                <Rectangle x:Name=\"IndeterminateIcon\" Width=\"5\" Height=\"2\" Fill=\"{DynamicResource GlyphBrush}\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Visibility=\"Collapsed\" />\n                                <Path x:Name=\"CheckIcon\" Margin=\"0,3.333,3.833,0\" Width=\"7\" Height=\"9\" Fill=\"{DynamicResource GlyphBrush}\" Stretch=\"Fill\" VerticalAlignment=\"Top\" HorizontalAlignment=\"Right\" Data=\"M103.78572,598.96112 L105.09846,597.5661 L107.00806,600.16229 C107.00806,600.16229 109.91004,592.74463 109.91004,592.74463 C109.91004,592.74463 111.74678,593.79761 111.74678,593.79761 C111.74678,593.79761 107.88566,602.75848 107.88566,602.75848 L106.60118,602.75848 z\" Visibility=\"Collapsed\" />\n                                <Rectangle x:Name=\"FocusedVisualElement\" RadiusX=\"0\" RadiusY=\"0\" Stroke=\"{DynamicResource FocusBrush}\" StrokeThickness=\"1\" Opacity=\"0\" />\n                                <Rectangle x:Name=\"DisabledVisualElement\" Margin=\"1\" RadiusX=\"0\" RadiusY=\"0\" Fill=\"{DynamicResource DisabledBackgroundBrush}\" Visibility=\"Collapsed\" />\n                            </Grid>\n                        </BulletDecorator.Bullet>\n                        <ContentPresenter Grid.Column=\"1\" x:Name=\"contentPresenter\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" Margin=\"{TemplateBinding Padding}\" />\n                    </BulletDecorator>\n\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" x:Name=\"FocusedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <MultiTrigger>\n                            <MultiTrigger.Conditions>\n                                <Condition Property=\"IsChecked\" Value=\"True\" />\n                                <Condition Property=\"IsThreeState\" Value=\"True\" />\n                            </MultiTrigger.Conditions>\n                            <MultiTrigger.EnterActions>\n                                <BeginStoryboard x:Name=\"CheckedOff_BeginStoryboard\" Storyboard=\"{StaticResource CheckedOff}\" />\n                            </MultiTrigger.EnterActions>\n                            <MultiTrigger.ExitActions>\n                                <BeginStoryboard x:Name=\"CheckedOn_BeginStoryboard\" Storyboard=\"{StaticResource CheckedOn}\" />\n                            </MultiTrigger.ExitActions>\n                        </MultiTrigger>\n                        <MultiTrigger>\n                            <MultiTrigger.Conditions>\n                                <Condition Property=\"IsChecked\" Value=\"{x:Null}\" />\n                                <Condition Property=\"IsThreeState\" Value=\"True\" />\n                            </MultiTrigger.Conditions>\n                            <MultiTrigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource IndeterminateOn}\" />\n                            </MultiTrigger.EnterActions>\n                            <MultiTrigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource IndeterminateOff}\" />\n                            </MultiTrigger.ExitActions>\n                            <Setter Property=\"Opacity\" TargetName=\"CheckIcon\" Value=\"0\" />\n                        </MultiTrigger>\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard x:Name=\"CheckedOn_BeginStoryboard2\" Storyboard=\"{StaticResource CheckedOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard x:Name=\"CheckedOn_BeginStoryboard1\" Storyboard=\"{StaticResource CheckedOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource DisabledOn}\" />\n                            </Trigger.EnterActions>\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n\n                </ControlTemplate>\n\n    <Style TargetType=\"{x:Type RadioButton}\">\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"FocusVisualStyle\" Value=\"{DynamicResource RadioButtonFocusVisual}\" />\n        <Setter Property=\"Foreground\" Value=\"{StaticResource OutsideFontColor}\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Top\" />\n        <Setter Property=\"Padding\" Value=\"4,1,0,0\" />\n\n<Setter Property=\"Template\" Value=\"{DynamicResource RadioButtonTemplate}\" />\n    </Style>\n        \n<ControlTemplate x:Key=\"RadioButtonTemplate\" TargetType=\"{x:Type RadioButton}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"CircleOver\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"CircleOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"CirclePress\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"CirclePress\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"DisabledOn\" />\n                        <Storyboard x:Key=\"CheckedOn\">\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"CheckIcon\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOff\">\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"CheckIcon\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.4000000\" Value=\"{x:Static Visibility.Collapsed}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusedVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusedVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <BulletDecorator Background=\"Transparent\">\n                        <BulletDecorator.Bullet>\n                            <Grid>\n                                <Ellipse x:Name=\"Background\" Margin=\"1\" Width=\"14\" Height=\"14\" Fill=\"{DynamicResource RadioButtonBackgroundBrush}\" Stroke=\"{DynamicResource RadioButtonBorderBrush}\" StrokeThickness=\"1\" />\n                                <Ellipse x:Name=\"CircleFill\" Margin=\"3.045,3.157,2.955,2.843\" StrokeThickness=\"1\" Fill=\"{DynamicResource RadioButtonInnerCircleBrush}\" Stroke=\"{DynamicResource RadioButtonInnerCircleBorderBrush}\"/>\n                                <Ellipse x:Name=\"CircleOver\" Margin=\"2.847,2.847,3.153,3.153\" StrokeThickness=\"1\" Opacity=\"0\" Fill=\"{DynamicResource RadioButtonMouseOverBrush}\" Stroke=\"{DynamicResource RadioButtonMouseOverBorderBrush}\">\n                                </Ellipse>\n                                <Ellipse x:Name=\"CirclePress\" Margin=\"2.73,2.73,3.27,3.27\" StrokeThickness=\"1\" Opacity=\"0\" Fill=\"{DynamicResource RadioButtonPressBrush}\" Stroke=\"{DynamicResource RadioButtonPressBorderBrush}\"/>\n                                <Ellipse x:Name=\"CheckIcon\" Margin=\"4.47,4.498,3.53,3.502\" StrokeThickness=\"1\" Visibility=\"Collapsed\" Stroke=\"{DynamicResource RadioButtonCheckIconBorderBrush}\" Fill=\"{DynamicResource RadioButtonCheckIconBrush}\">\n                                </Ellipse>\n                                <Ellipse x:Name=\"DisabledVisualElement\" Width=\"14\" Height=\"14\" Opacity=\"0.35\" Visibility=\"Visible\" >\n                                    <Ellipse.Stroke>\n                                        <SolidColorBrush Color=\"{DynamicResource WhiteColor}\"/>\n                                    </Ellipse.Stroke>\n                                    <Ellipse.Fill>\n                                        <SolidColorBrush Color=\"{DynamicResource WhiteColor}\"/>\n                                    </Ellipse.Fill>\n                                </Ellipse>\n                                <Ellipse x:Name=\"FocusedVisualElement\" Width=\"16\" Height=\"16\" Stroke=\"{DynamicResource FocusBrush}\" StrokeThickness=\"1\" IsHitTestVisible=\"false\" Opacity=\"0\" />\n                            </Grid>\n                        </BulletDecorator.Bullet>\n                        <ContentPresenter Grid.Column=\"1\" x:Name=\"contentPresenter\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" Margin=\"{TemplateBinding Padding}\" />\n                    </BulletDecorator>\n\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" x:Name=\"FocusedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsChecked\" Value=\"false\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOn}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOff}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource DisabledOn}\" />\n                            </Trigger.EnterActions>\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                        </Trigger>\n\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n\n    <Style x:Key=\"NuclearRepeatButton\" d:IsControlPart=\"True\" TargetType=\"{x:Type RepeatButton}\" BasedOn=\"{x:Null}\">\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type RepeatButton}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"PressedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Background\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Highlight\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Background\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Highlight\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.4000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid>\n                        <Rectangle x:Name=\"Background\" RadiusX=\"0.5\" RadiusY=\"0.5\" StrokeThickness=\"1\" Stroke=\"{DynamicResource ScrollBarRepeatButtonBorderBrush}\" Opacity=\"0\" Fill=\"{DynamicResource ScrollBarRepeatButtonBrush}\"/>\n                        <Rectangle x:Name=\"BackgroundPressed\" RadiusX=\"0.5\" RadiusY=\"0.5\" StrokeThickness=\"1\" Stroke=\"{DynamicResource ScrollBarRepeatButtonPressedBorderBrush}\" Opacity=\"0\" Fill=\"{DynamicResource ScrollBarRepeatButtonPressedBrush}\"/>\n                        <Rectangle x:Name=\"Highlight\" Margin=\"1\" RadiusX=\"0.5\" RadiusY=\"0.5\" Stroke=\"#99FFFFFF\" StrokeThickness=\"1\" Opacity=\"0\" IsHitTestVisible=\"false\" />\n                        <Rectangle x:Name=\"DisabledElement\" RadiusX=\"0\" RadiusY=\"0\" Fill=\"{DynamicResource DisabledBackgroundBrush}\" Opacity=\"0\" />\n                        <ContentPresenter HorizontalAlignment=\"Center\" x:Name=\"ContentPresenter\" VerticalAlignment=\"Center\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" ContentTemplateSelector=\"{TemplateBinding ContentTemplateSelector}\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsKeyboardFocused\" Value=\"true\" />\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" x:Name=\"HoverOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOff}\" x:Name=\"PressedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                            <Setter Property=\"Opacity\" TargetName=\"ContentPresenter\" Value=\"0.5\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style x:Key=\"NuclearThumbStyle\" d:IsControlPart=\"True\" TargetType=\"{x:Type Thumb}\" BasedOn=\"{x:Null}\">\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Thumb}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundMouseOver\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundMouseOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid Margin=\"0,0,0,0\" x:Name=\"ThumbVisual\">\n                        <Rectangle x:Name=\"Background\" RadiusX=\"1.5\" RadiusY=\"1.5\" StrokeThickness=\"1\" Stroke=\"{DynamicResource ScrollBarThumbBorderBrush}\" Fill=\"{DynamicResource ScrollBarThumbBrush}\"/>\n                        <Rectangle x:Name=\"BackgroundMouseOver\" RadiusX=\"1.5\" RadiusY=\"1.5\" StrokeThickness=\"1\" Stroke=\"{DynamicResource ScrollBarThumbMouseOverBorderBrush}\" Opacity=\"0\" Fill=\"{DynamicResource ScrollBarThumbMouseOverBrush}\"/>\n                        <Rectangle x:Name=\"BackgroundPressed\" RadiusX=\"1.5\" RadiusY=\"1.5\" StrokeThickness=\"1\" Stroke=\"{DynamicResource ScrollBarThumbPressedBorderBrush}\" Opacity=\"0\" Fill=\"{DynamicResource ScrollBarThumbPressedBrush}\"/>\n                        <Path Margin=\"0,-6,0,0\" Width=\"11\" Height=\"1\" Stretch=\"Fill\" Stroke=\"#FF848485\" StrokeThickness=\"1\" Data=\"M4.8333325,7.2499995 L12.012101,7.2499995\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\">\n                            <Path.Fill>\n                                <LinearGradientBrush EndPoint=\"-0.062,0.5\" StartPoint=\"1.062,0.5\">\n                                    <GradientStop Color=\"#FFC8C9CC\" Offset=\"0.487\" />\n                                    <GradientStop Color=\"#FFF0F0F0\" Offset=\"0.518\" />\n                                </LinearGradientBrush>\n                            </Path.Fill>\n                        </Path>\n                        <Path Margin=\"0,-2,0,0\" Width=\"11\" Height=\"1\" Stretch=\"Fill\" Stroke=\"#FF848485\" StrokeThickness=\"1\" Data=\"M4.8333325,7.2499995 L12.012101,7.2499995\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\">\n                            <Path.Fill>\n                                <LinearGradientBrush EndPoint=\"-0.062,0.5\" StartPoint=\"1.062,0.5\">\n                                    <GradientStop Color=\"#FFC8C9CC\" Offset=\"0.487\" />\n                                    <GradientStop Color=\"#FFF0F0F0\" Offset=\"0.518\" />\n                                </LinearGradientBrush>\n                            </Path.Fill>\n                        </Path>\n                        <Path Margin=\"0,0,0,-2\" Width=\"11\" Height=\"1\" Stretch=\"Fill\" Stroke=\"#FF848485\" StrokeThickness=\"1\" Data=\"M4.8333325,7.2499995 L12.012101,7.2499995\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\">\n                            <Path.Fill>\n                                <LinearGradientBrush EndPoint=\"-0.062,0.5\" StartPoint=\"1.062,0.5\">\n                                    <GradientStop Color=\"#FFC8C9CC\" Offset=\"0.487\" />\n                                    <GradientStop Color=\"#FFF0F0F0\" Offset=\"0.518\" />\n                                </LinearGradientBrush>\n                            </Path.Fill>\n                        </Path>\n                        <Path Margin=\"0,0,0,-6\" Width=\"11\" Height=\"1\" Stretch=\"Fill\" Stroke=\"#FF848485\" StrokeThickness=\"1\" Data=\"M4.8333325,7.2499995 L12.012101,7.2499995\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\">\n                            <Path.Fill>\n                                <LinearGradientBrush EndPoint=\"-0.062,0.5\" StartPoint=\"1.062,0.5\">\n                                    <GradientStop Color=\"#FFC8C9CC\" Offset=\"0.487\" />\n                                    <GradientStop Color=\"#FFF0F0F0\" Offset=\"0.518\" />\n                                </LinearGradientBrush>\n                            </Path.Fill>\n                        </Path>\n                        <Rectangle x:Name=\"Highlight\" Margin=\"1\" RadiusX=\"0.5\" RadiusY=\"0.5\" StrokeThickness=\"1\" Opacity=\"0.6\" IsHitTestVisible=\"false\" Stroke=\"{DynamicResource NormalHighlightBrush}\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\" />\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\n                            <Setter Property=\"Opacity\" TargetName=\"ThumbVisual\" Value=\"0\" />\n                        </Trigger>\n                        <Trigger Property=\"IsDragging\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOff}\" x:Name=\"PressedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOn}\" x:Name=\"PressedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style x:Key=\"NuclearScrollRepeatButtonStyle\" d:IsControlPart=\"True\" TargetType=\"{x:Type RepeatButton}\">\n        <Setter Property=\"Background\" Value=\"Transparent\" />\n        <Setter Property=\"BorderBrush\" Value=\"Transparent\" />\n        <Setter Property=\"IsTabStop\" Value=\"false\" />\n        <Setter Property=\"Focusable\" Value=\"false\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type RepeatButton}\">\n                    <Grid>\n                        <Rectangle Fill=\"{TemplateBinding Background}\" Stroke=\"{TemplateBinding BorderBrush}\" StrokeThickness=\"{TemplateBinding BorderThickness}\" />\n                    </Grid>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type ScrollBar}\">\n        <Setter Property=\"Stylus.IsFlicksEnabled\" Value=\"false\" />\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ScrollBar}\">\n                    <Grid x:Name=\"GridRoot\" Width=\"{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}\">\n                        <Grid.RowDefinitions>\n                            <RowDefinition MaxHeight=\"18\" />\n                            <RowDefinition Height=\"0.00001*\" />\n                            <RowDefinition MaxHeight=\"18\" />\n                        </Grid.RowDefinitions>\n                        <Rectangle Grid.RowSpan=\"4\" RadiusX=\"0\" RadiusY=\"0\" StrokeThickness=\"1\" Opacity=\"1\" >\n                            <Rectangle.Stroke>\n                                <SolidColorBrush Color=\"#FFF0F0F0\"/>\n                            </Rectangle.Stroke>\n                            <Rectangle.Fill>\n                                <SolidColorBrush Color=\"#FFEFEFEF\"/>\n                            </Rectangle.Fill>\n                        </Rectangle>\n                        <RepeatButton x:Name=\"DecreaseRepeat\" Style=\"{DynamicResource NuclearRepeatButton}\" Command=\"ScrollBar.LineUpCommand\">\n                            <Grid>\n                                <Path Data=\"F1 M 541.537,173.589L 531.107,173.589L 536.322,167.49L 541.537,173.589 Z \" Height=\"6\" Width=\"10\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Stretch=\"Uniform\" IsHitTestVisible=\"False\">\n                                    <Path.Fill>\n                                        <LinearGradientBrush EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n                                            <GradientStop Color=\"#FF5E6D91\" />\n                                            <GradientStop Color=\"#FF2B3B60\" Offset=\"1\" />\n                                        </LinearGradientBrush>\n                                    </Path.Fill>\n                                </Path>\n                            </Grid>\n                        </RepeatButton>\n\n                        <Track Grid.Row=\"1\" x:Name=\"PART_Track\" Orientation=\"Vertical\" IsDirectionReversed=\"true\">\n                            <Track.Thumb>\n                                <Thumb Style=\"{DynamicResource NuclearThumbStyle}\" />\n                            </Track.Thumb>\n                            <Track.IncreaseRepeatButton>\n                                <RepeatButton x:Name=\"PageUp\" Style=\"{DynamicResource NuclearScrollRepeatButtonStyle}\" Command=\"ScrollBar.PageDownCommand\" />\n                            </Track.IncreaseRepeatButton>\n                            <Track.DecreaseRepeatButton>\n                                <RepeatButton x:Name=\"PageDown\" Style=\"{DynamicResource NuclearScrollRepeatButtonStyle}\" Command=\"ScrollBar.PageUpCommand\" />\n                            </Track.DecreaseRepeatButton>\n                        </Track>\n\n                        <RepeatButton Grid.Row=\"2\" x:Name=\"IncreaseRepeat\" Style=\"{DynamicResource NuclearRepeatButton}\" Command=\"ScrollBar.LineDownCommand\">\n                            <Grid>\n                                <Path Data=\"F1 M 531.107,321.943L 541.537,321.943L 536.322,328.042L 531.107,321.943 Z \" Grid.Row=\"4\" Height=\"6\" Width=\"10\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Stretch=\"Uniform\" IsHitTestVisible=\"False\">\n                                    <Path.Fill>\n                                        <LinearGradientBrush EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n                                            <GradientStop Color=\"#FF5E6D91\" Offset=\"0.004\" />\n                                            <GradientStop Color=\"#FF2B3B60\" Offset=\"0.996\" />\n                                        </LinearGradientBrush>\n                                    </Path.Fill>\n                                </Path>\n                            </Grid>\n                        </RepeatButton>\n                    </Grid>\n\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"Orientation\" Value=\"Horizontal\">\n\n                            <Setter Property=\"LayoutTransform\" TargetName=\"GridRoot\">\n                                <Setter.Value>\n                                    <RotateTransform Angle=\"-90\" />\n                                </Setter.Value>\n                            </Setter>\n\n                            <Setter TargetName=\"PART_Track\" Property=\"Orientation\" Value=\"Vertical\" />\n\n                            <Setter Property=\"Command\" Value=\"ScrollBar.LineLeftCommand\" TargetName=\"DecreaseRepeat\" />\n                            <Setter Property=\"Command\" Value=\"ScrollBar.LineRightCommand\" TargetName=\"IncreaseRepeat\" />\n                            <Setter Property=\"Command\" Value=\"ScrollBar.PageLeftCommand\" TargetName=\"PageDown\" />\n                            <Setter Property=\"Command\" Value=\"ScrollBar.PageRightCommand\" TargetName=\"PageUp\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type ScrollViewer}\" BasedOn=\"{x:Null}\">\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ScrollViewer}\">\n                    <Grid Background=\"{TemplateBinding Background}\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"*\" />\n                            <ColumnDefinition Width=\"Auto\" />\n                        </Grid.ColumnDefinitions>\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"*\" />\n                            <RowDefinition Height=\"Auto\" />\n                        </Grid.RowDefinitions>\n                        <ScrollContentPresenter Grid.Column=\"0\" Grid.Row=\"0\" Margin=\"{TemplateBinding Padding}\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" CanContentScroll=\"{TemplateBinding CanContentScroll}\" />\n\n                        <ScrollBar Visibility=\"{TemplateBinding ComputedHorizontalScrollBarVisibility}\" Grid.Column=\"0\" Grid.Row=\"1\" x:Name=\"PART_HorizontalScrollBar\" Orientation=\"Horizontal\" Value=\"{Binding Path=HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}\" ViewportSize=\"{TemplateBinding ViewportWidth}\" Minimum=\"0\" Maximum=\"{TemplateBinding ScrollableWidth}\" AutomationProperties.AutomationId=\"HorizontalScrollBar\" />\n                        <ScrollBar Visibility=\"{TemplateBinding ComputedVerticalScrollBarVisibility}\" Grid.Column=\"1\" Grid.Row=\"0\" x:Name=\"PART_VerticalScrollBar\" Orientation=\"Vertical\" Value=\"{Binding Path=VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}\" ViewportSize=\"{TemplateBinding ViewportHeight}\" Minimum=\"0\" Maximum=\"{TemplateBinding ScrollableHeight}\" AutomationProperties.AutomationId=\"VerticalScrollBar\" />\n                    </Grid>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style TargetType=\"{x:Type ListBox}\">\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"ScrollViewer.HorizontalScrollBarVisibility\" Value=\"Auto\" />\n        <Setter Property=\"ScrollViewer.VerticalScrollBarVisibility\" Value=\"Auto\" />\n        <Setter Property=\"ScrollViewer.CanContentScroll\" Value=\"True\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ControlBorderBrush}\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"Padding\" Value=\"1\" />\n        <Setter Property=\"IsTabStop\" Value=\"False\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ListBox}\">\n                    <Grid>\n                        <Border x:Name=\"Border\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"1\" Background=\"{DynamicResource ControlBackgroundBrush}\">\n                            <ScrollViewer Margin=\"1\" Focusable=\"false\" Foreground=\"{TemplateBinding Foreground}\">\n\n                                <StackPanel Margin=\"2\" IsItemsHost=\"true\" />\n\n                            </ScrollViewer>\n                        </Border>\n                        <Border x:Name=\"DisabledVisualElement\" IsHitTestVisible=\"false\" Background=\"#A5FFFFFF\" BorderBrush=\"#66FFFFFF\" BorderThickness=\"1\" Opacity=\"0\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Opacity\" TargetName=\"DisabledVisualElement\" Value=\"1\" />\n                        </Trigger>\n                        <Trigger Property=\"IsGrouping\" Value=\"true\">\n                            <Setter Property=\"ScrollViewer.CanContentScroll\" Value=\"false\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style d:IsControlPart=\"True\" TargetType=\"{x:Type ListBoxItem}\">\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"OverridesDefaultStyle\" Value=\"true\" />\n        <Setter Property=\"Padding\" Value=\"3\" />\n        <Setter Property=\"Foreground\" Value=\"{StaticResource OutsideFontColor}\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ListBoxItem}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundGradientOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0.73\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundGradientOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"SelectedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundGradientSelected\" Storyboard.TargetProperty=\"Opacity\" To=\"0.84\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundGradientSelectedDisabled\" Storyboard.TargetProperty=\"Opacity\" To=\"0.55\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"SelectedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundGradientSelected\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundGradientSelectedDisabled\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid SnapsToDevicePixels=\"true\">\n                        <Rectangle x:Name=\"BackgroundGradientOver\" RadiusX=\"1\" RadiusY=\"1\" Stroke=\"{DynamicResource MouseOverBorderBrush}\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                        <Rectangle x:Name=\"BackgroundGradientSelectedDisabled\" RadiusX=\"1\" RadiusY=\"1\" Opacity=\"0\" Fill=\"{DynamicResource ListItemSelectedBrush}\" Stroke=\"{DynamicResource ListItemSelectedBorderBrush}\"/>\n                        <Rectangle x:Name=\"BackgroundGradientSelected\" Stroke=\"{DynamicResource PressedBorderBrush}\" StrokeThickness=\"1\" RadiusX=\"1\" RadiusY=\"1\" Opacity=\"0\" Fill=\"{DynamicResource PressedBrush}\">\n\n                        </Rectangle>\n                        <ContentPresenter x:Name=\"contentPresenter\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" Margin=\"{TemplateBinding Padding}\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n\n                        <Trigger Property=\"IsSelected\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource SelectedOff}\" x:Name=\"SelectedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource SelectedOn}\" x:Name=\"SelectedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style x:Key=\"ExpanderHeaderFocusVisual\">\n        <Setter Property=\"Control.Template\">\n            <Setter.Value>\n                <ControlTemplate>\n                    <Border>\n                        <Rectangle SnapsToDevicePixels=\"true\" Margin=\"0\" Stroke=\"Black\" StrokeDashArray=\"1 2\" StrokeThickness=\"1\" />\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style x:Key=\"ExpanderDownHeaderStyle\" TargetType=\"{x:Type ToggleButton}\">\n        <Setter Property=\"Foreground\" Value=\"#FF15428B\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"11\" />\n        <Setter Property=\"FontWeight\" Value=\"Bold\" />\n        <Setter Property=\"Padding\" Value=\"6,0,4,0\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"arrow_over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"border_over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"arrow_over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"border_over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"-1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow2\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"-1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow2\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Focus_Border\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"arrow_focus\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Focus_Border\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"arrow_focus\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid Background=\"Transparent\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"*\" />\n                            <ColumnDefinition Width=\"20\" />\n                        </Grid.ColumnDefinitions>\n                        <Border x:Name=\"border_fill\" Grid.ColumnSpan=\"2\" Background=\"{DynamicResource ExpanderToggleButtonBrush}\"/>\n                        <Border x:Name=\"border_inner\" Margin=\"0,0,0,1\" Grid.ColumnSpan=\"2\" BorderBrush=\"#FFFFFFFF\" BorderThickness=\"1,1,0,0\" />\n                        <Border x:Name=\"border_bottom\" Grid.ColumnSpan=\"2\" BorderBrush=\"{DynamicResource ExpanderToggleButtonBottomBrush}\" BorderThickness=\"0,0,0,1\" />\n                        <Border x:Name=\"border_over\" Margin=\"1\" Grid.ColumnSpan=\"2\" Opacity=\"0\" Background=\"{DynamicResource ExpanderToggleButtonHoverBrush}\"/>\n                        <Rectangle x:Name=\"arrow_over\" Margin=\"0,1,1,1\" Grid.Column=\"1\" Width=\"20\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                        <Rectangle x:Name=\"arrow_focus\" Margin=\"0,1,1,1\" Grid.Column=\"1\" Width=\"20\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                        <Path x:Name=\"arrow2\" Margin=\"0,0,6,6\" Grid.Column=\"1\" Stroke=\"{DynamicResource ExpanderToggleArrow2Stroke}\" StrokeThickness=\"1.5\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Center\" Data=\"M 1,1.5 L 4.5,5 L 8,1.5\" RenderTransformOrigin=\"0.5,0.5\">\n                            <Path.RenderTransform>\n                                <TransformGroup>\n                                    <ScaleTransform />\n                                    <SkewTransform />\n                                    <RotateTransform />\n                                    <TranslateTransform />\n                                </TransformGroup>\n                            </Path.RenderTransform>\n                        </Path>\n                        <Path x:Name=\"arrow\" Margin=\"0,2,6,0\" Grid.Column=\"1\" Stroke=\"{DynamicResource ExpanderToggleArrowStroke}\" StrokeThickness=\"1.5\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Center\" Data=\"M 1,1.5 L 4.5,5 L 8,1.5\" RenderTransformOrigin=\"0.5,0.5\">\n                            <Path.RenderTransform>\n                                <TransformGroup>\n                                    <ScaleTransform />\n                                    <SkewTransform />\n                                    <RotateTransform />\n                                    <TranslateTransform />\n                                </TransformGroup>\n                            </Path.RenderTransform>\n                        </Path>\n                        <ContentPresenter x:Name=\"header\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" VerticalAlignment=\"Center\" IsHitTestVisible=\"false\" Margin=\"6,4,4,4\" />\n                        <Border x:Name=\"Focus_Border\" Margin=\"-1,-1,-1,0\" Grid.ColumnSpan=\"2\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"1\" IsHitTestVisible=\"false\" Panel.ZIndex=\"1\" Opacity=\"0\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard x:Name=\"FocusedOn_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOn}\" />\n                            </Trigger.EnterActions>\n                            <Trigger.ExitActions>\n                                <BeginStoryboard x:Name=\"FocusedOff_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOff}\" />\n                            </Trigger.ExitActions>\n                        </Trigger>\n                        <Trigger Property=\"IsChecked\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOff}\" x:Name=\"CheckedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOn}\" x:Name=\"CheckedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"true\" />\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <Style x:Key=\"ExpanderRightHeaderStyle\" TargetType=\"{x:Type ToggleButton}\">\n        <Setter Property=\"Foreground\" Value=\"#FF15428B\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"11\" />\n        <Setter Property=\"FontWeight\" Value=\"Bold\" />\n        <Setter Property=\"Padding\" Value=\"6,0,4,0\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"arrow_over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"border_over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"arrow_over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"border_over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"-1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow2\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"-1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.4000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.4000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow2\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Focus_Border\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"arrow_focus\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Focus_Border\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"arrow_focus\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n\n                    </ControlTemplate.Resources>\n                    <Grid SnapsToDevicePixels=\"False\" Background=\"Transparent\">\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"19\" />\n                            <RowDefinition Height=\"*\" />\n                        </Grid.RowDefinitions>\n                        <Border x:Name=\"border_fill\" d:LayoutOverrides=\"GridBox\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"2\" Background=\"{DynamicResource ExpanderToggleButtonBrush}\"/>\n                        <Border x:Name=\"border_inner\" BorderBrush=\"#FFFFFFFF\" BorderThickness=\"1,1,0,0\" d:LayoutOverrides=\"GridBox\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"2\" />\n                        <Border x:Name=\"border_bottom\" BorderBrush=\"{DynamicResource ExpanderToggleButtonBrush}\" BorderThickness=\"0,0,0,1\" d:LayoutOverrides=\"GridBox\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"2\" />\n                        <Border x:Name=\"border_over\" Opacity=\"0\" d:LayoutOverrides=\"GridBox\" Grid.ColumnSpan=\"1\" Grid.RowSpan=\"2\" Background=\"{DynamicResource ExpanderToggleButtonHoverBrush}\"/>\n                        <Grid>\n                            <Grid.LayoutTransform>\n                                <TransformGroup>\n                                    <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                    <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                    <RotateTransform Angle=\"0\" />\n                                    <TranslateTransform X=\"0\" Y=\"0\" />\n                                </TransformGroup>\n                            </Grid.LayoutTransform>\n                            <Rectangle x:Name=\"arrow_focus\" Margin=\"1\" Grid.Column=\"1\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                            <Rectangle x:Name=\"arrow_over\" Margin=\"1\" Grid.Column=\"1\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                            <Path x:Name=\"arrow2\" Margin=\"3,0,0,0\" Grid.Column=\"1\" Stroke=\"{DynamicResource ExpanderToggleArrow2Stroke}\" StrokeThickness=\"1.5\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Data=\"M 1,1.5 L 4.5,5 L 8,1.5\" RenderTransformOrigin=\"0.5,0.5\">\n                                <Path.RenderTransform>\n                                    <TransformGroup>\n                                        <ScaleTransform />\n                                        <SkewTransform />\n                                        <RotateTransform Angle=\"-90\" />\n                                        <TranslateTransform />\n                                    </TransformGroup>\n                                </Path.RenderTransform>\n                            </Path>\n                            <Path x:Name=\"arrow\" Margin=\"7,0,0,0\" Grid.Column=\"1\" Stroke=\"{DynamicResource ExpanderToggleArrowStroke}\" StrokeThickness=\"1.5\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Data=\"M 1,1.5 L 4.5,5 L 8,1.5\" RenderTransformOrigin=\"0.5,0.5\">\n                                <Path.RenderTransform>\n                                    <TransformGroup>\n                                        <ScaleTransform />\n                                        <SkewTransform />\n                                        <RotateTransform Angle=\"-90\" />\n                                        <TranslateTransform />\n                                    </TransformGroup>\n                                </Path.RenderTransform>\n                            </Path>\n                        </Grid>\n                        <ContentPresenter SnapsToDevicePixels=\"True\" HorizontalAlignment=\"Center\" Margin=\"4,4,4,6\" VerticalAlignment=\"Top\" Grid.Row=\"1\" RecognizesAccessKey=\"True\">\n                            <ContentPresenter.LayoutTransform>\n                                <TransformGroup>\n                                    <TransformGroup.Children>\n                                        <TransformCollection>\n                                            <RotateTransform Angle=\"-90\" />\n                                        </TransformCollection>\n                                    </TransformGroup.Children>\n                                </TransformGroup>\n                            </ContentPresenter.LayoutTransform>\n                        </ContentPresenter>\n                        <Border x:Name=\"Focus_Border\" Margin=\"-1,-1,0,-1\" Grid.ColumnSpan=\"2\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"1\" IsHitTestVisible=\"false\" Opacity=\"0\" Panel.ZIndex=\"1\" Grid.RowSpan=\"2\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard x:Name=\"FocusedOn_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOn}\" />\n                            </Trigger.EnterActions>\n                            <Trigger.ExitActions>\n                                <BeginStoryboard x:Name=\"FocusedOff_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOff}\" />\n                            </Trigger.ExitActions>\n                        </Trigger>\n                        <Trigger Property=\"IsChecked\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOff}\" x:Name=\"CheckedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOn}\" x:Name=\"CheckedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"true\" />\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <Style x:Key=\"ExpanderUpHeaderStyle\" TargetType=\"{x:Type ToggleButton}\">\n        <Setter Property=\"Foreground\" Value=\"#FF15428B\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"11\" />\n        <Setter Property=\"FontWeight\" Value=\"Bold\" />\n        <Setter Property=\"Padding\" Value=\"6,0,4,0\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"arrow_over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"border_over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"arrow_over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"border_over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"-1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow2\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"-1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.4000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.4000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow2\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Focus_Border\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"arrow_focus\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Focus_Border\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"arrow_focus\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n\n                    </ControlTemplate.Resources>\n                    <Grid Background=\"Transparent\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"*\" />\n                            <ColumnDefinition Width=\"20\" />\n                        </Grid.ColumnDefinitions>\n                        <Border x:Name=\"border_fill\" Grid.ColumnSpan=\"2\" Background=\"{DynamicResource ExpanderToggleButtonBrush}\"/>\n                        <Border x:Name=\"border_inner\" Margin=\"0,1,0,0\" Grid.ColumnSpan=\"2\" BorderBrush=\"#FFFFFFFF\" BorderThickness=\"1,0,0,1\" />\n                        <Border x:Name=\"border_bottom\" Grid.ColumnSpan=\"2\" BorderBrush=\"{DynamicResource ExpanderToggleButtonBottomBrush}\" BorderThickness=\"0,1,0,0\" />\n                        <Border x:Name=\"border_over\" Margin=\"1\" Grid.ColumnSpan=\"2\" Opacity=\"0\" Background=\"{DynamicResource ExpanderToggleButtonHoverBrush}\"/>\n                        <Rectangle x:Name=\"arrow_over\" Margin=\"0,1,1,1\" Grid.Column=\"1\" Width=\"20\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                        <Rectangle x:Name=\"arrow_focus\" Margin=\"0,1,1,1\" Grid.Column=\"1\" Width=\"20\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                        <Path x:Name=\"arrow2\" Margin=\"0,4,6,0\" Grid.Column=\"1\" Stroke=\"{DynamicResource ExpanderToggleArrow2Stroke}\" StrokeThickness=\"1.5\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Center\" Data=\"M 1,1.5 L 4.5,5 L 8,1.5\" RenderTransformOrigin=\"0.5,0.5\">\n                            <Path.LayoutTransform>\n                                <TransformGroup>\n                                    <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                    <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                    <RotateTransform Angle=\"180\" />\n                                    <TranslateTransform X=\"0\" Y=\"0\" />\n                                </TransformGroup>\n                            </Path.LayoutTransform>\n                            <Path.RenderTransform>\n                                <TransformGroup>\n                                    <ScaleTransform ScaleY=\"-1\" />\n                                    <SkewTransform />\n                                    <RotateTransform />\n                                    <TranslateTransform />\n                                </TransformGroup>\n                            </Path.RenderTransform>\n                        </Path>\n                        <Path x:Name=\"arrow\" Margin=\"0,0,6,4\" Grid.Column=\"1\" Stroke=\"{DynamicResource ExpanderToggleArrowStroke}\" StrokeThickness=\"1.5\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Center\" Data=\"M 1,1.5 L 4.5,5 L 8,1.5\" RenderTransformOrigin=\"0.5,0.5\">\n                            <Path.LayoutTransform>\n                                <TransformGroup>\n                                    <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                    <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                    <RotateTransform Angle=\"180\" />\n                                    <TranslateTransform X=\"0\" Y=\"0\" />\n                                </TransformGroup>\n                            </Path.LayoutTransform>\n                            <Path.RenderTransform>\n                                <TransformGroup>\n                                    <ScaleTransform ScaleY=\"-1\" />\n                                    <SkewTransform />\n                                    <RotateTransform />\n                                    <TranslateTransform />\n                                </TransformGroup>\n                            </Path.RenderTransform>\n                        </Path>\n                        <ContentPresenter SnapsToDevicePixels=\"True\" HorizontalAlignment=\"Center\" Margin=\"6,4,4,4\" VerticalAlignment=\"Top\" Grid.Row=\"1\" RecognizesAccessKey=\"True\" />\n                        <Border x:Name=\"Focus_Border\" Margin=\"-1,0,-1,-1\" Grid.ColumnSpan=\"2\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"1\" IsHitTestVisible=\"false\" Visibility=\"Visible\" Canvas.ZIndex=\"1\" Opacity=\"0\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard x:Name=\"FocusedOn_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOn}\" />\n                            </Trigger.EnterActions>\n                            <Trigger.ExitActions>\n                                <BeginStoryboard x:Name=\"FocusedOff_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOff}\" />\n                            </Trigger.ExitActions>\n                        </Trigger>\n                        <Trigger Property=\"IsChecked\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOff}\" x:Name=\"CheckedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOn}\" x:Name=\"CheckedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"true\" />\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <Style x:Key=\"ExpanderLeftHeaderStyle\" TargetType=\"{x:Type ToggleButton}\">\n        <Setter Property=\"Foreground\" Value=\"#FF15428B\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"11\" />\n        <Setter Property=\"FontWeight\" Value=\"Bold\" />\n        <Setter Property=\"Padding\" Value=\"6,0,4,0\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"arrow_over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"border_over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"arrow_over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"border_over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"-1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.1000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow2\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"-1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.4000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00.4000000\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"arrow2\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Focus_Border\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"arrow_focus\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"Focus_Border\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"arrow_focus\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n\n                    </ControlTemplate.Resources>\n                    <Grid SnapsToDevicePixels=\"False\" Background=\"Transparent\">\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"19\" />\n                            <RowDefinition Height=\"*\" />\n                        </Grid.RowDefinitions>\n                        <Border x:Name=\"border_fill\" Grid.RowSpan=\"2\" Background=\"{DynamicResource ExpanderToggleButtonBrush}\"/>\n                        <Border x:Name=\"border_inner\" BorderBrush=\"#FFFFFFFF\" BorderThickness=\"0,1,1,0\" Grid.RowSpan=\"2\" />\n                        <Border x:Name=\"border_bottom\" BorderBrush=\"{DynamicResource ExpanderToggleButtonBottomBrush}\" BorderThickness=\"0,0,0,1\" Grid.RowSpan=\"2\" />\n                        <Border x:Name=\"border_over\" Opacity=\"0\" Grid.RowSpan=\"2\" Background=\"{DynamicResource ExpanderToggleButtonHoverBrush}\"/>\n                        <Grid>\n                            <Grid.LayoutTransform>\n                                <TransformGroup>\n                                    <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                    <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                    <RotateTransform Angle=\"0\" />\n                                    <TranslateTransform X=\"0\" Y=\"0\" />\n                                </TransformGroup>\n                            </Grid.LayoutTransform>\n                            <Rectangle x:Name=\"arrow_over\" Margin=\"1\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                            <Rectangle x:Name=\"arrow_focus\" Margin=\"1\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                            <Path x:Name=\"arrow2\" Margin=\"3,0,0,0\" Stroke=\"{DynamicResource ExpanderToggleArrow2Stroke}\" StrokeThickness=\"1.5\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Data=\"M 1,1.5 L 4.5,5 L 8,1.5\" RenderTransformOrigin=\"0.5,0.5\">\n                                <Path.RenderTransform>\n                                    <TransformGroup>\n                                        <ScaleTransform />\n                                        <SkewTransform />\n                                        <RotateTransform Angle=\"90\" />\n                                        <TranslateTransform />\n                                    </TransformGroup>\n                                </Path.RenderTransform>\n                            </Path>\n                            <Path x:Name=\"arrow\" Margin=\"7,0,0,0\" Stroke=\"{DynamicResource ExpanderToggleArrowStroke}\" StrokeThickness=\"1.5\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Center\" Data=\"M 1,1.5 L 4.5,5 L 8,1.5\" RenderTransformOrigin=\"0.5,0.5\">\n                                <Path.RenderTransform>\n                                    <TransformGroup>\n                                        <ScaleTransform />\n                                        <SkewTransform />\n                                        <RotateTransform Angle=\"90\" />\n                                        <TranslateTransform />\n                                    </TransformGroup>\n                                </Path.RenderTransform>\n                            </Path>\n                        </Grid>\n                        <ContentPresenter SnapsToDevicePixels=\"True\" HorizontalAlignment=\"Center\" Margin=\"6,4,4,4\" VerticalAlignment=\"Top\" Grid.Row=\"1\" RecognizesAccessKey=\"True\">\n                            <ContentPresenter.LayoutTransform>\n                                <TransformGroup>\n                                    <TransformGroup.Children>\n                                        <TransformCollection>\n                                            <RotateTransform Angle=\"90\" />\n                                        </TransformCollection>\n                                    </TransformGroup.Children>\n                                </TransformGroup>\n                            </ContentPresenter.LayoutTransform>\n                        </ContentPresenter>\n                        <Border x:Name=\"Focus_Border\" Margin=\"0,-1,-1,-1\" Grid.RowSpan=\"2\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"1\" IsHitTestVisible=\"false\" Opacity=\"0\" Panel.ZIndex=\"1\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard x:Name=\"FocusedOn_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOn}\" />\n                            </Trigger.EnterActions>\n                            <Trigger.ExitActions>\n                                <BeginStoryboard x:Name=\"FocusedOff_BeginStoryboard\" Storyboard=\"{StaticResource FocusedOff}\" />\n                            </Trigger.ExitActions>\n                        </Trigger>\n                        <Trigger Property=\"IsChecked\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOff}\" x:Name=\"CheckedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOn}\" x:Name=\"CheckedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"true\" />\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <Style TargetType=\"{x:Type Expander}\">\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}\" />\n        <Setter Property=\"Background\" Value=\"Transparent\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"BorderBrush\" Value=\"Transparent\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"Foreground\" Value=\"#FF15428B\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"11\" />\n        <Setter Property=\"FontWeight\" Value=\"Bold\" />\n        <Setter Property=\"Padding\" Value=\"6,0,4,0\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Expander}\">\n                    <Grid>\n                        <Border x:Name=\"Background\" BorderThickness=\"1\" Padding=\"0\">\n\n                            <DockPanel>\n                                <ToggleButton FontFamily=\"{TemplateBinding FontFamily}\" FontSize=\"{TemplateBinding FontSize}\" FontStretch=\"{TemplateBinding FontStretch}\" FontStyle=\"{TemplateBinding FontStyle}\" FontWeight=\"{TemplateBinding FontWeight}\" Foreground=\"{TemplateBinding Foreground}\" HorizontalContentAlignment=\"{TemplateBinding HorizontalContentAlignment}\" Padding=\"{TemplateBinding Padding}\" VerticalContentAlignment=\"{TemplateBinding VerticalContentAlignment}\" FocusVisualStyle=\"{StaticResource ExpanderHeaderFocusVisual}\" Margin=\"1,1,1,0\" MinHeight=\"0\" MinWidth=\"0\" x:Name=\"HeaderSite\" Style=\"{StaticResource ExpanderDownHeaderStyle}\" Content=\"{TemplateBinding Header}\" ContentTemplate=\"{TemplateBinding HeaderTemplate}\" ContentTemplateSelector=\"{TemplateBinding HeaderTemplateSelector}\" IsChecked=\"{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\" DockPanel.Dock=\"Top\" />\n                                <Border Visibility=\"Collapsed\" x:Name=\"border\" Margin=\"1,1,1,1\" BorderBrush=\"{DynamicResource GlyphBrush}\" BorderThickness=\"1,1,1,1\" CornerRadius=\"1,1,1,1\" Background=\"{DynamicResource ControlBackgroundBrush}\">\n                                    <ContentPresenter Focusable=\"false\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" Margin=\"1,1,1,1\" x:Name=\"ExpandSite\" VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" DockPanel.Dock=\"Bottom\" />\n                                </Border>\n                            </DockPanel>\n                        </Border>\n                        <Border x:Name=\"DisabledVisualElement\" IsHitTestVisible=\"false\" Background=\"{DynamicResource DisabledBackgroundBrush}\" BorderBrush=\"{DynamicResource DisabledBorderBrush}\" BorderThickness=\"1\" Opacity=\"0\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsExpanded\" Value=\"true\">\n                            <Setter Property=\"Visibility\" TargetName=\"border\" Value=\"Visible\" />\n                        </Trigger>\n                        <Trigger Property=\"ExpandDirection\" Value=\"Down\" />\n                        <Trigger Property=\"ExpandDirection\" Value=\"Right\">\n                            <Setter Property=\"DockPanel.Dock\" TargetName=\"ExpandSite\" Value=\"Right\" />\n                            <Setter Property=\"DockPanel.Dock\" TargetName=\"HeaderSite\" Value=\"Left\" />\n                            <Setter Property=\"Style\" TargetName=\"HeaderSite\" Value=\"{StaticResource ExpanderRightHeaderStyle}\" />\n                        </Trigger>\n                        <Trigger Property=\"ExpandDirection\" Value=\"Up\">\n                            <Setter Property=\"DockPanel.Dock\" TargetName=\"ExpandSite\" Value=\"Top\" />\n                            <Setter Property=\"DockPanel.Dock\" TargetName=\"HeaderSite\" Value=\"Bottom\" />\n                            <Setter Property=\"Style\" TargetName=\"HeaderSite\" Value=\"{StaticResource ExpanderUpHeaderStyle}\" />\n                        </Trigger>\n                        <Trigger Property=\"ExpandDirection\" Value=\"Left\">\n                            <Setter Property=\"DockPanel.Dock\" TargetName=\"ExpandSite\" Value=\"Left\" />\n                            <Setter Property=\"DockPanel.Dock\" TargetName=\"HeaderSite\" Value=\"Right\" />\n                            <Setter Property=\"Style\" TargetName=\"HeaderSite\" Value=\"{StaticResource ExpanderLeftHeaderStyle}\" />\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}\" />\n                            <Setter Property=\"Opacity\" TargetName=\"DisabledVisualElement\" Value=\"1\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <ControlTemplate x:Key=\"ComboBoxToggleButton\" TargetType=\"{x:Type ToggleButton}\">\n        <ControlTemplate.Resources>\n            <Storyboard x:Key=\"HoverOn\">\n                <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"rectangleOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0.8\" />\n                <ColorAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Background\" Storyboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\" To=\"#FFFFFFFF\" />\n            </Storyboard>\n            <Storyboard x:Key=\"HoverOff\">\n                <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"rectangleOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                <ColorAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Background\" Storyboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\" To=\"#FFEAF2FB\" />\n            </Storyboard>\n            <Storyboard x:Key=\"PressedOn\">\n                <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"rectanglePress\" Storyboard.TargetProperty=\"Opacity\" To=\"0.8\" />\n                <ColorAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Background\" Storyboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\" To=\"#FFFFFFFF\" />\n            </Storyboard>\n            <Storyboard x:Key=\"PressedOff\">\n                <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"rectanglePress\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                <ColorAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Background\" Storyboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\" To=\"#FFEAF2FB\" />\n            </Storyboard>\n            <Storyboard x:Key=\"CheckedOn\">\n                <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"BackgroundChecked\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                    <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                </DoubleAnimationUsingKeyFrames>\n            </Storyboard>\n            <Storyboard x:Key=\"CheckedOff\">\n                <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"BackgroundChecked\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                    <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                </DoubleAnimationUsingKeyFrames>\n            </Storyboard>\n        </ControlTemplate.Resources>\n        <Grid x:Name=\"grid\">\n            <Rectangle x:Name=\"Background\" Fill=\"#FFEAF2FB\" Stroke=\"#FF9EBBDE\" IsHitTestVisible=\"false\" />\n            <Rectangle x:Name=\"BackgroundChecked\" Margin=\"1\" IsHitTestVisible=\"false\" Opacity=\"0\" >\n                <Rectangle.Fill>\n                    <SolidColorBrush Color=\"{DynamicResource WhiteColor}\"/>\n                </Rectangle.Fill>\n            </Rectangle>\n            <Rectangle x:Name=\"rectangleOver\" Width=\"15\" Stroke=\"#FFE8E8E8\" HorizontalAlignment=\"Right\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n            <Rectangle x:Name=\"rectanglePress\" Width=\"15\" Stroke=\"#FC9E9D9B\" HorizontalAlignment=\"Right\" Opacity=\"0\" Fill=\"{DynamicResource PressedBrush}\"/>\n            <Rectangle x:Name=\"DisabledVisualElement\" Margin=\"1\" Fill=\"{DynamicResource DisabledBackgroundBrush}\" IsHitTestVisible=\"false\" Visibility=\"Collapsed\" />\n            <Path x:Name=\"BtnArrow\" Margin=\"0,0,4,0\" Width=\"6\" Fill=\"{DynamicResource GlyphBrush}\" Stretch=\"Uniform\" HorizontalAlignment=\"Right\" Data=\"F1 M 301.14,-189.041L 311.57,-189.041L 306.355,-182.942L 301.14,-189.041 Z \" />\n        </Grid>\n        <ControlTemplate.Triggers>\n            <Trigger Property=\"IsPressed\" Value=\"True\">\n                <Trigger.ExitActions>\n                    <BeginStoryboard Storyboard=\"{StaticResource PressedOff}\" x:Name=\"PressedOff_BeginStoryboard\" />\n                </Trigger.ExitActions>\n                <Trigger.EnterActions>\n                    <BeginStoryboard Storyboard=\"{StaticResource PressedOn}\" x:Name=\"PressedOn_BeginStoryboard\" />\n                </Trigger.EnterActions>\n            </Trigger>\n            <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                <Trigger.ExitActions>\n                    <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                </Trigger.ExitActions>\n                <Trigger.EnterActions>\n                    <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                </Trigger.EnterActions>\n\n            </Trigger>\n            <Trigger Property=\"IsChecked\" Value=\"true\">\n                <Trigger.ExitActions>\n                    <BeginStoryboard Storyboard=\"{StaticResource CheckedOff}\" x:Name=\"CheckedOff_BeginStoryboard\" />\n                </Trigger.ExitActions>\n                <Trigger.EnterActions>\n                    <BeginStoryboard Storyboard=\"{StaticResource CheckedOn}\" x:Name=\"CheckedOn_BeginStoryboard\" />\n                </Trigger.EnterActions>\n            </Trigger>\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                <Setter Property=\"Visibility\" TargetName=\"DisabledVisualElement\" Value=\"Visible\" />\n            </Trigger>\n        </ControlTemplate.Triggers>\n    </ControlTemplate>\n\n    <ControlTemplate x:Key=\"ComboBoxTextBox\" TargetType=\"{x:Type TextBox}\">\n        <Border x:Name=\"PART_ContentHost\" Focusable=\"False\" Background=\"{TemplateBinding Background}\" />\n    </ControlTemplate>\n\n    <Style TargetType=\"{x:Type ComboBox}\">\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"6,2,25,2\" />\n\n<Setter Property=\"Template\" Value=\"{DynamicResource ComboBoxTemplate}\" />\n    </Style>\n        \n        <ControlTemplate x:Key=\"ComboBoxTemplate\" TargetType=\"{x:Type ComboBox}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid>\n                        <ToggleButton Grid.Column=\"2\" Template=\"{DynamicResource ComboBoxToggleButton}\" x:Name=\"ToggleButton\" Focusable=\"false\" IsChecked=\"{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\" ClickMode=\"Press\" />\n                        <ContentPresenter HorizontalAlignment=\"Left\" Margin=\"3,3,23,3\" x:Name=\"ContentSite\" VerticalAlignment=\"Center\" Content=\"{TemplateBinding SelectionBoxItem}\" ContentTemplate=\"{TemplateBinding SelectionBoxItemTemplate}\" ContentTemplateSelector=\"{TemplateBinding ItemTemplateSelector}\" IsHitTestVisible=\"False\" />\n\n                        <TextBox Visibility=\"Hidden\" Template=\"{DynamicResource ComboBoxTextBox}\" HorizontalAlignment=\"Left\" Margin=\"3,3,23,3\" x:Name=\"PART_EditableTextBox\" Style=\"{x:Null}\" VerticalAlignment=\"Center\" Focusable=\"True\" Background=\"Transparent\" IsReadOnly=\"{TemplateBinding IsReadOnly}\" />\n                        <Rectangle x:Name=\"DisabledVisualElement\" Fill=\"{DynamicResource DisabledBackgroundBrush}\" Stroke=\"{DynamicResource DisabledBorderBrush}\" RadiusX=\"0\" RadiusY=\"0\" IsHitTestVisible=\"false\" Opacity=\"0\" />\n                        <Rectangle x:Name=\"FocusVisualElement\" Margin=\"-1\" Stroke=\"{DynamicResource FocusBrush}\" StrokeThickness=\"1\" IsHitTestVisible=\"false\" Opacity=\"0\" />\n                        <Popup IsOpen=\"{TemplateBinding IsDropDownOpen}\" Placement=\"Bottom\" x:Name=\"Popup\" Focusable=\"False\" AllowsTransparency=\"True\" PopupAnimation=\"Slide\" Margin=\"0,1,0,0\">\n                            <Grid MaxHeight=\"{TemplateBinding MaxDropDownHeight}\" MinWidth=\"{TemplateBinding ActualWidth}\" x:Name=\"DropDown\" SnapsToDevicePixels=\"True\">\n                                <Border x:Name=\"DropDownBorder\" Margin=\"0,-1,0,0\" BorderBrush=\"{DynamicResource ControlBorderBrush}\" BorderThickness=\"1\" CornerRadius=\"0,0,3,3\" Background=\"{DynamicResource ControlBackgroundBrush}\">\n                                    <ScrollViewer Margin=\"4,6,4,6\" SnapsToDevicePixels=\"True\" HorizontalScrollBarVisibility=\"Auto\" VerticalScrollBarVisibility=\"Auto\" CanContentScroll=\"True\">\n\n                                        <StackPanel IsItemsHost=\"True\" KeyboardNavigation.DirectionalNavigation=\"Contained\" />\n\n                                    </ScrollViewer>\n                                </Border>\n                            </Grid>\n                        </Popup>\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"HasItems\" Value=\"false\">\n                            <Setter Property=\"MinHeight\" Value=\"95\" TargetName=\"DropDownBorder\" />\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                            <Setter Property=\"Opacity\" TargetName=\"DisabledVisualElement\" Value=\"1\" />\n                        </Trigger>\n                        <Trigger Property=\"IsGrouping\" Value=\"true\">\n                            <Setter Property=\"ScrollViewer.CanContentScroll\" Value=\"false\" />\n                        </Trigger>\n                        <Trigger Property=\"AllowsTransparency\" SourceName=\"Popup\" Value=\"true\">\n                            <Setter Property=\"CornerRadius\" Value=\"4\" TargetName=\"DropDownBorder\" />\n                            <Setter Property=\"Margin\" Value=\"0,2,0,0\" TargetName=\"DropDownBorder\" />\n                        </Trigger>\n                        <Trigger Property=\"IsEditable\" Value=\"true\">\n                            <Setter Property=\"IsTabStop\" Value=\"false\" />\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"PART_EditableTextBox\" />\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"ContentSite\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n\n    <Style d:IsControlPart=\"True\" TargetType=\"{x:Type ComboBoxItem}\">\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"Padding\" Value=\"3\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ComboBoxItem}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HighlightOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundGradientOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0.73\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HighlightOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundGradientOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"SelectedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundGradientSelected\" Storyboard.TargetProperty=\"Opacity\" To=\"0.84\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"SelectedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundGradientSelected\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid SnapsToDevicePixels=\"true\">\n                        <Rectangle x:Name=\"BackgroundGradientOver\" RadiusX=\"1\" RadiusY=\"1\" Stroke=\"{DynamicResource MouseOverBorderBrush}\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                        <Rectangle x:Name=\"BackgroundGradientSelected\" StrokeThickness=\"1\" RadiusX=\"1\" RadiusY=\"1\" Opacity=\"0\" Fill=\"{DynamicResource PressedBrush}\" Stroke=\"{DynamicResource PressedBorderBrush}\"/>\n                        <ContentPresenter x:Name=\"contentPresenter\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" Margin=\"{TemplateBinding Padding}\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"Selector.IsSelected\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource SelectedOff}\" x:Name=\"SelectedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource SelectedOn}\" x:Name=\"SelectedOn_BeginStoryboard1\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HighlightOff}\" x:Name=\"HighlightOff_BeginStoryboard1\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HighlightOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style TargetType=\"{x:Type ProgressBar}\">\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ProgressBar}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"IndeterminateOn\" RepeatBehavior=\"Forever\">\n                            <DoubleAnimationUsingKeyFrames Storyboard.TargetName=\"IndeterminateGradientFill\" Storyboard.TargetProperty=\"(Shape.Fill).(Brush.Transform).(TransformGroup.Children)[0].X\" RepeatBehavior=\"Forever\">\n                                <SplineDoubleKeyFrame KeyTime=\"0\" Value=\"0\" />\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:.5\" Value=\"20\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"IndeterminateRoot\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid>\n                        <Border x:Name=\"PART_Track\" BorderThickness=\"1\" CornerRadius=\"3\" Opacity=\"0.825\">\n                            <Border.Background>\n                                <LinearGradientBrush EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n                                    <GradientStop Color=\"#FFFFFFFF\" />\n                                    <GradientStop Color=\"#FFD8D8D8\" Offset=\"0.327\" />\n                                    <GradientStop Color=\"#FFDADADA\" Offset=\"0.488\" />\n                                    <GradientStop Color=\"#FFBEBEBE\" Offset=\"0.539\" />\n                                    <GradientStop Color=\"#FFD6D6D6\" Offset=\"0.77\" />\n                                    <GradientStop Color=\"#FFFFFFFF\" Offset=\"1\" />\n                                </LinearGradientBrush>\n                            </Border.Background>\n                            <Border.BorderBrush>\n                                <LinearGradientBrush EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n                                    <GradientStop Color=\"#FFBBBBBB\" Offset=\"0\" />\n                                    <GradientStop Color=\"#FF7E7E7E\" Offset=\"1\" />\n                                </LinearGradientBrush>\n                            </Border.BorderBrush>\n                        </Border>\n\n                        <Rectangle x:Name=\"PART_Indicator\" Margin=\"1\" RadiusX=\"1.5\" RadiusY=\"1.5\" HorizontalAlignment=\"Left\" Opacity=\"0.83\" Fill=\"{DynamicResource ProgressBarIndicatorBrush}\"/>\n                        <Grid x:Name=\"IndeterminateRoot\" Visibility=\"Collapsed\">\n                            <Rectangle x:Name=\"IndeterminateSolidFill\" Margin=\"1\" Fill=\"#FF6EA4FD\" RadiusX=\"2\" RadiusY=\"2\" Width=\"Auto\" />\n                            <Rectangle x:Name=\"ProgressBarRootGradient\" Margin=\"1\" Panel.ZIndex=\"1\" RadiusX=\"1.5\" RadiusY=\"1.5\">\n                                <Rectangle.Fill>\n                                    <LinearGradientBrush EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n                                        <GradientStop Color=\"#F6BCD5FF\" Offset=\"0.046\" />\n                                        <GradientStop Color=\"#96D4E4FF\" Offset=\"0.18\" />\n                                        <GradientStop Color=\"#4FFFFFFF\" Offset=\"0.512\" />\n                                        <GradientStop Color=\"#00D6D6D6\" Offset=\"0.521\" />\n                                        <GradientStop Color=\"#BABCD5FF\" Offset=\"1\" />\n                                    </LinearGradientBrush>\n                                </Rectangle.Fill>\n                            </Rectangle>\n                            <Rectangle x:Name=\"IndeterminateGradientFill\" Margin=\"1\" StrokeThickness=\"1\" RadiusX=\"2\" RadiusY=\"2\" Opacity=\"0.7\">\n                                <Rectangle.Fill>\n                                    <LinearGradientBrush EndPoint=\"0,1\" StartPoint=\"20,1\" MappingMode=\"Absolute\" SpreadMethod=\"Repeat\">\n                                        <LinearGradientBrush.Transform>\n                                            <TransformGroup>\n                                                <TranslateTransform X=\"0\" />\n                                                <SkewTransform AngleX=\"-10\" />\n                                            </TransformGroup>\n                                        </LinearGradientBrush.Transform>\n                                        <GradientStop Color=\"#FFBCD5FF\" Offset=\"0.088\" />\n                                        <GradientStop Color=\"#006EA4FD\" Offset=\"0.475\" />\n                                        <GradientStop Color=\"#FFBCD5FF\" Offset=\"0.899\" />\n                                    </LinearGradientBrush>\n                                </Rectangle.Fill>\n                            </Rectangle>\n                        </Grid>\n                        <Border x:Name=\"DisabledVisualElement\" IsHitTestVisible=\"false\" Background=\"#A5FFFFFF\" BorderBrush=\"#66FFFFFF\" BorderThickness=\"1\" Opacity=\"0\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\n                            <Setter Property=\"Opacity\" TargetName=\"DisabledVisualElement\" Value=\"1\" />\n                        </Trigger>\n                        <Trigger Property=\"IsIndeterminate\" Value=\"True\">\n                        \t<Trigger.ExitActions>\n                        \t\t<StopStoryboard BeginStoryboardName=\"IndeterminateOn_BeginStoryboard\"/>\n                        \t</Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard x:Name=\"IndeterminateOn_BeginStoryboard\" Storyboard=\"{StaticResource IndeterminateOn}\" />\n                            </Trigger.EnterActions>\n                            <Setter Property=\"Visibility\" TargetName=\"PART_Track\" Value=\"Collapsed\" />\n                            <Setter Property=\"Visibility\" TargetName=\"PART_Indicator\" Value=\"Collapsed\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type TextBox}\">\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\n        <Setter Property=\"AllowDrop\" Value=\"true\" />\n        <Setter Property=\"Background\" >\n            <Setter.Value>\n                <SolidColorBrush Color=\"{DynamicResource WhiteColor}\"/>\n            </Setter.Value>\n        </Setter>\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"4\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"BorderBrush\" Value=\"{StaticResource TextControlBorderBrush}\" />\n<Setter Property=\"Template\" Value=\"{DynamicResource TextBoxTemplate}\" />\n    </Style>\n        \n        <ControlTemplate x:Key=\"TextBoxTemplate\" TargetType=\"{x:Type TextBox}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Over_Border\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Over_Border\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"DisabledOn\">\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"DisabledVisualElement\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n\t\t\t\t\t\t<Storyboard x:Key=\"DisabledOff\">\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"DisabledVisualElement\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Collapsed}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid>\n                        <Border x:Name=\"BorderBase\" Background=\"{TemplateBinding Background}\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" />\n                        <Border x:Name=\"Over\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" Opacity=\"0\" />\n                        <Border x:Name=\"Over_Border\" Margin=\"-1\" BorderBrush=\"{DynamicResource MouseOverHighlightBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"3.75\" IsHitTestVisible=\"False\" Opacity=\"0\" />\n                        <ScrollViewer Margin=\"0\" x:Name=\"PART_ContentHost\" Foreground=\"{DynamicResource OutsideFontColor}\" />\n                        <Border x:Name=\"DisabledVisualElement\" Background=\"#A5FFFFFF\" BorderBrush=\"#59C0C0C0\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\" />\n                        <Border x:Name=\"ReadOnlyVisualElement\" Background=\"#66FFFFFF\" CornerRadius=\"2.75\" Visibility=\"Collapsed\" />\n                        <Border x:Name=\"FocusVisualElement\" BorderBrush=\"#FFB1703C\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" IsHitTestVisible=\"False\" Opacity=\"0\" />\n\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" x:Name=\"FocusedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <MultiTrigger>\n                            <MultiTrigger.Conditions>\n                                <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                                <Condition Property=\"IsFocused\" Value=\"False\" />\n                            </MultiTrigger.Conditions>\n                            <MultiTrigger.ExitActions>\n                                <BeginStoryboard x:Name=\"HoverOff_BeginStoryboard\" Storyboard=\"{StaticResource HoverOff}\" />\n                            </MultiTrigger.ExitActions>\n                            <MultiTrigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </MultiTrigger.EnterActions>\n                        </MultiTrigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource DisabledOn}\" x:Name=\"DisabledOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                        </Trigger>\n\t\t\t\t\t\t<Trigger Property=\"IsEnabled\" Value=\"True\">\n\t\t\t\t\t\t<Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource DisabledOff}\"  />\n                            </Trigger.EnterActions>\n\t\t\t\t\t\t\t<Setter Property=\"Foreground\" Value=\"#FF000000\" />\n\t\t\t\t\t\t</Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n\n    <Style TargetType=\"{x:Type PasswordBox}\">\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\n        <Setter Property=\"AllowDrop\" Value=\"true\" />\n        <Setter Property=\"Background\" >\n            <Setter.Value>\n                <SolidColorBrush Color=\"{DynamicResource WhiteColor}\"/>\n            </Setter.Value>\n        </Setter>\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"4\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"BorderBrush\" Value=\"{StaticResource TextControlBorderBrush}\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type PasswordBox}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Over_Border\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Over_Border\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"DisabledOn\">\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"DisabledVisualElement\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid>\n                        <Border x:Name=\"BorderBase\" Background=\"{TemplateBinding Background}\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" />\n                        <Border x:Name=\"Over\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" Opacity=\"0\" />\n                        <Border x:Name=\"Over_Border\" Margin=\"-1\" BorderBrush=\"{DynamicResource MouseOverHighlightBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"3.75\" IsHitTestVisible=\"False\" Opacity=\"0\" />\n                        <ScrollViewer Margin=\"0\" x:Name=\"PART_ContentHost\" Foreground=\"{DynamicResource OutsideFontColor}\" />\n                        <Border x:Name=\"DisabledVisualElement\" Background=\"#A5FFFFFF\" BorderBrush=\"#59C0C0C0\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\" />\n                        <Border x:Name=\"ReadOnlyVisualElement\" Background=\"#66FFFFFF\" CornerRadius=\"2.75\" Visibility=\"Collapsed\" />\n                        <Border x:Name=\"FocusVisualElement\" BorderBrush=\"#FFB1703C\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" IsHitTestVisible=\"False\" Opacity=\"0\" />\n\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" x:Name=\"FocusedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <MultiTrigger>\n                            <MultiTrigger.Conditions>\n                                <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                                <Condition Property=\"IsFocused\" Value=\"False\" />\n                            </MultiTrigger.Conditions>\n                            <MultiTrigger.ExitActions>\n                                <BeginStoryboard x:Name=\"HoverOff_BeginStoryboard\" Storyboard=\"{StaticResource HoverOff}\" />\n                            </MultiTrigger.ExitActions>\n                            <MultiTrigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </MultiTrigger.EnterActions>\n                        </MultiTrigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource DisabledOn}\" x:Name=\"DisabledOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type RichTextBox}\">\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\n        <Setter Property=\"AllowDrop\" Value=\"true\" />\n        <Setter Property=\"Background\" >\n            <Setter.Value>\n                <SolidColorBrush Color=\"{DynamicResource WhiteColor}\"/>\n            </Setter.Value>\n        </Setter>\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"4\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"BorderBrush\" Value=\"{StaticResource TextControlBorderBrush}\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type RichTextBox}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Over_Border\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Over_Border\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"DisabledOn\">\n                            <ObjectAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"DisabledVisualElement\" Storyboard.TargetProperty=\"(UIElement.Visibility)\">\n                                <DiscreteObjectKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"{x:Static Visibility.Visible}\" />\n                            </ObjectAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid>\n                        <Border x:Name=\"BorderBase\" Background=\"{TemplateBinding Background}\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" />\n                        <Border x:Name=\"Over\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" Opacity=\"0\" />\n                        <Border x:Name=\"Over_Border\" Margin=\"-1\" BorderBrush=\"{DynamicResource MouseOverHighlightBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"3.75\" IsHitTestVisible=\"False\" Opacity=\"0\" />\n                        <ScrollViewer Margin=\"0\" x:Name=\"PART_ContentHost\" Foreground=\"{DynamicResource OutsideFontColor}\" />\n                        <Border x:Name=\"DisabledVisualElement\" Background=\"#A5FFFFFF\" BorderBrush=\"#59C0C0C0\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" IsHitTestVisible=\"False\" Visibility=\"Collapsed\" />\n                        <Border x:Name=\"ReadOnlyVisualElement\" Background=\"#66FFFFFF\" CornerRadius=\"2.75\" Visibility=\"Collapsed\" />\n                        <Border x:Name=\"FocusVisualElement\" BorderBrush=\"#FFB1703C\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2.75\" IsHitTestVisible=\"False\" Opacity=\"0\" />\n\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" x:Name=\"FocusedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <MultiTrigger>\n                            <MultiTrigger.Conditions>\n                                <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                                <Condition Property=\"IsFocused\" Value=\"False\" />\n                            </MultiTrigger.Conditions>\n                            <MultiTrigger.ExitActions>\n                                <BeginStoryboard x:Name=\"HoverOff_BeginStoryboard\" Storyboard=\"{StaticResource HoverOff}\" />\n                            </MultiTrigger.ExitActions>\n                            <MultiTrigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </MultiTrigger.EnterActions>\n                        </MultiTrigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource DisabledOn}\" x:Name=\"DisabledOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type Label}\">\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Top\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Label}\">\n                    <Grid>\n                        <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" RecognizesAccessKey=\"True\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\" />\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type Menu}\">\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"True\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Menu}\">\n                    <Grid>\n                        <Border Margin=\"1\" x:Name=\"Border\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" />\n                        <StackPanel IsItemsHost=\"True\" ClipToBounds=\"True\" Orientation=\"Horizontal\" Background=\"{DynamicResource TabControlHeaderBrush}\" />\n                        <Border x:Name=\"DisabledVisualElement\" IsHitTestVisible=\"false\" Background=\"#A5FFFFFF\" BorderBrush=\"#66FFFFFF\" BorderThickness=\"1\" Opacity=\"0\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\n                            <Setter Property=\"Opacity\" TargetName=\"DisabledVisualElement\" Value=\"1\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <DropShadowBitmapEffect x:Key=\"PopupDropShadow\" ShadowDepth=\"1.5\" Softness=\"0.15\" />\n\n    <Style TargetType=\"{x:Type MenuItem}\">\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"{Binding Path=HorizontalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"{Binding Path=VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}\" />\n        <Setter Property=\"Background\" Value=\"Transparent\" />\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.MenuTextBrushKey}}\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type MenuItem}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HighlightOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"BackgroundGradientOver\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"HighlightOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"BackgroundGradientOver\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Border x:Name=\"Border\" Background=\"{TemplateBinding Background}\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\">\n                        <Grid>\n\n                            <Grid.ColumnDefinitions>\n                                <ColumnDefinition MinWidth=\"17\" Width=\"Auto\" SharedSizeGroup=\"MenuItemIconColumnGroup\" />\n                                <ColumnDefinition Width=\"*\" />\n                                <ColumnDefinition Width=\"Auto\" SharedSizeGroup=\"MenuItemIGTColumnGroup\" />\n                                <ColumnDefinition Width=\"14\" />\n                            </Grid.ColumnDefinitions>\n\n                            <ContentPresenter Margin=\"4,0,6,0\" x:Name=\"Icon\" VerticalAlignment=\"Center\" ContentSource=\"Icon\" />\n\n                            <Grid Visibility=\"Hidden\" Margin=\"4,0,6,0\" x:Name=\"GlyphPanel\" VerticalAlignment=\"Center\">\n                                <Path x:Name=\"GlyphPanelpath\" VerticalAlignment=\"Center\" Fill=\"{TemplateBinding Foreground}\" Data=\"M0,2 L0,4.8 L2.5,7.4 L7.1,2.8 L7.1,0 L2.5,4.6 z\" FlowDirection=\"LeftToRight\" />\n                            </Grid>\n                            <Rectangle Grid.Column=\"0\" Grid.ColumnSpan=\"4\" x:Name=\"BackgroundGradientOver\" Stroke=\"#FFDBCE99\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n\n                            <ContentPresenter Grid.Column=\"1\" Margin=\"{TemplateBinding Padding}\" x:Name=\"HeaderHost\" RecognizesAccessKey=\"True\" ContentSource=\"Header\" />\n\n                            <Grid Grid.Column=\"3\" Margin=\"4,0,6,0\" x:Name=\"ArrowPanel\" VerticalAlignment=\"Center\">\n                                <Path x:Name=\"ArrowPanelPath\" VerticalAlignment=\"Center\" Fill=\"{TemplateBinding Foreground}\" Data=\"M0,0 L0,8 L4,4 z\" />\n                            </Grid>\n\n                            <Popup IsOpen=\"{Binding Path=IsSubmenuOpen, RelativeSource={RelativeSource TemplatedParent}}\" Placement=\"Right\" x:Name=\"SubMenuPopup\" Focusable=\"false\" AllowsTransparency=\"true\" PopupAnimation=\"{DynamicResource {x:Static SystemParameters.MenuPopupAnimationKey}}\" VerticalOffset=\"-3\">\n                                <Grid x:Name=\"SubMenu\">\n                                    <Border x:Name=\"SubMenuBorder\" BorderBrush=\"{DynamicResource ControlBorderBrush}\" BorderThickness=\"1\" >\n                                        <Border.Background>\n                                            <SolidColorBrush Color=\"{DynamicResource WhiteColor}\"/>\n                                        </Border.Background>\n                                    </Border>\n\n                                    <StackPanel IsItemsHost=\"True\" KeyboardNavigation.DirectionalNavigation=\"Cycle\" />\n                                </Grid>\n                            </Popup>\n\n                        </Grid>\n                    </Border>\n\n                    <ControlTemplate.Triggers>\n\n                        <Trigger Property=\"Role\" Value=\"TopLevelHeader\">\n                            <Setter Property=\"Margin\" Value=\"0,1,0,1\" />\n                            <Setter Property=\"Padding\" Value=\"6,3,6,3\" />\n                            <Setter Property=\"Grid.IsSharedSizeScope\" Value=\"true\" />\n                            <Setter Property=\"Placement\" Value=\"Bottom\" TargetName=\"SubMenuPopup\" />\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"ArrowPanel\" />\n                        </Trigger>\n\n                        <Trigger Property=\"Role\" Value=\"TopLevelItem\">\n                            <Setter Property=\"Margin\" Value=\"0,1,0,1\" />\n                            <Setter Property=\"Padding\" Value=\"6,3,6,3\" />\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"ArrowPanel\" />\n                        </Trigger>\n\n                        <Trigger Property=\"Role\" Value=\"SubmenuHeader\">\n                            <Setter Property=\"DockPanel.Dock\" Value=\"Top\" />\n                            <Setter Property=\"Padding\" Value=\"0,2,0,2\" />\n                            <Setter Property=\"Grid.IsSharedSizeScope\" Value=\"true\" />\n                        </Trigger>\n\n                        <Trigger Property=\"Role\" Value=\"SubmenuItem\">\n                            <Setter Property=\"DockPanel.Dock\" Value=\"Top\" />\n                            <Setter Property=\"Padding\" Value=\"0,2,0,2\" />\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"ArrowPanel\" />\n                        </Trigger>\n                        <Trigger Property=\"IsSuspendingPopupAnimation\" Value=\"true\">\n                            <Setter Property=\"PopupAnimation\" Value=\"None\" TargetName=\"SubMenuPopup\" />\n                        </Trigger>\n\n                        <Trigger Property=\"Icon\" Value=\"{x:Null}\">\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"Icon\" />\n                        </Trigger>\n\n                        <Trigger Property=\"IsChecked\" Value=\"true\">\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"GlyphPanel\" />\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"Icon\" />\n                        </Trigger>\n\n                        <Trigger Property=\"AllowsTransparency\" SourceName=\"SubMenuPopup\" Value=\"true\">\n                            <Setter Property=\"Margin\" Value=\"0,0,3,3\" TargetName=\"SubMenu\" />\n                            <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" TargetName=\"SubMenu\" />\n                            <Setter Property=\"BitmapEffect\" Value=\"{DynamicResource PopupDropShadow}\" TargetName=\"SubMenuBorder\" />\n                        </Trigger>\n\n                        <Trigger Property=\"IsHighlighted\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HighlightOff}\" x:Name=\"HighlightOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HighlightOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type Separator}\">\n        <Setter Property=\"Height\" Value=\"1\" />\n        <Setter Property=\"Margin\" Value=\"0,2,0,2\" />\n        <Setter Property=\"Focusable\" Value=\"false\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Separator}\">\n                    <Border BorderBrush=\"#FFB1703C\" BorderThickness=\"1\" />\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style TargetType=\"{x:Type TabControl}\">\n        <Setter Property=\"Background\" Value=\"#FFFFFFFF\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"5\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type TabControl}\">\n                    <Grid ClipToBounds=\"true\" SnapsToDevicePixels=\"true\" KeyboardNavigation.TabNavigation=\"Local\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition x:Name=\"ColumnDefinition0\" />\n                            <ColumnDefinition x:Name=\"ColumnDefinition1\" Width=\"0\" />\n                        </Grid.ColumnDefinitions>\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"Auto\" x:Name=\"RowDefinition0\" />\n                            <RowDefinition Height=\"*\" x:Name=\"RowDefinition1\" />\n                        </Grid.RowDefinitions>\n                        <Border Background=\"{DynamicResource TabControlHeaderBrush}\" CornerRadius=\"2,2,0,0\" x:Name=\"border\" Margin=\"0,0,0,-2\" Panel.ZIndex=\"100\">\n                            <TabPanel x:Name=\"HeaderPanel\" IsItemsHost=\"true\" Panel.ZIndex=\"1\" KeyboardNavigation.TabIndex=\"1\" RenderTransformOrigin=\"0.5,0.5\" Width=\"Auto\" Height=\"Auto\" Margin=\"4,0,0,0\">\n                                <TabPanel.LayoutTransform>\n                                    <TransformGroup>\n                                        <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                        <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                        <RotateTransform Angle=\"0\" />\n                                        <TranslateTransform X=\"0\" Y=\"0\" />\n                                    </TransformGroup>\n                                </TabPanel.LayoutTransform>\n                                <TabPanel.RenderTransform>\n                                    <TransformGroup>\n                                        <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                        <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                        <RotateTransform />\n                                        <TranslateTransform X=\"0\" Y=\"0\" />\n                                    </TransformGroup>\n                                </TabPanel.RenderTransform>\n                            </TabPanel>\n                        </Border>\n                        <Border Grid.Row=\"1\" x:Name=\"ContentPanel\" Background=\"{DynamicResource TabControlContentBrush}\" BorderBrush=\"{DynamicResource TabControlContentBorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"3,3,1,1\">\n                            <ContentPresenter Margin=\"4\" x:Name=\"PART_SelectedContentHost\" ContentSource=\"SelectedContent\" />\n                        </Border>\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Bottom\">\n                            <Setter Property=\"Grid.Row\" TargetName=\"ContentPanel\" Value=\"0\" />\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition0\" Value=\"*\" />\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition1\" Value=\"Auto\" />\n                            <Setter Property=\"Grid.Row\" TargetName=\"border\" Value=\"1\" />\n                            <Setter Property=\"CornerRadius\" TargetName=\"ContentPanel\" Value=\"2,2,0,0\" />\n                            <Setter Property=\"CornerRadius\" TargetName=\"border\" Value=\"0,0,2,2\" />\n                            <Setter Property=\"Margin\" TargetName=\"HeaderPanel\" Value=\"4,-2.5,0,0\" />\n                            <Setter Property=\"Margin\" TargetName=\"border\" Value=\"0,0,0,0\" />\n                        </Trigger>\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Left\">\n\n                            <Setter Property=\"Grid.Row\" TargetName=\"HeaderPanel\" Value=\"0\" />\n                            <Setter Property=\"Grid.Row\" TargetName=\"ContentPanel\" Value=\"0\" />\n                            <Setter Property=\"Grid.Column\" TargetName=\"ContentPanel\" Value=\"1\" />\n                            <Setter Property=\"Width\" TargetName=\"ColumnDefinition0\" Value=\"Auto\" />\n                            <Setter Property=\"Width\" TargetName=\"ColumnDefinition1\" Value=\"*\" />\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition0\" Value=\"*\" />\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition1\" Value=\"0\" />\n                            <Setter Property=\"Grid.Column\" TargetName=\"border\" Value=\"0\" />\n                            <Setter Property=\"Margin\" TargetName=\"border\" Value=\"0,0,0,0\" />\n                            <Setter Property=\"Margin\" TargetName=\"ContentPanel\" Value=\"0,0,0,0\" />\n                            <Setter Property=\"CornerRadius\" TargetName=\"border\" Value=\"0,2,2,0\" />\n                            <Setter Property=\"CornerRadius\" TargetName=\"ContentPanel\" Value=\"0,2,2,0\" />\n                            <Setter Property=\"Margin\" TargetName=\"HeaderPanel\" Value=\"4,0,-2.5,0\" />\n\n                        </Trigger>\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Right\">\n                            <Setter Property=\"Grid.Row\" TargetName=\"HeaderPanel\" Value=\"0\" />\n                            <Setter Property=\"Grid.Row\" TargetName=\"ContentPanel\" Value=\"0\" />\n                            <Setter Property=\"Grid.Column\" TargetName=\"ContentPanel\" Value=\"0\" />\n                            <Setter Property=\"Width\" TargetName=\"ColumnDefinition0\" Value=\"*\" />\n                            <Setter Property=\"Width\" TargetName=\"ColumnDefinition1\" Value=\"Auto\" />\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition0\" Value=\"*\" />\n                            <Setter Property=\"Height\" TargetName=\"RowDefinition1\" Value=\"0\" />\n                            <Setter Property=\"Grid.Column\" TargetName=\"border\" Value=\"1\" />\n                            <Setter Property=\"CornerRadius\" TargetName=\"ContentPanel\" Value=\"2,0,0,2\" />\n                            <Setter Property=\"CornerRadius\" TargetName=\"border\" Value=\"0,2,2,0\" />\n                            <Setter Property=\"Margin\" TargetName=\"HeaderPanel\" Value=\"-3,0,0,0\" />\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style d:IsControlPart=\"True\" TargetType=\"{x:Type TabItem}\">\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"Padding\" Value=\"10,6,10,6\" />\n        <Setter Property=\"MinWidth\" Value=\"5\" />\n        <Setter Property=\"MinHeight\" Value=\"5\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type TabItem}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"SelectedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"SelectedState\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"UnSelectedState\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"SelectedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"UnSelectedState\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"SelectedState\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"TopUnselectedOver\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"TopUnselectedBorderOver\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"TopUnselectedOver\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"TopUnselectedBorderOver\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualTop\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\"/>\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualTop\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\"/>\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid x:Name=\"grid\" Margin=\"2,1,2,0\">\n                        <Grid.LayoutTransform>\n                            <TransformGroup>\n                                <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                <RotateTransform Angle=\"0\" />\n                                <TranslateTransform X=\"0\" Y=\"0\" />\n                            </TransformGroup>\n                        </Grid.LayoutTransform>\n                        <Grid>\n\n                            <Grid Margin=\"1,0,1,0\" x:Name=\"UnSelectedState\">\n                                <Border x:Name=\"TopUnselectedOver\" BorderBrush=\"{DynamicResource TabItemHoverBorderBrush}\" BorderThickness=\"1,1,1,0\" CornerRadius=\"2.21,2.21,.5,.5\" Opacity=\"0\" Background=\"{DynamicResource TabItemHoverBrush}\"/>\n                                <Border x:Name=\"TopUnselectedBorderOver\" Margin=\"-1,-1,-1,0.5\" BorderBrush=\"{DynamicResource TabItemHoverHighlightBrush}\" BorderThickness=\"1,1,1,0\" CornerRadius=\"3.5,3.5,0,0\" Opacity=\"0\" />\n                            </Grid>\n                            <Grid Margin=\"1,0,1,-1\" x:Name=\"SelectedState\" Opacity=\"0\">\n                                <Border x:Name=\"BackgroundTop\" BorderBrush=\"{DynamicResource TabItemSelectedBorderBrush}\" BorderThickness=\"2,0,2,0\" CornerRadius=\"3,3,0,0\" Background=\"{DynamicResource TabItemSelectedBrush}\"/>\n                                <Border x:Name=\"BorderTop\" BorderThickness=\"2,0,2,0\" CornerRadius=\"3,3,0,0\" BorderBrush=\"{DynamicResource TabItemBorderTopBrush}\"/>\n                                <Border x:Name=\"HighlightTop\" Margin=\"2,0,2,0\" BorderThickness=\"1,3,1,0\" CornerRadius=\"1.25,1.25,0,0\" BorderBrush=\"{DynamicResource TabItemHighlightTopBrush}\"/>\n                                <Border x:Name=\"BorderTop2\" Margin=\"-1,0,-1,0\" BorderBrush=\"{DynamicResource TabItemBorderTop2Brush}\" BorderThickness=\"1,1,1,0\" CornerRadius=\"3,3,0,0\" IsHitTestVisible=\"false\" />\n                                <Border x:Name=\"FocusVisualTop\" Margin=\"-1,0,-1,0\" BorderThickness=\"3,2,3,0\" CornerRadius=\"3,3,0,0\" Opacity=\"0\" BorderBrush=\"{DynamicResource TabItemFocusBrush}\">\n                                </Border>\n                            </Grid>\n                            <Border x:Name=\"DisabledVisualTopSelected\" Margin=\"1,0,1,0\" Background=\"{DynamicResource DisabledBackgroundBrush}\" CornerRadius=\"3,3,0,0\" IsHitTestVisible=\"false\" Visibility=\"Collapsed\" />\n                            <ContentPresenter HorizontalAlignment=\"Center\" Margin=\"{TemplateBinding Padding}\" x:Name=\"ContentSite\" VerticalAlignment=\"Center\" RecognizesAccessKey=\"True\" ContentSource=\"Header\" />\n\n                        </Grid>\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" x:Name=\"FocusedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Left\">\n                            <Setter Property=\"LayoutTransform\" TargetName=\"grid\">\n                                <Setter.Value>\n                                    <TransformGroup>\n                                        <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                        <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                        <RotateTransform Angle=\"-90\" />\n                                        <TranslateTransform X=\"0\" Y=\"0\" />\n                                    </TransformGroup>\n                                </Setter.Value>\n                            </Setter>\n                        </Trigger>\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Right\">\n                            <Setter Property=\"LayoutTransform\" TargetName=\"grid\">\n                                <Setter.Value>\n                                    <TransformGroup>\n                                        <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                        <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                        <RotateTransform Angle=\"90\" />\n                                        <TranslateTransform X=\"0\" Y=\"0\" />\n                                    </TransformGroup>\n                                </Setter.Value>\n                            </Setter>\n                        </Trigger>\n                        <Trigger Property=\"TabStripPlacement\" Value=\"Bottom\">\n                            <Setter Property=\"LayoutTransform\" TargetName=\"ContentSite\">\n                                <Setter.Value>\n                                    <TransformGroup>\n                                        <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                        <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                        <RotateTransform Angle=\"180\" />\n                                        <TranslateTransform X=\"0\" Y=\"0\" />\n                                    </TransformGroup>\n                                </Setter.Value>\n                            </Setter>\n                            <Setter Property=\"LayoutTransform\" TargetName=\"grid\">\n                                <Setter.Value>\n                                    <TransformGroup>\n                                        <ScaleTransform ScaleX=\"1\" ScaleY=\"1\" />\n                                        <SkewTransform AngleX=\"0\" AngleY=\"0\" />\n                                        <RotateTransform Angle=\"180\" />\n                                        <TranslateTransform X=\"0\" Y=\"0\" />\n                                    </TransformGroup>\n                                </Setter.Value>\n                            </Setter>\n                        </Trigger>\n                        <MultiTrigger>\n                            <MultiTrigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </MultiTrigger.ExitActions>\n                            <MultiTrigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" x:Name=\"HoverOn_BeginStoryboard\" />\n                            </MultiTrigger.EnterActions>\n                            <MultiTrigger.Conditions>\n                                <Condition Property=\"IsMouseOver\" Value=\"True\" />\n                                <Condition Property=\"Selector.IsSelected\" Value=\"False\" />\n                            </MultiTrigger.Conditions>\n                        </MultiTrigger>\n                        <Trigger Property=\"IsSelected\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource SelectedOff}\" x:Name=\"SelectedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource SelectedOn}\" />\n                            </Trigger.EnterActions>\n                            <Setter Property=\"Panel.ZIndex\" Value=\"100\" />\n                        </Trigger>\n                        <MultiTrigger>\n                            <MultiTrigger.Conditions>\n                                <Condition Property=\"IsMouseOver\" Value=\"True\" SourceName=\"grid\" />\n                                <Condition Property=\"Selector.IsSelected\" Value=\"True\" />\n                            </MultiTrigger.Conditions>\n                        </MultiTrigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"False\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n        <Setter Property=\"Foreground\">\n            <Setter.Value>\n                <SolidColorBrush Color=\"{DynamicResource WhiteColor}\" />\n            </Setter.Value>\n        </Setter>\n        <Style.Triggers>\n            <Trigger Property=\"Selector.IsSelected\" Value=\"True\">\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource OutsideFontColor}\" />\n            </Trigger>\n        </Style.Triggers>\n    </Style>\n\n\n    <Style x:Key=\"NuclearSliderThumb\" d:IsControlPart=\"True\" TargetType=\"{x:Type Thumb}\">\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"Height\" Value=\"21\" />\n        <Setter Property=\"Width\" Value=\"15\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Thumb}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Over\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Over\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"Press\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"Press\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid>\n                        <Path x:Name=\"Base\" Margin=\"1,1.312,1,0.375\" Fill=\"{DynamicResource SliderThumbBrush}\" Stretch=\"Fill\" Stroke=\"{DynamicResource SliderThumbBorderBrush}\" StrokeThickness=\"1\" StrokeLineJoin=\"Round\" Data=\"M-9.958333,0.78716499 L-3.204694,0.78717428 L-3.2052999,1.4266928 L-6.6465902,1.7712332 L-9.9818907,1.433604 z\" />\n                        <Path x:Name=\"Over\" Margin=\"2,2.312,2,1.375\" Fill=\"{DynamicResource MouseOverBrush}\" Stretch=\"Fill\" Data=\"M-9.958333,0.78716499 L-3.204694,0.78717428 L-3.2052999,1.4276805 L-6.6465902,1.7722208 L-9.9818907,1.4345917 z\" Opacity=\"0\" />\n                        <Path x:Name=\"Press\" Margin=\"2,2.312,2,1.375\" Fill=\"{DynamicResource PressedBrush}\" Stretch=\"Fill\" Data=\"M-9.958333,0.78716499 L-3.204694,0.78717428 L-3.2052999,1.4276805 L-6.6465902,1.7722208 L-9.9818907,1.4345917 z\" Opacity=\"0\" />\n                        <Path x:Name=\"whiteGradient\" Margin=\"2,2.312,2,1.375\" Stretch=\"Fill\" Data=\"M-9.958333,0.78716499 L-3.204694,0.78717428 L-3.2052999,1.4276805 L-6.6465902,1.7722208 L-9.9818907,1.4345917 z\">\n                            <Path.Fill>\n                                <LinearGradientBrush EndPoint=\"0.5,0\" StartPoint=\"0.563,0.979\">\n                                    <GradientStop Color=\"#5FFFFFFF\" Offset=\"0\" />\n                                    <GradientStop Color=\"#5FFFFFFF\" Offset=\"0.259\" />\n                                    <GradientStop Color=\"#00FFFFFF\" Offset=\"0.393\" />\n                                    <GradientStop Color=\"#00FFFFFF\" Offset=\"0.643\" />\n                                    <GradientStop Color=\"#75FFFFFF\" Offset=\"0.75\" />\n                                    <GradientStop Color=\"#99FFFFFF\" Offset=\"1\" />\n                                </LinearGradientBrush>\n                            </Path.Fill>\n                        </Path>\n                        <Path x:Name=\"Line\" Margin=\"-1,-2,0,0\" Height=\"10\" Width=\"1\" Stretch=\"Fill\" Stroke=\"#FF6B81A0\" StrokeThickness=\"1\" Data=\"M5.4375,2.6875 L5.4375,12.1875\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />\n                        <Path x:Name=\"Line2\" Margin=\"0,-2,-1,0\" Height=\"10\" Width=\"1\" Stretch=\"Fill\" Stroke=\"#FFFFFFFF\" StrokeThickness=\"1\" Data=\"M5.4375,2.6875 L5.4375,12.1875\" VerticalAlignment=\"Center\" HorizontalAlignment=\"Center\" />\n                        <Path x:Name=\"DisabledVisualElement\" Margin=\"1,1.312,1,0.375\" Fill=\"#FFFFFFFF\" Stroke=\"#FFFFFFFF\" StrokeThickness=\"1\" StrokeLineJoin=\"Round\" Stretch=\"Fill\" Opacity=\"0\" Data=\"M-9.958333,0.78716499 L-3.204694,0.78717428 L-3.2052999,1.4266928 L-6.6465902,1.7712332 L-9.9818907,1.433604 z\" IsHitTestVisible=\"false\" />\n                        <Path x:Name=\"FocusVisualElement\" Stretch=\"Fill\" Stroke=\"{DynamicResource FocusBrush}\" StrokeThickness=\"1\" StrokeLineJoin=\"Round\" Data=\"M-9.958333,0.78716499 L-3.204694,0.78717428 L-3.2052999,1.4276805 L-6.6465902,1.7722208 L-9.9818907,1.4345917 z\" IsHitTestVisible=\"false\" Opacity=\"0\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsFocused\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard1\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" x:Name=\"FocusedOn_BeginStoryboard1\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsDragging\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOff}\" x:Name=\"PressedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOn}\" x:Name=\"PressedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n\n                            <Trigger.ExitActions>\n                                <BeginStoryboard x:Name=\"HoverOff_BeginStoryboard\" Storyboard=\"{StaticResource HoverOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Opacity\" TargetName=\"DisabledVisualElement\" Value=\"0.5\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n\n    <Style TargetType=\"{x:Type Slider}\">\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Slider}\">\n                    <Grid x:Name=\"GridRoot\">\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"Auto\" />\n                            <RowDefinition Height=\"Auto\" MinHeight=\"{TemplateBinding MinHeight}\" />\n                            <RowDefinition Height=\"Auto\" />\n                        </Grid.RowDefinitions>\n\n                        <TickBar Visibility=\"Collapsed\" x:Name=\"TopTick\" Height=\"4\" SnapsToDevicePixels=\"True\" Placement=\"Top\" Fill=\"#FF405A78\" />\n                        <Rectangle Margin=\"7.5,0,7.5,0\" Grid.Column=\"0\" Height=\"6\" RadiusX=\"3\" RadiusY=\"3\" Grid.Row=\"1\" Fill=\"{DynamicResource SliderBackgroundBrush}\"/>\n\n                        <Track Grid.Row=\"1\" x:Name=\"PART_Track\">\n                            <Track.Thumb>\n                                <Thumb Style=\"{DynamicResource NuclearSliderThumb}\" />\n                            </Track.Thumb>\n                            <Track.IncreaseRepeatButton>\n                                <RepeatButton Style=\"{DynamicResource NuclearScrollRepeatButtonStyle}\" Command=\"Slider.IncreaseLarge\" />\n                            </Track.IncreaseRepeatButton>\n                            <Track.DecreaseRepeatButton>\n                                <RepeatButton Style=\"{DynamicResource NuclearScrollRepeatButtonStyle}\" Command=\"Slider.DecreaseLarge\" />\n                            </Track.DecreaseRepeatButton>\n                        </Track>\n\n                        <TickBar Visibility=\"Collapsed\" Grid.Row=\"2\" x:Name=\"BottomTick\" Height=\"4\" SnapsToDevicePixels=\"True\" Placement=\"Bottom\" Fill=\"{TemplateBinding Foreground}\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"TickPlacement\" Value=\"TopLeft\">\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"TopTick\" />\n                        </Trigger>\n                        <Trigger Property=\"TickPlacement\" Value=\"BottomRight\">\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BottomTick\" />\n                        </Trigger>\n                        <Trigger Property=\"TickPlacement\" Value=\"Both\">\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"TopTick\" />\n                            <Setter Property=\"Visibility\" Value=\"Visible\" TargetName=\"BottomTick\" />\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Opacity\" TargetName=\"GridRoot\" Value=\"0.65\" />\n\n                        </Trigger>\n\n                        <Trigger Property=\"Orientation\" Value=\"Vertical\">\n                            <Setter Property=\"LayoutTransform\" TargetName=\"GridRoot\">\n                                <Setter.Value>\n                                    <RotateTransform Angle=\"-90\" />\n                                </Setter.Value>\n                            </Setter>\n                            <Setter TargetName=\"PART_Track\" Property=\"Orientation\" Value=\"Horizontal\" />\n                        </Trigger>\n\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type TreeView}\">\n        <Setter Property=\"Background\" Value=\"{DynamicResource ControlBackgroundBrush}\" />\n        <Setter Property=\"Foreground\" Value=\"{StaticResource OutsideFontColor}\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Top\" />\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ControlBorderBrush}\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"Padding\" Value=\"4\" />\n        <Setter Property=\"Cursor\" Value=\"Arrow\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type TreeView}\">\n                    <Grid>\n                        <Border x:Name=\"Border\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2\" Background=\"{DynamicResource ControlBackgroundBrush}\">\n                            <ScrollViewer Focusable=\"False\" Background=\"{TemplateBinding Background}\" Padding=\"4\" HorizontalScrollBarVisibility=\"Auto\" VerticalScrollBarVisibility=\"Auto\" CanContentScroll=\"False\">\n                                <ItemsPresenter />\n                            </ScrollViewer>\n                        </Border>\n                    </Grid>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style x:Key=\"NuclearTreeViewItemToggleButton\" d:IsControlPart=\"True\" TargetType=\"{x:Type ToggleButton}\">\n        <Setter Property=\"Focusable\" Value=\"False\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <ColorAnimation Duration=\"0\" Storyboard.TargetName=\"UncheckedVisual\" Storyboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\" To=\"#FFFFCB66\" />\n                            <ColorAnimation Duration=\"0\" Storyboard.TargetName=\"UncheckedVisual\" Storyboard.TargetProperty=\"(Shape.Stroke).(SolidColorBrush.Color)\" To=\"#FFFFCB66\" />\n                            <ColorAnimation Duration=\"0\" Storyboard.TargetName=\"CheckedVisual\" Storyboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\" To=\"#FFFFCB66\" />\n                            <ColorAnimation Duration=\"0\" Storyboard.TargetName=\"CheckedVisual\" Storyboard.TargetProperty=\"(Shape.Stroke).(SolidColorBrush.Color)\" To=\"#FFFFCB66\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <ColorAnimation Duration=\"0\" Storyboard.TargetName=\"UncheckedVisual\" Storyboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\" To=\"#FF9EC6FB\" />\n                            <ColorAnimation Duration=\"0\" Storyboard.TargetName=\"UncheckedVisual\" Storyboard.TargetProperty=\"(Shape.Stroke).(SolidColorBrush.Color)\" To=\"#FF9EC6FB\" />\n                            <ColorAnimation Duration=\"0\" Storyboard.TargetName=\"CheckedVisual\" Storyboard.TargetProperty=\"(Shape.Fill).(SolidColorBrush.Color)\" To=\"#FFE56E17\" />\n                            <ColorAnimation Duration=\"0\" Storyboard.TargetName=\"CheckedVisual\" Storyboard.TargetProperty=\"(Shape.Stroke).(SolidColorBrush.Color)\" To=\"#FFE56E17\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOn\">\n                            <DoubleAnimation Duration=\"0\" Storyboard.TargetName=\"UncheckedVisual\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"0\" Storyboard.TargetName=\"CheckedVisual\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOff\">\n                            <DoubleAnimation Duration=\"0\" Storyboard.TargetName=\"UncheckedVisual\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"0\" Storyboard.TargetName=\"CheckedVisual\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid HorizontalAlignment=\"Right\" Margin=\"2,2,5,2\">\n                        <Path x:Name=\"UncheckedVisual\" Height=\"9\" Width=\"6\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Center\" Fill=\"#FF9EC6FB\" Stroke=\"#FF9EC6FB\" StrokeLineJoin=\"Miter\" Data=\"M 0,0 L 0,9 L 5,4.5 Z\" />\n                        <Path x:Name=\"CheckedVisual\" Height=\"6\" Width=\"6\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Center\" Fill=\"#FFE56E17\" Stroke=\"#FFE56E17\" StrokeLineJoin=\"Miter\" Opacity=\"0\" Data=\"M 6,0 L 6,6 L 0,6 Z\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsChecked\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOff}\" x:Name=\"CheckedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOn}\" x:Name=\"CheckedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style d:IsControlPart=\"True\" TargetType=\"{x:Type TreeViewItem}\">\n        <Setter Property=\"Background\" Value=\"Transparent\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Top\" />\n        <Setter Property=\"Padding\" Value=\"5,3,15,3\" />\n        <Setter Property=\"Cursor\" Value=\"Arrow\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type TreeViewItem}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"SelectedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"select_gradient\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"SelectedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"select_gradient\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"hover_gradient\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"0.85\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"highlight\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"0.65\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"hover_gradient\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"highlight\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"InactiveOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"inactive\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"0.5\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"InactiveOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"inactive\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid x:Name=\"grid\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition MinWidth=\"19\" Width=\"Auto\" />\n                            <ColumnDefinition Width=\"Auto\" />\n                            <ColumnDefinition Width=\"*\" />\n                        </Grid.ColumnDefinitions>\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"Auto\" />\n                            <RowDefinition />\n                        </Grid.RowDefinitions>\n                        <ToggleButton x:Name=\"Expander\" Style=\"{DynamicResource NuclearTreeViewItemToggleButton}\" IsChecked=\"{Binding Path=IsExpanded, RelativeSource={RelativeSource TemplatedParent}}\" ClickMode=\"Press\" />\n\n                        <Rectangle x:Name=\"select_gradient\" Grid.Column=\"1\" StrokeThickness=\"1\" RadiusX=\"1\" RadiusY=\"1\" Opacity=\"0\" IsHitTestVisible=\"False\" Fill=\"{DynamicResource PressedBrush}\" Stroke=\"{DynamicResource PressedBorderBrush}\"/>\n                        <Rectangle x:Name=\"inactive\" Grid.Column=\"1\" Fill=\"#FF999999\" Stroke=\"#FF333333\" StrokeThickness=\"1\" RadiusX=\"2\" RadiusY=\"2\" Opacity=\"0\" IsHitTestVisible=\"False\" />\n\n                        <Rectangle x:Name=\"hover_gradient\" Stroke=\"{DynamicResource FocusBrush}\" StrokeThickness=\"1\" RadiusX=\"1\" RadiusY=\"1\" Opacity=\"0\" IsHitTestVisible=\"False\" Grid.Column=\"1\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                        <Rectangle x:Name=\"highlight\" Margin=\"1\" StrokeThickness=\"1\" RadiusX=\"0.5\" RadiusY=\"0.5\" Opacity=\"0\" IsHitTestVisible=\"False\" Grid.Column=\"1\" Stroke=\"{DynamicResource MouseOverHighlightBrush}\"/>\n\n                        <Border Grid.Column=\"1\" x:Name=\"Selection_Border\" BorderThickness=\"{TemplateBinding BorderThickness}\" Padding=\"{TemplateBinding Padding}\">\n                            <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" x:Name=\"PART_Header\" ContentSource=\"Header\" />\n                        </Border>\n                        <ItemsPresenter Grid.Column=\"1\" Grid.ColumnSpan=\"2\" Grid.Row=\"1\" x:Name=\"ItemsHost\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\" SourceName=\"Selection_Border\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" x:Name=\"HoverOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsExpanded\" Value=\"false\">\n                            <Setter Property=\"Visibility\" Value=\"Collapsed\" TargetName=\"ItemsHost\" />\n                        </Trigger>\n                        <Trigger Property=\"HasItems\" Value=\"false\">\n                            <Setter Property=\"Visibility\" Value=\"Hidden\" TargetName=\"Expander\" />\n                        </Trigger>\n                        <Trigger Property=\"IsSelected\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard x:Name=\"SelectedOff_BeginStoryboard\" Storyboard=\"{StaticResource SelectedOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource SelectedOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <MultiTrigger>\n                            <MultiTrigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource InactiveOff}\" x:Name=\"InactiveOff_BeginStoryboard\" />\n                            </MultiTrigger.ExitActions>\n                            <MultiTrigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource InactiveOn}\" x:Name=\"InactiveOn_BeginStoryboard\" />\n                            </MultiTrigger.EnterActions>\n                            <MultiTrigger.Conditions>\n                                <Condition Property=\"IsSelected\" Value=\"true\" />\n                                <Condition Property=\"IsSelectionActive\" Value=\"false\" />\n                            </MultiTrigger.Conditions>\n                        </MultiTrigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style x:Key=\"{x:Static ToolBar.ButtonStyleKey}\" TargetType=\"{x:Type Button}\" BasedOn=\"{x:Null}\">\n        <Setter Property=\"FocusVisualStyle\" Value=\"{DynamicResource NuclearButtonFocusVisual}\" />\n        <Setter Property=\"Foreground\" Value=\"#FF042271\" />\n\t\t\t\t\t\t<Setter Property=\"FontSize\" Value=\"10\"/>\n\t\t\t\t<Setter Property=\"MinHeight\" Value=\"18\"/>\n\t\t\t\t<Setter Property=\"MinWidth\" Value=\"50\"/>\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"3\" />\n        <Setter Property=\"Template\" Value=\"{DynamicResource ButtonTemplate}\" />\n    </Style>\n\n    <Style x:Key=\"{x:Static ToolBar.CheckBoxStyleKey}\" TargetType=\"{x:Type CheckBox}\">\n\t\t\t<Setter Property=\"FontSize\" Value=\"10\"/>\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"FocusVisualStyle\" Value=\"{DynamicResource CheckBoxFocusVisual}\" />\n        <Setter Property=\"Foreground\" Value=\"{StaticResource OutsideFontColor}\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Top\" />\n        <Setter Property=\"Padding\" Value=\"4,1,0,0\" />\n        <Setter Property=\"Template\" Value=\"{DynamicResource CheckBoxTemplate}\" />\n    </Style>\n\n    <Style x:Key=\"{x:Static ToolBar.RadioButtonStyleKey}\" TargetType=\"{x:Type RadioButton}\">\n\t\t\t<Setter Property=\"FontSize\" Value=\"10\"/>\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"FocusVisualStyle\" Value=\"{DynamicResource RadioButtonFocusVisual}\" />\n        <Setter Property=\"Foreground\" Value=\"{StaticResource OutsideFontColor}\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Left\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Top\" />\n        <Setter Property=\"Padding\" Value=\"4,1,0,0\" />\n        <Setter Property=\"Template\" Value=\"{DynamicResource RadioButtonTemplate}\" />\n    </Style>\n\n    <Style x:Key=\"{x:Static ToolBar.ComboBoxStyleKey}\" TargetType=\"{x:Type ComboBox}\">\n\t\t\t<Setter Property=\"FontSize\" Value=\"10\"/>\n        <Setter Property=\"SnapsToDevicePixels\" Value=\"true\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"6,2,25,2\" />\n        \n<Setter Property=\"Template\" Value=\"{DynamicResource ComboBoxTemplate}\" />\n    </Style>\n\n    <Style x:Key=\"{x:Static ToolBar.TextBoxStyleKey}\" TargetType=\"{x:Type TextBox}\">\n\t\t\t<Setter Property=\"FontSize\" Value=\"10\"/>\n        <Setter Property=\"KeyboardNavigation.TabNavigation\" Value=\"None\" />\n        <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\" />\n        <Setter Property=\"AllowDrop\" Value=\"true\" />\n        <Setter Property=\"Background\" >\n            <Setter.Value>\n                <SolidColorBrush Color=\"{DynamicResource WhiteColor}\"/>\n            </Setter.Value>\n        </Setter>\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"4\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"BorderBrush\">\n            <Setter.Value>\n                <LinearGradientBrush EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n                    <GradientStop Color=\"#FFABAEB3\" />\n                    <GradientStop Color=\"#FFE2E8EE\" Offset=\"1\" />\n                </LinearGradientBrush>\n            </Setter.Value>\n        </Setter>\n        <Setter Property=\"Template\" Value=\"{DynamicResource TextBoxTemplate}\" />\n    </Style>\n\n    <LinearGradientBrush x:Key=\"ToolBarHorizontalBackground\" EndPoint=\"0,1\" StartPoint=\"0,0\">\n        <GradientStop Color=\"#FFFFFF\" Offset=\"0\" />\n        <GradientStop Color=\"#FFFBFF\" Offset=\"0.5\" />\n        <GradientStop Color=\"#F7F7F7\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <LinearGradientBrush x:Key=\"ToolBarToggleButtonHorizontalBackground\" EndPoint=\"0,1\" StartPoint=\"0,0\">\n        <GradientStop Color=\"#ECECEC\" Offset=\"0\" />\n        <GradientStop Color=\"#DDDDDD\" Offset=\"0.5\" />\n        <GradientStop Color=\"#A0A0A0\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <SolidColorBrush x:Key=\"ToolBarButtonHover\" Color=\"#FF125E7C\" />\n    <SolidColorBrush x:Key=\"ToolBarGripper\" Color=\"#C6C3C6\" />\n    <Style x:Key=\"ToolBarHorizontalOverflowButtonStyle\" TargetType=\"{x:Type ToggleButton}\">\n        <Setter Property=\"Background\" Value=\"{StaticResource ToolBarToggleButtonHorizontalBackground}\" />\n        <Setter Property=\"MinHeight\" Value=\"0\" />\n        <Setter Property=\"MinWidth\" Value=\"0\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"BackgroundOver\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"BackgroundOver_Highlight\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"0.65\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"BackgroundOver\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"BackgroundOver_Highlight\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid>\n                        <Border SnapsToDevicePixels=\"true\" x:Name=\"Bd\" CornerRadius=\"0,0,0,0\" Background=\"{DynamicResource NormalBrush}\"/>\n                        <Border x:Name=\"BackgroundOver\" BorderThickness=\"1\" CornerRadius=\"1.75\" Opacity=\"0\" Background=\"{DynamicResource MouseOverBrush}\" BorderBrush=\"{DynamicResource MouseOverBorderBrush}\"/>\n                        <Border x:Name=\"BackgroundOver_Highlight\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0\" Margin=\"0,0,0,0\" BorderBrush=\"{DynamicResource MouseOverHighlightBrush}\"/>\n                        <Canvas SnapsToDevicePixels=\"true\" HorizontalAlignment=\"Right\" Margin=\"7,2,2,2\" VerticalAlignment=\"Bottom\" Width=\"6\" Height=\"7\">\n                            <Path Stroke=\"White\" Data=\"M 1 1.5 L 6 1.5\" />\n                            <Path Stroke=\"{TemplateBinding Foreground}\" Data=\"M 0 0.5 L 5 0.5\" />\n                            <Path Fill=\"White\" Data=\"M 0.5 4 L 6.5 4 L 3.5 7 Z\" />\n                            <Path Fill=\"{TemplateBinding Foreground}\" Data=\"M -0.5 3 L 5.5 3 L 2.5 6 Z\" />\n                        </Canvas>\n                        <Border x:Name=\"FocusVisualElement\" Margin=\"-1\" BorderBrush=\"#FFE99862\" BorderThickness=\"1\" CornerRadius=\"2.75\" IsHitTestVisible=\"false\" Opacity=\"0\" />\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsKeyboardFocused\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" x:Name=\"FocusedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{StaticResource ToolBarGripper}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <SolidColorBrush x:Key=\"ToolBarSubMenuBackground\" Color=\"#FFFDFDFD\" />\n    <SolidColorBrush x:Key=\"ToolBarMenuBorder\" Color=\"#FFFFFFFF\" />\n    <Style x:Key=\"ToolBarThumbStyle\" TargetType=\"{x:Type Thumb}\">\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Thumb}\">\n                    <Border SnapsToDevicePixels=\"True\" Background=\"Transparent\" Padding=\"{TemplateBinding Padding}\" CornerRadius=\"0,0,0,0\">\n                        <Rectangle>\n                            <Rectangle.Fill>\n                                <DrawingBrush TileMode=\"Tile\" Viewbox=\"0,0,4,4\" ViewboxUnits=\"Absolute\" Viewport=\"0,0,4,4\" ViewportUnits=\"Absolute\">\n                                    <DrawingBrush.Drawing>\n                                        <DrawingGroup>\n                                            <GeometryDrawing Brush=\"White\" Geometry=\"M 1 1 L 1 3 L 3 3 L 3 1 z\" />\n                                            <GeometryDrawing Brush=\"{StaticResource ToolBarGripper}\" Geometry=\"M 0 0 L 0 2 L 2 2 L 2 0 z\" />\n                                        </DrawingGroup>\n                                    </DrawingBrush.Drawing>\n                                </DrawingBrush>\n                            </Rectangle.Fill>\n                        </Rectangle>\n                    </Border>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Setter Property=\"Cursor\" Value=\"SizeAll\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <LinearGradientBrush x:Key=\"ToolBarToggleButtonVerticalBackground\" EndPoint=\"1,0\" StartPoint=\"0,0\">\n        <GradientStop Color=\"#ECECEC\" Offset=\"0\" />\n        <GradientStop Color=\"#DDDDDD\" Offset=\"0.5\" />\n        <GradientStop Color=\"#A0A0A0\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <Style x:Key=\"ToolBarVerticalOverflowButtonStyle\" TargetType=\"{x:Type ToggleButton}\">\n        <Setter Property=\"Background\" Value=\"{StaticResource ToolBarToggleButtonVerticalBackground}\" />\n        <Setter Property=\"MinHeight\" Value=\"0\" />\n        <Setter Property=\"MinWidth\" Value=\"0\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\n                    <Border SnapsToDevicePixels=\"true\" x:Name=\"Bd\" Background=\"{TemplateBinding Background}\" CornerRadius=\"0,0,3,3\">\n                        <Canvas SnapsToDevicePixels=\"true\" HorizontalAlignment=\"Right\" Margin=\"2,7,2,2\" VerticalAlignment=\"Bottom\" Width=\"7\" Height=\"6\">\n                            <Path Stroke=\"White\" Data=\"M 1.5 1 L 1.5 6\" />\n                            <Path Stroke=\"{TemplateBinding Foreground}\" Data=\"M 0.5 0 L 0.5 5\" />\n                            <Path Fill=\"White\" Data=\"M 3.5 0.5 L 7 3.5 L 4 6.5 Z\" />\n                            <Path Fill=\"{TemplateBinding Foreground}\" Data=\"M 3 -0.5 L 6 2.5 L 3 5.5 Z\" />\n                        </Canvas>\n                    </Border>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Setter Property=\"Background\" TargetName=\"Bd\" Value=\"{StaticResource ToolBarButtonHover}\" />\n                        </Trigger>\n                        <Trigger Property=\"IsKeyboardFocused\" Value=\"true\">\n                            <Setter Property=\"Background\" TargetName=\"Bd\" Value=\"{StaticResource ToolBarButtonHover}\" />\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{StaticResource ToolBarGripper}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <LinearGradientBrush x:Key=\"ToolBarVerticalBackground\" EndPoint=\"1,0\" StartPoint=\"0,0\">\n        <GradientStop Color=\"#FFFFFF\" Offset=\"0\" />\n        <GradientStop Color=\"#FFFBFF\" Offset=\"0.5\" />\n        <GradientStop Color=\"#F7F7F7\" Offset=\"1\" />\n    </LinearGradientBrush>\n    <Style TargetType=\"{x:Type ToolBar}\">\n        <Setter Property=\"Background\" Value=\"{StaticResource ToolBarHorizontalBackground}\" />\n        <Setter Property=\"BorderBrush\" Value=\"#FFB1703C\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ToolBar}\">\n                    <Grid SnapsToDevicePixels=\"true\" Margin=\"3,1,1,1\" x:Name=\"Grid\">\n                        <Grid HorizontalAlignment=\"Right\" x:Name=\"OverflowGrid\">\n                            <ToggleButton IsEnabled=\"{TemplateBinding HasOverflowItems}\" FocusVisualStyle=\"{x:Null}\" x:Name=\"OverflowButton\" Style=\"{StaticResource ToolBarHorizontalOverflowButtonStyle}\" ClickMode=\"Press\" IsChecked=\"{Binding Path=IsOverflowOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\">\n                                <ToggleButton.Background>\n                                    <LinearGradientBrush EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n                                        <GradientStop Color=\"#FFFFFFFF\" Offset=\"0\" />\n                                        <GradientStop Color=\"#FF8AAEDA\" Offset=\"0.521\" />\n                                        <GradientStop Color=\"#FFC6D6EC\" Offset=\"0.194\" />\n                                        <GradientStop Color=\"#FFB4C9E5\" Offset=\"0.811\" />\n                                        <GradientStop Color=\"#FFB7C8E0\" Offset=\"0.507\" />\n                                        <GradientStop Color=\"#FFD1DEF0\" Offset=\"1\" />\n                                    </LinearGradientBrush>\n                                </ToggleButton.Background>\n                            </ToggleButton>\n                            <Popup Focusable=\"false\" AllowsTransparency=\"true\" IsOpen=\"{Binding Path=IsOverflowOpen, RelativeSource={RelativeSource TemplatedParent}}\" Placement=\"Bottom\" PopupAnimation=\"{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}\" StaysOpen=\"False\" x:Name=\"OverflowPopup\">\n                                <Border x:Name=\"Shdw\">\n                                    <Border BorderThickness=\"1,1,1,1\" BorderBrush=\"{TemplateBinding BorderBrush}\">\n                                        <Border.Background>\n                                            <LinearGradientBrush EndPoint=\"1.204,0.5\" StartPoint=\"0.056,0.5\">\n                                                <GradientStop Color=\"#FFFFFFFF\" Offset=\"0\" />\n                                                <GradientStop Color=\"#FFD4D7DB\" Offset=\"1\" />\n                                            </LinearGradientBrush>\n                                        </Border.Background>\n                                        <ToolBarOverflowPanel Focusable=\"true\" SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" FocusVisualStyle=\"{x:Null}\" Margin=\"2\" x:Name=\"PART_ToolBarOverflowPanel\" WrapWidth=\"200\" KeyboardNavigation.DirectionalNavigation=\"Cycle\" KeyboardNavigation.TabNavigation=\"Cycle\" />\n                                    </Border>\n                                </Border>\n                            </Popup>\n                        </Grid>\n                        <Border Margin=\"0,0,11,0\" x:Name=\"MainPanelBorder\" BorderThickness=\"1\" CornerRadius=\"0,0,0,0\" Padding=\"{TemplateBinding Padding}\" Background=\"{DynamicResource NormalBrush}\" BorderBrush=\"{DynamicResource NormalBorderBrush}\">\n                            <Grid>\n\n                                <DockPanel KeyboardNavigation.TabIndex=\"1\" KeyboardNavigation.TabNavigation=\"Local\">\n                                    <Thumb Padding=\"6,5,1,6\" Margin=\"-3,-1,0,0\" x:Name=\"ToolBarThumb\" Style=\"{StaticResource ToolBarThumbStyle}\" Width=\"10\" />\n                                    <ContentPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" HorizontalAlignment=\"Center\" Margin=\"4,0,4,0\" x:Name=\"ToolBarHeader\" VerticalAlignment=\"Center\" ContentSource=\"Header\" />\n                                    <ToolBarPanel SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" Margin=\"0,1,2,2\" x:Name=\"PART_ToolBarPanel\" IsItemsHost=\"true\" Background=\"{DynamicResource NormalBrush}\"/>\n                                </DockPanel>\n                            </Grid>\n                        </Border>\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsOverflowOpen\" Value=\"true\">\n                            <Setter Property=\"IsEnabled\" TargetName=\"ToolBarThumb\" Value=\"false\" />\n                        </Trigger>\n                        <Trigger Property=\"Header\" Value=\"{x:Null}\">\n                            <Setter Property=\"Visibility\" TargetName=\"ToolBarHeader\" Value=\"Collapsed\" />\n                        </Trigger>\n                        <Trigger Property=\"ToolBarTray.IsLocked\" Value=\"true\">\n                            <Setter Property=\"Visibility\" TargetName=\"ToolBarThumb\" Value=\"Collapsed\" />\n                        </Trigger>\n                        <Trigger Property=\"HasDropShadow\" SourceName=\"OverflowPopup\" Value=\"true\">\n                            <Setter Property=\"Margin\" TargetName=\"Shdw\" Value=\"0,0,5,5\" />\n                            <Setter Property=\"SnapsToDevicePixels\" TargetName=\"Shdw\" Value=\"true\" />\n                            <Setter Property=\"Background\" TargetName=\"Shdw\" Value=\"#71000000\" />\n                        </Trigger>\n                        <Trigger Property=\"Orientation\" Value=\"Vertical\">\n                            <Setter Property=\"Margin\" TargetName=\"Grid\" Value=\"1,3,1,1\" />\n                            <Setter Property=\"Style\" TargetName=\"OverflowButton\" Value=\"{StaticResource ToolBarVerticalOverflowButtonStyle}\" />\n                            <Setter Property=\"Height\" TargetName=\"ToolBarThumb\" Value=\"10\" />\n                            <Setter Property=\"Width\" TargetName=\"ToolBarThumb\" Value=\"Auto\" />\n                            <Setter Property=\"Margin\" TargetName=\"ToolBarThumb\" Value=\"-1,-3,0,0\" />\n                            <Setter Property=\"Padding\" TargetName=\"ToolBarThumb\" Value=\"5,6,6,1\" />\n                            <Setter Property=\"Margin\" TargetName=\"ToolBarHeader\" Value=\"0,0,0,4\" />\n                            <Setter Property=\"Margin\" TargetName=\"PART_ToolBarPanel\" Value=\"1,0,2,2\" />\n                            <Setter Property=\"DockPanel.Dock\" TargetName=\"ToolBarThumb\" Value=\"Top\" />\n                            <Setter Property=\"DockPanel.Dock\" TargetName=\"ToolBarHeader\" Value=\"Top\" />\n                            <Setter Property=\"HorizontalAlignment\" TargetName=\"OverflowGrid\" Value=\"Stretch\" />\n                            <Setter Property=\"VerticalAlignment\" TargetName=\"OverflowGrid\" Value=\"Bottom\" />\n                            <Setter Property=\"Placement\" TargetName=\"OverflowPopup\" Value=\"Right\" />\n                            <Setter Property=\"Margin\" TargetName=\"MainPanelBorder\" Value=\"0,0,0,11\" />\n                            <Setter Property=\"Background\" Value=\"{StaticResource ToolBarVerticalBackground}\" />\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n        <Setter Property=\"Foreground\" Value=\"#FF000000\" />\n    </Style>\n\n    <BorderGapMaskConverter x:Key=\"BorderGapMaskConverter\" />\n    <Style TargetType=\"{x:Type GroupBox}\">\n        <Setter Property=\"BorderBrush\" Value=\"#D5DFE5\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"FocusVisualStyle\" Value=\"{DynamicResource NuclearButtonFocusVisual}\" />\n        <Setter Property=\"Foreground\" Value=\"#FF042271\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type GroupBox}\">\n                    <Grid SnapsToDevicePixels=\"true\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"6\" />\n                            <ColumnDefinition Width=\"Auto\" />\n                            <ColumnDefinition Width=\"*\" />\n                            <ColumnDefinition Width=\"6\" />\n                        </Grid.ColumnDefinitions>\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"Auto\" />\n                            <RowDefinition Height=\"Auto\" />\n                            <RowDefinition Height=\"*\" />\n                            <RowDefinition Height=\"6\" />\n                        </Grid.RowDefinitions>\n                        <Border Grid.ColumnSpan=\"4\" Grid.RowSpan=\"4\" CornerRadius=\"4,4,4,4\" BorderThickness=\"1,1,1,1\">\n                            <Border.Background>\n                                <LinearGradientBrush EndPoint=\"1.204,0.5\" StartPoint=\"0.056,0.5\">\n                                    <GradientStop Color=\"#FFFFFFFF\" Offset=\"0\" />\n                                    <GradientStop Color=\"#FFD4D7DB\" Offset=\"1\" />\n                                </LinearGradientBrush>\n                            </Border.Background>\n                        </Border>\n                        <Border Grid.ColumnSpan=\"4\" Grid.Row=\"1\" Grid.RowSpan=\"3\" BorderThickness=\"1,1,1,1\" CornerRadius=\"4\" BorderBrush=\"{DynamicResource ControlBorderBrush}\">\n                            <Border.OpacityMask>\n                                <MultiBinding Converter=\"{StaticResource BorderGapMaskConverter}\" ConverterParameter=\"7\">\n                                    <Binding Path=\"ActualWidth\" ElementName=\"Header\" />\n                                    <Binding Path=\"ActualWidth\" RelativeSource=\"{RelativeSource Self}\" />\n                                    <Binding Path=\"ActualHeight\" RelativeSource=\"{RelativeSource Self}\" />\n                                </MultiBinding>\n                            </Border.OpacityMask>\n                            <Border BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"3\">\n                                <Border.BorderBrush>\n                                    <SolidColorBrush Color=\"{DynamicResource MainColor}\" />\n                                </Border.BorderBrush>\n                                <Border BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2\">\n                                    <Border.BorderBrush>\n                                        <SolidColorBrush Color=\"{DynamicResource MainColor}\" />\n                                    </Border.BorderBrush>\n                                </Border>\n                            </Border>\n                        </Border>\n                        <Border Grid.Column=\"0\" Grid.ColumnSpan=\"4\" Grid.Row=\"1\" Grid.RowSpan=\"3\" Background=\"{TemplateBinding Background}\" BorderBrush=\"Transparent\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"4\" />\n                        <Border Grid.ColumnSpan=\"4\" Grid.RowSpan=\"2\" BorderThickness=\"1,1,1,0\" CornerRadius=\"2,2,0,0\" x:Name=\"Main\">\n                            <Border x:Name=\"BackgroundNorm\" BorderThickness=\"1\" CornerRadius=\"1.75\" Background=\"{DynamicResource NormalBrush}\" BorderBrush=\"{DynamicResource NormalBorderBrush}\"/>\n                        </Border>\n\n                        <Border x:Name=\"Header\" Grid.Column=\"1\" Grid.Row=\"0\" Grid.RowSpan=\"2\" Padding=\"3,1,3,0\">\n                            <ContentPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" ContentSource=\"Header\" RecognizesAccessKey=\"True\" Margin=\"0,4,0,4\" />\n                        </Border>\n\n                        <ContentPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" Margin=\"{TemplateBinding Padding}\" Grid.Column=\"1\" Grid.ColumnSpan=\"2\" Grid.Row=\"2\" />\n                    </Grid>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <Style x:Key=\"{x:Static GridView.GridViewScrollViewerStyleKey}\" TargetType=\"{x:Type ScrollViewer}\">\n        <Setter Property=\"Focusable\" Value=\"false\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ScrollViewer}\">\n                    <Grid SnapsToDevicePixels=\"true\" Background=\"{TemplateBinding Background}\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"*\" />\n                            <ColumnDefinition Width=\"Auto\" />\n                        </Grid.ColumnDefinitions>\n                        <Grid.RowDefinitions>\n                            <RowDefinition Height=\"*\" />\n                            <RowDefinition Height=\"Auto\" />\n                        </Grid.RowDefinitions>\n                        <DockPanel Margin=\"{TemplateBinding Padding}\">\n                            <ScrollViewer Focusable=\"false\" DockPanel.Dock=\"Top\" HorizontalScrollBarVisibility=\"Hidden\" VerticalScrollBarVisibility=\"Hidden\">\n                                <GridViewHeaderRowPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" Margin=\"2,0,2,0\" AllowsColumnReorder=\"{Binding Path=TemplatedParent.View.AllowsColumnReorder, RelativeSource={RelativeSource TemplatedParent}}\" ColumnHeaderContainerStyle=\"{Binding Path=TemplatedParent.View.ColumnHeaderContainerStyle, RelativeSource={RelativeSource TemplatedParent}}\" ColumnHeaderContextMenu=\"{Binding Path=TemplatedParent.View.ColumnHeaderContextMenu, RelativeSource={RelativeSource TemplatedParent}}\" ColumnHeaderTemplate=\"{Binding Path=TemplatedParent.View.ColumnHeaderTemplate, RelativeSource={RelativeSource TemplatedParent}}\" ColumnHeaderTemplateSelector=\"{Binding Path=TemplatedParent.View.ColumnHeaderTemplateSelector, RelativeSource={RelativeSource TemplatedParent}}\" ColumnHeaderToolTip=\"{Binding Path=TemplatedParent.View.ColumnHeaderToolTip, RelativeSource={RelativeSource TemplatedParent}}\" Columns=\"{Binding Path=TemplatedParent.View.Columns, RelativeSource={RelativeSource TemplatedParent}}\" />\n\n                            </ScrollViewer>\n                            <ScrollContentPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" x:Name=\"PART_ScrollContentPresenter\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" CanContentScroll=\"{TemplateBinding CanContentScroll}\" KeyboardNavigation.DirectionalNavigation=\"Local\" />\n                        </DockPanel>\n                        <ScrollBar Visibility=\"{TemplateBinding ComputedHorizontalScrollBarVisibility}\" Cursor=\"Arrow\" x:Name=\"PART_HorizontalScrollBar\" Grid.Row=\"1\" Orientation=\"Horizontal\" ViewportSize=\"{TemplateBinding ViewportWidth}\" Maximum=\"{TemplateBinding ScrollableWidth}\" Minimum=\"0.0\" Value=\"{Binding Path=HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}\" />\n                        <ScrollBar Visibility=\"{TemplateBinding ComputedVerticalScrollBarVisibility}\" Cursor=\"Arrow\" x:Name=\"PART_VerticalScrollBar\" Grid.Column=\"1\" Orientation=\"Vertical\" ViewportSize=\"{TemplateBinding ViewportHeight}\" Maximum=\"{TemplateBinding ScrollableHeight}\" Minimum=\"0.0\" Value=\"{Binding Path=VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}\" />\n                        <DockPanel Grid.Column=\"1\" Grid.Row=\"1\" Background=\"{Binding Path=Background, ElementName=PART_VerticalScrollBar}\" LastChildFill=\"false\">\n                            <Rectangle Visibility=\"{TemplateBinding ComputedVerticalScrollBarVisibility}\" Width=\"1\" Fill=\"White\" DockPanel.Dock=\"Left\" />\n                            <Rectangle Visibility=\"{TemplateBinding ComputedHorizontalScrollBarVisibility}\" Height=\"1\" Fill=\"White\" DockPanel.Dock=\"Top\" />\n                        </DockPanel>\n                    </Grid>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <Style TargetType=\"{x:Type ListView}\">\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"ScrollViewer.HorizontalScrollBarVisibility\" Value=\"Auto\" />\n        <Setter Property=\"ScrollViewer.VerticalScrollBarVisibility\" Value=\"Auto\" />\n        <Setter Property=\"ScrollViewer.CanContentScroll\" Value=\"true\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"BorderBrush\" Value=\"#FFB1703C\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"Padding\" Value=\"1\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ListView}\">\n                    <Border x:Name=\"Border\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"1\">\n                        <Border.Background>\n                            <LinearGradientBrush EndPoint=\"1.204,0.5\" StartPoint=\"0.056,0.5\">\n                                <GradientStop Color=\"#FFFFFFFF\" Offset=\"0\" />\n                                <GradientStop Color=\"#FFD4D7DB\" Offset=\"1\" />\n                            </LinearGradientBrush>\n                        </Border.Background>\n\n                        <ScrollViewer Padding=\"{TemplateBinding Padding}\" Style=\"{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}\">\n                            <ItemsPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" />\n                        </ScrollViewer>\n                    </Border>\n\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsGrouping\" Value=\"true\">\n                            <Setter Property=\"ScrollViewer.CanContentScroll\" Value=\"false\" />\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\" />\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <Style x:Key=\"ListViewItemFocusVisual\">\n        <Setter Property=\"Control.Template\">\n            <Setter.Value>\n                <ControlTemplate>\n                    <Rectangle Stroke=\"#8E6EA6F5\" StrokeThickness=\"1\" RadiusX=\"2\" RadiusY=\"2\" />\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type ListViewItem}\">\n        <Setter Property=\"FocusVisualStyle\" Value=\"{StaticResource ListViewItemFocusVisual}\" />\n        <Setter Property=\"Background\" Value=\"Transparent\" />\n        <Setter Property=\"BorderBrush\" Value=\"Transparent\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"Margin\" Value=\"0,0,0,1\" />\n        <Setter Property=\"Padding\" Value=\"5,2,5,2\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ListViewItem}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundGradientOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0.73\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundGradientOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"SelectedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundGradientSelected\" Storyboard.TargetProperty=\"Opacity\" To=\"0.84\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundGradientSelectedDisabled\" Storyboard.TargetProperty=\"Opacity\" To=\"0.55\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"SelectedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundGradientSelected\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundGradientSelectedDisabled\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Border SnapsToDevicePixels=\"true\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"2\" x:Name=\"border\">\n\n                        <Grid Margin=\"2,0,2,0\">\n                            <Rectangle x:Name=\"BackgroundGradientOver\" RadiusX=\"1\" RadiusY=\"1\" Stroke=\"{DynamicResource MouseOverBorderBrush}\" Opacity=\"0\" Fill=\"{DynamicResource MouseOverBrush}\"/>\n                            <Rectangle x:Name=\"BackgroundGradientSelectedDisabled\" RadiusX=\"1\" RadiusY=\"1\" Opacity=\"0\" Fill=\"{DynamicResource ListItemSelectedBrush}\" Stroke=\"{DynamicResource ListItemSelectedBorderBrush}\"/>\n                            <Rectangle x:Name=\"BackgroundGradientSelected\" StrokeThickness=\"1\" RadiusX=\"1\" RadiusY=\"1\" Opacity=\"0\" Fill=\"{DynamicResource PressedBrush}\" Stroke=\"{DynamicResource PressedBorderBrush}\"/>\n                            <GridViewRowPresenter SnapsToDevicePixels=\"{TemplateBinding SnapsToDevicePixels}\" Margin=\"0,2,0,2\" VerticalAlignment=\"Stretch\" />\n                        </Grid>\n\n                    </Border>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsSelected\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource SelectedOff}\" x:Name=\"SelectedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource SelectedOn}\" x:Name=\"SelectedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource DisabledForegroundBrush}\" />\n                        </Trigger>\n                        <MultiTrigger>\n                            <MultiTrigger.Conditions>\n                                <Condition Property=\"IsSelected\" Value=\"true\" />\n                                <Condition Property=\"Selector.IsSelectionActive\" Value=\"false\" />\n                            </MultiTrigger.Conditions>\n\n                        </MultiTrigger>\n\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource OutsideFontColor}\" />\n    </Style>\n\n    <Style x:Key=\"GridViewColumnHeaderGripper\" TargetType=\"{x:Type Thumb}\">\n        <Setter Property=\"Canvas.Right\" Value=\"-8.5\" />\n        <Setter Property=\"Width\" Value=\"18\" />\n        <Setter Property=\"Height\" Value=\"{Binding Path=ActualHeight, RelativeSource={RelativeSource TemplatedParent}}\" />\n        <Setter Property=\"Padding\" Value=\"0,3,0,4\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type Thumb}\">\n                    <Border Padding=\"{TemplateBinding Padding}\" Background=\"#00FFFFFF\">\n                        <Rectangle HorizontalAlignment=\"Center\" Width=\"0.5\">\n                            <Rectangle.Fill>\n                                <SolidColorBrush Color=\"{DynamicResource WhiteColor}\" />\n                            </Rectangle.Fill>\n                        </Rectangle>\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n    <Style x:Key=\"{x:Type GridViewColumnHeader}\" TargetType=\"{x:Type GridViewColumnHeader}\">\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"Padding\" Value=\"2,0,2,0\" />\n        <Setter Property=\"Foreground\" Value=\"#FF042271\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"Padding\" Value=\"3\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type GridViewColumnHeader}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundOver\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundOver_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0.65\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundOver_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"0.84\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgoundPressed_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0.65\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgoundPressed_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                    </ControlTemplate.Resources>\n                    <Grid Margin=\"0,1,0,1\">\n                        <Grid>\n\n                            <Border x:Name=\"BackgroundNorm\" BorderThickness=\"1\" CornerRadius=\"1.75\" Background=\"{DynamicResource NormalBrush}\" BorderBrush=\"{DynamicResource NormalBorderBrush}\"/>\n                            <Border x:Name=\"BackgroundNorm_highlight\" Margin=\"1\" BorderBrush=\"{DynamicResource NormalHighlightBrush}\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0.65\" />\n                            <Border x:Name=\"BackgroundOver\" BorderThickness=\"1\" CornerRadius=\"1.75\" Opacity=\"0\" Background=\"{DynamicResource MouseOverBrush}\" BorderBrush=\"{DynamicResource MouseOverBorderBrush}\"/>\n                            <Border x:Name=\"BackgroundOver_Highlight\" Margin=\"1\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0\" BorderBrush=\"{DynamicResource MouseOverHighlightBrush}\"/>\n                            <Border x:Name=\"BackgroundPressed\" BorderThickness=\"1\" CornerRadius=\"1.75\" Opacity=\"0\" Background=\"{DynamicResource PressedBrush}\" BorderBrush=\"{DynamicResource PressedBorderBrush}\"/>\n                            <Border x:Name=\"BackgoundPressed_Highlight\" Margin=\"1\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0\" BorderBrush=\"{DynamicResource PressedHighlightBrush}\"/>\n                            <ContentPresenter VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" RecognizesAccessKey=\"True\" Margin=\"2,2,2,2\" />\n                        </Grid>\n                        <Canvas>\n                            <Thumb x:Name=\"PART_HeaderGripper\" Style=\"{StaticResource GridViewColumnHeaderGripper}\" HorizontalAlignment=\"Stretch\" />\n                        </Canvas>\n                    </Grid>\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsMouseOver\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOff}\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOn}\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"Height\" Value=\"Auto\">\n                            <Setter Property=\"MinHeight\" Value=\"20\" />\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}\" />\n                        </Trigger>\n                        <Trigger Property=\"Role\" Value=\"Padding\">\n                            <Setter TargetName=\"PART_HeaderGripper\" Property=\"Visibility\" Value=\"Collapsed\" />\n                        </Trigger>\n                        <Trigger Property=\"Role\" Value=\"Floating\">\n                            <Setter TargetName=\"PART_HeaderGripper\" Property=\"Visibility\" Value=\"Collapsed\" />\n                            <Setter Property=\"Background\" Value=\"Yellow\" />\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"{x:Type ToggleButton}\">\n        <Setter Property=\"FocusVisualStyle\" Value=\"{StaticResource NuclearButtonFocusVisual}\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource OutsideFontColor}\" />\n        <Setter Property=\"HorizontalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"VerticalContentAlignment\" Value=\"Center\" />\n        <Setter Property=\"Padding\" Value=\"1\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ToggleButton}\">\n                    <ControlTemplate.Resources>\n                        <Storyboard x:Key=\"HoverOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundOver\" Storyboard.TargetProperty=\"Opacity\" To=\"1\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundOver_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0.65\" />\n\n                        </Storyboard>\n                        <Storyboard x:Key=\"HoverOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundOver\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundOver_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgroundChecked\" Storyboard.TargetProperty=\"Opacity\" To=\"0.84\" />\n                            <DoubleAnimation Duration=\"00:00:00.1000000\" Storyboard.TargetName=\"BackgoundChecked_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0.65\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"CheckedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgroundChecked\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.4000000\" Storyboard.TargetName=\"BackgoundChecked_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n\n                        <Storyboard x:Key=\"PressedOn\">\n                            <DoubleAnimation Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"0.84\" />\n                            <DoubleAnimation Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"BackgoundPressed_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0.65\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"PressedOff\">\n                            <DoubleAnimation Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"BackgroundPressed\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                            <DoubleAnimation Duration=\"00:00:00.0010000\" Storyboard.TargetName=\"BackgoundPressed_Highlight\" Storyboard.TargetProperty=\"Opacity\" To=\"0\" />\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOn\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.1000000\" Value=\"1\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n                        <Storyboard x:Key=\"FocusedOff\">\n                            <DoubleAnimationUsingKeyFrames BeginTime=\"00:00:00\" Storyboard.TargetName=\"FocusVisualElement\" Storyboard.TargetProperty=\"(UIElement.Opacity)\">\n                                <SplineDoubleKeyFrame KeyTime=\"00:00:00.3000000\" Value=\"0\" />\n                            </DoubleAnimationUsingKeyFrames>\n                        </Storyboard>\n\n                    </ControlTemplate.Resources>\n                    <Grid x:Name=\"grid1\">\n                        <Border x:Name=\"BackgroundNorm\" BorderThickness=\"1\" CornerRadius=\"1.75\" Background=\"{DynamicResource NormalBrush}\" BorderBrush=\"{DynamicResource NormalBorderBrush}\"/>\n                        <Border x:Name=\"BackgroundNorm_highlight\" Margin=\"1\" BorderBrush=\"{DynamicResource NormalHighlightBrush}\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0.65\" />\n                        <Border x:Name=\"BackgroundChecked\" BorderThickness=\"1\" CornerRadius=\"1.75\" Opacity=\"0\" Background=\"{DynamicResource PressedBrush}\" BorderBrush=\"{DynamicResource PressedBorderBrush}\"/>\n                        <Border x:Name=\"BackgoundChecked_Highlight\" Margin=\"1\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0\" BorderBrush=\"{DynamicResource PressedHighlightBrush}\"/>\n                        <Border x:Name=\"BackgroundOver\" BorderThickness=\"1\" CornerRadius=\"1.75\" Opacity=\"0\" Background=\"{DynamicResource MouseOverBrush}\" BorderBrush=\"{DynamicResource MouseOverBorderBrush}\"/>\n                        <Border x:Name=\"BackgroundOver_Highlight\" Margin=\"1\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0\" BorderBrush=\"{DynamicResource MouseOverHighlightBrush}\"/>\n                        <Border x:Name=\"BackgroundPressed\" BorderThickness=\"1\" CornerRadius=\"1.75\" Opacity=\"0\" Background=\"{DynamicResource PressedBrush}\" BorderBrush=\"{DynamicResource PressedBorderBrush}\"/>\n                        <Border x:Name=\"BackgoundPressed_Highlight\" Margin=\"1\" BorderThickness=\"1,0,1,1\" CornerRadius=\"1\" Opacity=\"0\" BorderBrush=\"{DynamicResource PressedHighlightBrush}\"/>\n                        <Border x:Name=\"DisabledVisualElement\" IsHitTestVisible=\"false\" Background=\"{DynamicResource DisabledBackgroundBrush}\" BorderBrush=\"{DynamicResource DisabledBorderBrush}\" BorderThickness=\"1\" Opacity=\"0\" />\n                        <ContentPresenter x:Name=\"contentPresenter\" Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" Margin=\"{TemplateBinding Padding}\" />\n                        <TextBlock Panel.ZIndex=\"1\" x:Name=\"DisabledOverlay\" Text=\"{TemplateBinding Content}\" Foreground=\"#FF8E96A2\" HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\" VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\" Margin=\"{TemplateBinding Padding}\" Visibility=\"Collapsed\" />\n                        <Border x:Name=\"FocusVisualElement\" Margin=\"-1\" Grid.RowSpan=\"2\" BorderBrush=\"{DynamicResource FocusBrush}\" BorderThickness=\"1\" CornerRadius=\"2.75\" IsHitTestVisible=\"false\" Opacity=\"0\" />\n                    </Grid>\n\n                    <ControlTemplate.Triggers>\n                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOff}\" x:Name=\"HoverOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource HoverOn}\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsPressed\" Value=\"True\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOff}\" x:Name=\"PressedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource PressedOn}\" x:Name=\"PressedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsKeyboardFocused\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOff}\" x:Name=\"FocusedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource FocusedOn}\" x:Name=\"FocusedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n                        </Trigger>\n                        <Trigger Property=\"IsChecked\" Value=\"true\">\n                            <Trigger.ExitActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOff}\" x:Name=\"CheckedOff_BeginStoryboard\" />\n                            </Trigger.ExitActions>\n                            <Trigger.EnterActions>\n                                <BeginStoryboard Storyboard=\"{StaticResource CheckedOn}\" x:Name=\"CheckedOn_BeginStoryboard\" />\n                            </Trigger.EnterActions>\n\n                        </Trigger>\n                        <Trigger Property=\"IsEnabled\" Value=\"false\">\n                            <Setter Property=\"Foreground\" Value=\"#ADADAD\" />\n                            <Setter Property=\"Visibility\" TargetName=\"DisabledVisualElement\" Value=\"Visible\" />\n                            <Setter Property=\"Visibility\" TargetName=\"DisabledOverlay\" Value=\"Visible\" />\n                            <Setter Property=\"Visibility\" TargetName=\"contentPresenter\" Value=\"Collapsed\" />\n                            <Setter Property=\"Opacity\" TargetName=\"DisabledVisualElement\" Value=\"1\" />\n\n                        </Trigger>\n                    </ControlTemplate.Triggers>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <Style TargetType=\"ToolTip\">\n        <Setter Property=\"Background\" Value=\"#33000000\" />\n        <Setter Property=\"FontFamily\" Value=\"Trebuchet MS\" />\n        <Setter Property=\"FontSize\" Value=\"12\" />\n        <Setter Property=\"BorderThickness\" Value=\"1\" />\n        <Setter Property=\"Padding\" Value=\"3,0,3,0\" />\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"ToolTip\">\n                    <Border x:Name=\"Root\" Background=\"{TemplateBinding Background}\" BorderBrush=\"#19000000\" CornerRadius=\"3\">\n                        <Border Margin=\"-3,-3,3,3\" BorderBrush=\"#FF767676\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"3\" Padding=\"4\">\n                            <Border.Resources>\n                                <Storyboard x:Key=\"Visible State\" />\n                                <Storyboard x:Key=\"Normal State\" />\n                            </Border.Resources>\n                            <Border.Background>\n                                <LinearGradientBrush EndPoint=\"0.5,1\" StartPoint=\"0.5,0\">\n                                    <GradientStop Color=\"#FFFFFFFF\" Offset=\"0.004\" />\n                                    <GradientStop Color=\"#FFCDDCF0\" Offset=\"1\" />\n                                </LinearGradientBrush>\n                            </Border.Background>\n                            <ContentPresenter Content=\"{TemplateBinding Content}\" ContentTemplate=\"{TemplateBinding ContentTemplate}\" Cursor=\"{TemplateBinding Cursor}\" Margin=\"{TemplateBinding Padding}\" />\n                        </Border>\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n</ResourceDictionary>\n"
  },
  {
    "path": "samples/Wpf.Transform/MainWindow.xaml",
    "content": "﻿<Window\n        xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        xmlns:d=\"http://schemas.microsoft.com/expression/blend/2008\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"d\" x:Class=\"Wpf.Transform.MainWindow\"\n        Title=\"Transformation Demo\" Height=\"701\" Width=\"995\" Loaded=\"WindowOnLoad\" Background=\"AliceBlue\" Icon=\"Assets/1312162799_transform_rotate.ico\">\n    <Grid>\n    \t<Grid.ColumnDefinitions>\n    \t\t<ColumnDefinition Width=\"0.017*\"/>\n    \t\t<ColumnDefinition Width=\"0.983*\"/>\n    \t</Grid.ColumnDefinitions>\n    \t<TextBlock Grid.Column=\"1\" Margin=\"8,8,8,0\" VerticalAlignment=\"Top\" Height=\"78\" Text=\"This demo shows you the current app settings and connection strings for the given build configuration. Try running the app with a different build configuration to see the changes.\" TextWrapping=\"Wrap\" FontSize=\"16\"/>\n    \t<Label Content=\"App Settings\" HorizontalAlignment=\"Left\" Margin=\"3,110.5,0,0\" VerticalAlignment=\"Top\" FontSize=\"18.667\" Grid.Column=\"1\" FontFamily=\"Segoe UI Semibold\" FontWeight=\"Bold\"/>\n    \t<Label Content=\"Connection strings\" HorizontalAlignment=\"Left\" Margin=\"2,274.398,0,0\" VerticalAlignment=\"Top\" FontSize=\"18.667\" Grid.Column=\"1\" FontFamily=\"Segoe UI Semibold\" FontWeight=\"Bold\"/>\n    \t<Border Grid.Column=\"1\" Height=\"118\" Margin=\"200,63.915,8,0\" VerticalAlignment=\"Top\" BorderBrush=\"Black\" BorderThickness=\"1\" >\n\t\t\n    \t\t<TextBlock x:Name=\"TextAppSettings\" TextWrapping=\"Wrap\" Text=\"App settings here\" ScrollViewer.HorizontalScrollBarVisibility=\"Visible\" FontFamily=\"Segoe\" FontSize=\"16\" Margin=\"7\"/>\n    \t</Border>\n    \t<Border Grid.Column=\"1\" Margin=\"200,203.813,8,304.187\" BorderBrush=\"Black\" BorderThickness=\"1\" d:LayoutOverrides=\"VerticalAlignment\" >\n    \t\t<TextBlock x:Name=\"TextConnectionStrings\" TextWrapping=\"Wrap\" Text=\"Connection strings here\" ScrollViewer.HorizontalScrollBarVisibility=\"Visible\" FontSize=\"16\" FontFamily=\"Segoe\" Margin=\"7,0,7,4\" Height=\"147\" VerticalAlignment=\"Bottom\"/>\n    \t</Border>\n    \t<Button Content=\"Close\" Grid.Column=\"1\" HorizontalAlignment=\"Right\" Margin=\"0,0,8,15.5\" VerticalAlignment=\"Bottom\" Width=\"75\" Click=\"ButtonCloseClick\" />\n    \t<Label Content=\"Config content\" HorizontalAlignment=\"Left\" Margin=\"2,0,0,154.873\" VerticalAlignment=\"Bottom\" FontSize=\"18.667\" Grid.Column=\"1\" FontFamily=\"Segoe UI Semibold\" FontWeight=\"Bold\" d:LayoutOverrides=\"VerticalAlignment\"/>\n    \t\n    \t<Border BorderBrush=\"Black\" BorderThickness=\"1\"  Grid.Column=\"1\" Margin=\"200,0,8,45.74\" Height=\"243.096\" VerticalAlignment=\"Bottom\">\n    \t\t<RichTextBox FontFamily=\"Segoe\" FontSize=\"16\" IsReadOnly=\"True\" Background=\"Transparent\" HorizontalScrollBarVisibility=\"Auto\" VerticalScrollBarVisibility=\"Auto\"\n\t\t\t\tBorderBrush=\"Transparent\" BorderThickness=\"0\">\n    \t\t\t<FlowDocument>\n    \t\t\t\t<Paragraph><Run Text=\"RichTextBox\" x:Name=\"TextConfigContents\"/></Paragraph>\n    \t\t\t</FlowDocument>\n    \t\t</RichTextBox>\n    \t\t\t<!-- <ScrollViewer Height=\"200.096\" Width=\"725.221\">\n    \t\t\t<TextBlock x:Name=\"TextConfigContents\" TextWrapping=\"Wrap\" FontFamily=\"Consolas\" FontSize=\"16\" Height=\"200.096\" Width=\"725.221\"><Run Text=\"Config content here\"/></TextBlock>  \t\n\t\t\t    </ScrollViewer>  \t -->\n\t\t\t\t\n\t\t</Border>\n        \n    </Grid>\n</Window>\n"
  },
  {
    "path": "samples/Wpf.Transform/MainWindow.xaml.cs",
    "content": "﻿namespace Wpf.Transform {\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text;\n    using System.Windows;\n    using System.Windows.Controls;\n    using System.Windows.Data;\n    using System.Windows.Documents;\n    using System.Windows.Input;\n    using System.Windows.Media;\n    using System.Windows.Media.Imaging;\n    using System.Windows.Navigation;\n    using System.Windows.Shapes;\n\n    /// <summary>\n    /// Interaction logic for MainWindow.xaml\n    /// </summary>\n    public partial class MainWindow : Window {\n        public MainWindow() {\n            InitializeComponent();\n        }\n        private TransformModel Model { get; set; }\n\n        private void WindowOnLoad(object sender, RoutedEventArgs e) {\n            this.ApplyTransformModel(TransformModel.BuildFromCurrent());\n        }\n\n        private void ApplyTransformModel(TransformModel transformModel) {\n            if (transformModel == null) { throw new ArgumentNullException(\"transformModel\"); }\n\n            this.Model = transformModel;\n            this.TextAppSettings.Text = this.BuildStringFrom(this.Model.AppSettings);\n            this.TextConnectionStrings.Text = this.BuildStringFrom(this.Model.ConnectionStrings);\n            this.TextConfigContents.Text = this.Model.ConfigContents;\n            this.InvalidateVisual();\n        }\n\n        private string BuildStringFrom(IDictionary<string, string> dictionary) {\n            if (dictionary == null) { throw new ArgumentNullException(\"dictionary\"); }\n\n            StringBuilder sb = new StringBuilder();\n            foreach (string key in dictionary.Keys) {\n                sb.AppendFormat(\"{0} : {1}{2}\",key,dictionary[key],Environment.NewLine);\n            }\n\n            return sb.ToString();\n        }\n\n        private void ButtonCloseClick(object sender, RoutedEventArgs e) {\n            this.Close();\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Wpf.Transform/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Resources;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\nusing System.Windows;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"Wpf.Transform\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"Microsoft\")]\n[assembly: AssemblyProduct(\"Wpf.Transform\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n//In order to begin building localizable applications, set \n//<UICulture>CultureYouAreCodingWith</UICulture> in your .csproj file\n//inside a <PropertyGroup>.  For example, if you are using US english\n//in your source files, set the <UICulture> to en-US.  Then uncomment\n//the NeutralResourceLanguage attribute below.  Update the \"en-US\" in\n//the line below to match the UICulture setting in the project file.\n\n//[assembly: NeutralResourcesLanguage(\"en-US\", UltimateResourceFallbackLocation.Satellite)]\n\n\n[assembly: ThemeInfo(\n    ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located\n    //(used if a resource is not found in the page, \n    // or application resource dictionaries)\n    ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located\n    //(used if a resource is not found in the page, \n    // app, or any theme specific resource dictionaries)\n)]\n\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers \n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "samples/Wpf.Transform/Properties/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.235\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Wpf.Transform.Properties {\n\n\n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"4.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n\n        private static global::System.Resources.ResourceManager resourceMan;\n\n        private static global::System.Globalization.CultureInfo resourceCulture;\n\n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n\n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if ((resourceMan == null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Wpf.Transform.Properties.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n\n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Wpf.Transform/Properties/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n</root>"
  },
  {
    "path": "samples/Wpf.Transform/Properties/Settings.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.235\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Wpf.Transform.Properties {\n\n\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator\", \"10.0.0.0\")]\n    internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {\n\n        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));\n\n        public static Settings Default {\n            get {\n                return defaultInstance;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Wpf.Transform/Properties/Settings.settings",
    "content": "﻿<?xml version='1.0' encoding='utf-8'?>\n<SettingsFile xmlns=\"uri:settings\" CurrentProfile=\"(Default)\">\n  <Profiles>\n    <Profile Name=\"(Default)\" />\n  </Profiles>\n  <Settings />\n</SettingsFile>"
  },
  {
    "path": "samples/Wpf.Transform/TransformModel.cs",
    "content": "﻿namespace Wpf.Transform {\n    using System;\n    using System.Collections.Generic;\n    using System.Linq;\n    using System.Text;\n    using System.Configuration;\n    using System.IO;\n\n    public class TransformModel {\n        public TransformModel() {\n            this.AppSettings = new Dictionary<string, string>();\n            this.ConnectionStrings = new Dictionary<string, string>();\n        }\n\n        public IDictionary<string, string> AppSettings { get; set; }\n        public IDictionary<string, string> ConnectionStrings { get; set; }\n        public string ConfigContents { get; set; }\n\n        public static TransformModel BuildFromCurrent() {\n            TransformModel tm = new TransformModel();\n            foreach (string key in ConfigurationManager.AppSettings.AllKeys) {\n                tm.AppSettings.Add(key, ConfigurationManager.AppSettings[key]);\n            }\n\n            foreach (ConnectionStringSettings cn in ConfigurationManager.ConnectionStrings) {\n                tm.ConnectionStrings.Add(cn.Name, cn.ConnectionString);\n            }\n\n            Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);\n\n            tm.ConfigContents = File.ReadAllText(config.FilePath);\n\n            return tm;\n        }\n    }\n}\n"
  },
  {
    "path": "samples/Wpf.Transform/Wpf.Transform.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">x86</Platform>\n    <ProductVersion>8.0.30703</ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{F5E1A5EA-4544-49B2-AE4A-8590D96E6537}</ProjectGuid>\n    <OutputType>WinExe</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Wpf.Transform</RootNamespace>\n    <AssemblyName>Wpf.Transform</AssemblyName>\n    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>\n    <TargetFrameworkProfile>Client</TargetFrameworkProfile>\n    <FileAlignment>512</FileAlignment>\n    <ProjectTypeGuids>{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <WarningLevel>4</WarningLevel>\n    <SccProjectName>\n    </SccProjectName>\n    <SccLocalPath>\n    </SccLocalPath>\n    <SccAuxPath>\n    </SccAuxPath>\n    <SccProvider>\n    </SccProvider>\n    <Utf8Output>true</Utf8Output>\n    <ExpressionBlendVersion>4.0.20525.0</ExpressionBlendVersion>\n    <IsWebBootstrapper>false</IsWebBootstrapper>\n    <PublishUrl>\\\\SAYEDHA-W-6\\share\\publish\\01\\</PublishUrl>\n    <Install>true</Install>\n    <InstallFrom>Unc</InstallFrom>\n    <UpdateEnabled>true</UpdateEnabled>\n    <UpdateMode>Foreground</UpdateMode>\n    <UpdateInterval>7</UpdateInterval>\n    <UpdateIntervalUnits>Days</UpdateIntervalUnits>\n    <UpdatePeriodically>false</UpdatePeriodically>\n    <UpdateRequired>false</UpdateRequired>\n    <MapFileExtensions>true</MapFileExtensions>\n    <CreateWebPageOnPublish>true</CreateWebPageOnPublish>\n    <WebPage>publish.htm</WebPage>\n    <ApplicationRevision>31</ApplicationRevision>\n    <ApplicationVersion>1.0.0.%2a</ApplicationVersion>\n    <UseApplicationTrust>false</UseApplicationTrust>\n    <PublishWizardCompleted>true</PublishWizardCompleted>\n    <BootstrapperEnabled>true</BootstrapperEnabled>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|x86' \">\n    <PlatformTarget>x86</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|x86' \">\n    <PlatformTarget>x86</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SlowCheetahTargets Condition=\" '$(SlowCheetahTargets)'=='' \">$(LOCALAPPDATA)\\Microsoft\\MSBuild\\SlowCheetah\\v1\\SlowCheetah.Transforms.targets</SlowCheetahTargets>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ManifestCertificateThumbprint>41C6C93240F3848CCBADB04B3BCFB9EABE66E2E8</ManifestCertificateThumbprint>\n  </PropertyGroup>\n  <PropertyGroup>\n    <ManifestKeyFile>Wpf.Transform_TemporaryKey.pfx</ManifestKeyFile>\n  </PropertyGroup>\n  <PropertyGroup>\n    <GenerateManifests>true</GenerateManifests>\n  </PropertyGroup>\n  <PropertyGroup>\n    <SignManifests>false</SignManifests>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.configuration\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Xaml\">\n      <RequiredTargetFramework>4.0</RequiredTargetFramework>\n    </Reference>\n    <Reference Include=\"WindowsBase\" />\n    <Reference Include=\"PresentationCore\" />\n    <Reference Include=\"PresentationFramework\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ApplicationDefinition Include=\"App.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </ApplicationDefinition>\n    <Compile Include=\"TransformModel.cs\" />\n    <Page Include=\"Assets\\BureauBlue.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Page Include=\"MainWindow.xaml\">\n      <Generator>MSBuild:Compile</Generator>\n      <SubType>Designer</SubType>\n    </Page>\n    <Compile Include=\"App.xaml.cs\">\n      <DependentUpon>App.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"MainWindow.xaml.cs\">\n      <DependentUpon>MainWindow.xaml</DependentUpon>\n      <SubType>Code</SubType>\n    </Compile>\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\">\n      <SubType>Code</SubType>\n    </Compile>\n    <Compile Include=\"Properties\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Include=\"Properties\\Settings.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Settings.settings</DependentUpon>\n      <DesignTimeSharedInput>True</DesignTimeSharedInput>\n    </Compile>\n    <Resource Include=\"contacts.Release.xml\">\n      <DependentUpon>contacts.xml</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Resource>\n    <Resource Include=\"contacts.Debug.xml\">\n      <DependentUpon>contacts.xml</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Resource>\n    <Content Include=\"contacts.xml\">\n      <TransformOnBuild>true</TransformOnBuild>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n    </Content>\n    <EmbeddedResource Include=\"Properties\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <Content Include=\"..\\Linked-files\\connectionStrings.config\">\n      <Link>connectionStrings.config</Link>\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <TransformOnBuild>true</TransformOnBuild>\n    </Content>\n    <None Include=\"..\\Linked-files\\connectionStrings.Debug.config\">\n      <Link>connectionStrings.Debug.config</Link>\n      <DependentUpon>connectionStrings.config</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n    </None>\n    <None Include=\"..\\Linked-files\\connectionStrings.Release.config\">\n      <Link>connectionStrings.Release.config</Link>\n      <DependentUpon>connectionStrings.config</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n    </None>\n    <None Include=\"app.config\">\n      <SubType>Designer</SubType>\n      <TransformOnBuild>true</TransformOnBuild>\n    </None>\n    <None Include=\"app.Debug.config\">\n      <DependentUpon>app.config</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n    </None>\n    <None Include=\"app.Release.config\">\n      <DependentUpon>app.config</DependentUpon>\n      <IsTransformFile>True</IsTransformFile>\n    </None>\n    <None Include=\"Properties\\Settings.settings\">\n      <Generator>SettingsSingleFileGenerator</Generator>\n      <LastGenOutput>Settings.Designer.cs</LastGenOutput>\n    </None>\n    <AppDesigner Include=\"Properties\\\" />\n    <None Include=\"Wpf.Transform_TemporaryKey.pfx\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Resource Include=\"Assets\\1312162799_transform_rotate.ico\" />\n  </ItemGroup>\n  <ItemGroup>\n    <BootstrapperPackage Include=\".NETFramework,Version=v4.0,Profile=Client\">\n      <Visible>False</Visible>\n      <ProductName>Microsoft .NET Framework 4 Client Profile %28x86 and x64%29</ProductName>\n      <Install>true</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Net.Client.3.5\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>\n      <Install>false</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Net.Framework.3.5.SP1\">\n      <Visible>False</Visible>\n      <ProductName>.NET Framework 3.5 SP1</ProductName>\n      <Install>false</Install>\n    </BootstrapperPackage>\n    <BootstrapperPackage Include=\"Microsoft.Windows.Installer.3.1\">\n      <Visible>False</Visible>\n      <ProductName>Windows Installer 3.1</ProductName>\n      <Install>true</Install>\n    </BootstrapperPackage>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(SlowCheetahTargets)\" Condition=\"Exists('$(SlowCheetahTargets)')\" />\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>"
  },
  {
    "path": "samples/Wpf.Transform/app.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.comfig examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  \n  <appSettings>\n    <add key=\"appName\" value=\"WPF Demo-Debug\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(key)\"/>\n    <add key=\"url\" value=\"http://localhost:8080/\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(key)\"/>\n    <add key=\"email\" value=\"debug@contoso.com\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(key)\"/>\n  </appSettings>\n  \n</configuration>"
  },
  {
    "path": "samples/Wpf.Transform/app.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.comfig examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  \n  <appSettings>\n    <add key=\"appName\" value=\"WPF Demo-Release\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(key)\"/>\n    <add key=\"url\" value=\"http://contoso.com/\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(key)\"/>\n    <add key=\"email\" value=\"release@contoso.com\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(key)\"/>\n  </appSettings>\n\n</configuration>"
  },
  {
    "path": "samples/Wpf.Transform/app.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"appName\" value=\"WPF Demo-Debug-default\"/>\n    <add key=\"url\" value=\"http://localhost:8080/Default/\"/>\n    <add key=\"email\" value=\"demo-default@contoso.com\"/>\n  </appSettings>\n  \n  <connectionStrings configSource=\"connectionStrings.config\" />\n  \n</configuration>"
  },
  {
    "path": "samples/Wpf.Transform/connectionStrings.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<connectionStrings xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  \n    <add name=\"RecordsDb\" connectionString=\".\\SQLExpress;Initial Catalog=RecordsDb-DEBUG;Integrated Security=true\"\n         xdt:Transform=\"Replace\" xdt:Locator=\"Match(name)\"/>\n  \n</connectionStrings>"
  },
  {
    "path": "samples/Wpf.Transform/connectionStrings.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<connectionStrings xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  \n  <add name=\"RecordsDb\" connectionString=\"db.contoso.com;Initial Catalog=RecordsDb-RELEASE;Integrated Security=true\"\n         xdt:Transform=\"Replace\" xdt:Locator=\"Match(name)\"/>\n  <add name=\"InventoryDb\" connectionString=\"db.constos.com;Initial Catalog=InventoryDb-RELEASE;Integrated Security=true\"\n       xdt:Transform=\"Insert\" xdt:Locator=\"Match(name)\" />\n  \n</connectionStrings>"
  },
  {
    "path": "samples/Wpf.Transform/connectionStrings.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<connectionStrings>\n  <clear />\n  <add name=\"RecordsDb\" connectionString=\".\\SQLExpress;Initial Catalog=RecordsDb-Default;Integrated Security=true\"/>\n</connectionStrings>"
  },
  {
    "path": "samples/Wpf.Transform/contacts.Debug.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<contacts xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <default>\n    <add firstName=\"one\" value=\"one-DEBUG\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(firstName)\"/>\n    <add firstName=\"two\" value=\"two-DEBUG\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(firstName)\"/>\n    <add firstName=\"three\" value=\"three-DEBUG\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(firstName)\"/>\n  </default>\n</contacts>"
  },
  {
    "path": "samples/Wpf.Transform/contacts.Release.xml",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<contacts xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <default>\n    <add firstName=\"one\" value=\"one-RELEASE\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(firstName)\"/>\n    <add firstName=\"two\" value=\"two-RELEASE\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(firstName)\"/>\n    <add firstName=\"three\" value=\"three-RELEASE\" xdt:Transform=\"Replace\" xdt:Locator=\"Match(firstName)\"/>\n  </default>\n</contacts>"
  },
  {
    "path": "samples/Wpf.Transform/contacts.xml",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<contacts>\n  <default>\n    <add firstName=\"one\" value=\"one-default\" />\n    <add firstName=\"two\" value=\"two-default\" />\n    <add firstName=\"three\" value=\"three-default\" />\n  </default>\n</contacts>"
  },
  {
    "path": "src/.editorconfig",
    "content": ""
  },
  {
    "path": "src/AssemblyInfo.cs",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nusing System.Runtime.InteropServices;\n\n[assembly: DefaultDllImportSearchPaths(DllImportSearchPath.SafeDirectories)]\n"
  },
  {
    "path": "src/AssemblyInfo.vb",
    "content": "' Copyright (c) Microsoft Corporation. All rights reserved.\n' Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nImports System.Runtime.InteropServices\n\n<Assembly: DefaultDllImportSearchPaths(DllImportSearchPath.SafeDirectories)>\n"
  },
  {
    "path": "src/Directory.Build.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <!-- Include and reference README in nuget package, if a README is in the project directory. -->\n  <PropertyGroup>\n    <PackageReadmeFile Condition=\"Exists('README.md')\">README.md</PackageReadmeFile>\n  </PropertyGroup>\n  <ItemGroup>\n    <None Condition=\"Exists('README.md')\" Include=\"README.md\" Pack=\"true\" PackagePath=\"\" />\n  </ItemGroup>\n\n  <Import Project=\"$([MSBuild]::GetPathOfFileAbove($(MSBuildThisFile), $(MSBuildThisFileDirectory)..))\" />\n</Project>\n"
  },
  {
    "path": "src/Directory.Build.targets",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <ItemGroup>\n    <Compile Include=\"$(MSBuildThisFileDirectory)AssemblyInfo.cs\" Condition=\" '$(Language)'=='C#' \" />\n    <Compile Include=\"$(MSBuildThisFileDirectory)AssemblyInfo.vb\" Condition=\" '$(Language)'=='VB' \" />\n  </ItemGroup>\n\n  <Import Project=\"$([MSBuild]::GetPathOfFileAbove($(MSBuildThisFile), $(MSBuildThisFileDirectory)..))\" />\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.App.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n***********************************************************************************************\nSlowCheetah.App.targets\nLogic for App Project transformations\nCopyright (C) Microsoft Corporation. All rights reserved.\nCopyright (C) Sayed Ibrahim Hashimi, Chuck England 2011-2013. All rights reserved.\n***********************************************************************************************\n-->\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <PropertyGroup>\n    <!-- If the project is not web, it is an app-type project -->\n    <WapProjectTypeGuid>349c5851-65df-11da-9384-00065b846f21</WapProjectTypeGuid>\n    <ScIsApp Condition=\"'$(ScIsApp)' == '' and '$(ScIsWap)' == true\">false</ScIsApp>\n    <ScIsApp Condition=\"'$(ScIsApp)' == ''\">true</ScIsApp>\n\n    <!-- The path for the intermediate app.config file generated by SlowCheetah -->\n    <ScIntermediateAppConfig Condition=\"'$(ScIntermediateAppConfig)' == ''\">$(IntermediateOutputPath)$(MSBuildProjectFile)-sc.App.config</ScIntermediateAppConfig>\n\n    <!-- Name of the application configuration file -->\n    <ScAppConfigName Condition=\"'$(ScAppConfigName)' == ''\">app.config</ScAppConfigName>\n  </PropertyGroup>\n\n  <Target Name=\"ScCollectAppFiles\" DependsOnTargets=\"ScCollectTransformFiles\" BeforeTargets=\"ScApplyTransforms\">\n\n    <Message Text=\"SlowCheetah: Collecting App files\" Importance=\"low\"/>\n\n    <PropertyGroup>\n      <_AppConfigFullPath>@(AppConfigWithTargetPath->'%(RootDir)%(Directory)%(Filename)%(Extension)')</_AppConfigFullPath>\n    </PropertyGroup>\n\n    <ItemGroup>\n      <!-- Remove app.config transforms and execute them separately -->\n      <ScAppConfigToTransform Include=\"@(ScFilesToTransform)\" Condition=\"'%(Filename)%(Extension)'=='$(ScAppConfigName)'\"/>\n      <ScFilesToTransform Remove=\"@(ScFilesToTransform)\" Condition=\"'%(Filename)%(Extension)'=='$(ScAppConfigName)'\"/>\n    </ItemGroup>\n\n    <PropertyGroup>\n      <!-- Determine if an app.config file has a transform -->\n      <_ScHasAppConfigTransform>false</_ScHasAppConfigTransform>\n      <!-- If there is a transform for the current build configuration -->\n      <_ScHasAppConfigConfigurationTransform Condition=\"Exists('@(ScAppConfigToTransform->'%(RelativeDir)%(Filename).$(Configuration)%(Extension)')')\">true</_ScHasAppConfigConfigurationTransform>\n      <!-- There is a transform for the current publish profile -->\n      <_ScHasAppConfigPublishProfileTransform Condition=\" Exists('@(ScAppConfigToTransform->'%(RelativeDir)%(Filename).$(PublishProfile)%(Extension)')') \">true</_ScHasAppConfigPublishProfileTransform>\n      <!-- If the configuration and the publish profile are the same, only one transformation is needed -->\n      <_ScHasAppConfigPublishProfileTransform Condition=\" '$(Configuration)'=='$(PublishProfile)' \">false</_ScHasAppConfigPublishProfileTransform>\n      <!-- If the file has either of the transformations -->\n      <_ScHasAppConfigTransform Condition=\" '$(_ScHasAppConfigConfigurationTransform)'=='true' \">true</_ScHasAppConfigTransform>\n      <_ScHasAppConfigTransform Condition=\" '$(_ScHasAppConfigPublishProfileTransform)'=='true' \">true</_ScHasAppConfigTransform>\n    </PropertyGroup>\n\n    <!-- The file may be transformed multiple times, so copy it to intermediate path and transform from there -->\n    <Copy SourceFiles=\"$(AppConfig)\" DestinationFiles=\"$(ScIntermediateAppConfig)\"/>\n\n  </Target>\n\n  <Target Name=\"ScTransformAppConfig\" DependsOnTargets=\"ScCollectAppFiles\" BeforeTargets=\"_CopyAppConfigFile\">\n\n    <Message Text=\"Applying app transformations: $(_ScHasAppConfigTransform)\" Importance=\"low\"/>\n\n    <!-- Specific transformations for the app.config file -->\n    <SlowCheetah.TransformTask Source=\"$(ScIntermediateAppConfig)\"\n                  Transform=\"@(ScAppConfigToTransform->'%(RelativeDir)%(Filename).$(Configuration)%(Extension)')\"\n                  Destination=\"$(ScIntermediateAppConfig)\"\n                  Condition=\"'$(_ScHasAppConfigConfigurationTransform)' == 'true'\"/>\n    <SlowCheetah.TransformTask Source=\"$(ScIntermediateAppConfig)\"\n                    Transform=\"@(ScAppConfigToTransform->'%(RelativeDir)%(Filename).$(PublishProfile)%(Extension)')\"\n                    Destination=\"$(ScIntermediateAppConfig)\"\n                    Condition=\"'$(_ScHasAppConfigPublishProfileTransform)'=='true'\"/>\n\n    <!-- Rewrite App.config build variables so the copy target gets it from new location -->\n    <PropertyGroup Condition=\"'$(_ScHasAppConfigTransform)' == 'true'\">\n      <AppConfig>$(ScIntermediateAppConfig)</AppConfig>\n    </PropertyGroup>\n\n    <ItemGroup Condition=\"'$(_ScHasAppConfigTransform)' == 'true'\">\n      <AppConfigWithTargetPath Remove=\"@(AppConfigWithTargetPath)\" />\n      <AppConfigWithTargetPath Include=\"$(AppConfig)\">\n        <TargetPath>$(TargetFileName).config</TargetPath>\n      </AppConfigWithTargetPath>\n    </ItemGroup>\n\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.ClickOnce.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n***********************************************************************************************\nSlowCheetah.ClickOnce.targets\nAdds targets for ClickOnce publishing logic\nCopyright (C) Microsoft Corporation. All rights reserved.\nCopyright (C) Sayed Ibrahim Hashimi, Chuck England 2011-2013. All rights reserved.\n***********************************************************************************************\n-->\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <PropertyGroup Condition=\"'$(ScIsApp)' == true\">\n    <BuildDependsOn>\n      $(BuildDependsOn);\n      ScReplaceAppConfigItem;\n    </BuildDependsOn>\n  </PropertyGroup>\n\n  <Target Name=\"ScReplaceAppConfigItem\" BeforeTargets=\"_DeploymentComputeClickOnceManifestInfo;BuiltProjectOutputGroup\" DependsOnTargets=\"ScTransformAppConfig\"/>\n\n  <Target Name=\"SlowCheetah_ClickOnceLooseFileUpdate\" AfterTargets=\"_DeploymentComputeClickOnceManifestInfo\" DependsOnTargets=\"ScCollectAppFiles\">\n\n    <ItemGroup>\n      <!-- For non app.config files which are being transformed we need to remove the original item and replace it with the transformed one -->\n      <_DeploymentManifestFiles Remove=\"%(ScFilesToTransform.Identity)\" />\n\n      <_DeploymentManifestFiles Include=\"@(ScFilesToTransform->'%(DestinationFile)')\"/>\n    </ItemGroup>\n\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.SetupProject.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n***********************************************************************************************\nSlowCheetah.SetupProject.targets\nLogic for Setup Project transformations\nCopyright (C) Microsoft Corporation. All rights reserved.\nCopyright (C) Sayed Ibrahim Hashimi, Chuck England 2011-2013. All rights reserved.\n***********************************************************************************************\n-->\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <PropertyGroup>\n    <ScEnableSetupProjects Condition=\" '$(ScEnableSetupProjects)'=='' \">true</ScEnableSetupProjects>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\" '$(ScEnableSetupProjects)'=='true'\">\n    <AddAppConfigToBuildOutputs>false</AddAppConfigToBuildOutputs>\n\n    <BuiltProjectOutputGroupDependsOn>\n      $(BuiltProjectOutputGroupDependsOn);\n      ScAfterBuiltProjectOutputGroup;\n    </BuiltProjectOutputGroupDependsOn>\n\n    <!-- Execute after trasnformations -->\n    <ScAfterBuiltProjectOutputGroupDependsOn>\n      ScApplyTransforms;\n    </ScAfterBuiltProjectOutputGroupDependsOn>\n\n    <!-- If the project is an app, also depends on the app config transformation -->\n    <ScAfterBuiltProjectOutputGroupDependsOn Condition=\" '$(ScIsApp)'=='true'\">\n      $(AfterBuiltProjectOutputGroupDependsOn);\n      ScTransformAppConfig;\n    </ScAfterBuiltProjectOutputGroupDependsOn>\n  </PropertyGroup>\n\n  <Target Name=\"ScAfterBuiltProjectOutputGroup\" DependsOnTargets=\"$(ScAfterBuiltProjectOutputGroupDependsOn)\">\n\n    <ItemGroup>\n      <_TmpAppConfig Include=\"@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')\" />\n    </ItemGroup>\n\n    <!-- \n      We need to get the full path to the files included in the Identiy metadata.\n      This is required for Worker Roles. The target CopyWorkerRoleFiles attempts to copy but\n      does not use the FullPath so it will not locate the files otherwise.\n    -->\n    <ItemGroup>\n      <ScFilesToTransform>\n        <FullPathToItem Condition=\" '%(Link)'=='' \">$([System.IO.Path]::GetFullPath( $(IntermediateOutputPath)%(RelativeDir)%(Filename)%(Extension) ))</FullPathToItem>\n        <FullPathToItem Condition=\" '%(Link)'!='' \">$([System.IO.Path]::GetFullPath( $(IntermediateOutputPath)%(Link) ))</FullPathToItem>\n      </ScFilesToTransform>\n    </ItemGroup>\n\n    <ItemGroup>\n      <BuiltProjectOutputGroupOutput Include=\"@(_TmpAppConfig->'%(FullPath)')\">\n        <!-- For compatibility with 2.0 -->\n        <OriginalItemSpec>$(AppConfig)</OriginalItemSpec>\n      </BuiltProjectOutputGroupOutput>\n\n      <!-- Add the correct files to the project output group -->\n      <BuiltProjectOutputGroupOutput Include=\"@(ScFilesToTransform->'%(FullPathToItem)')\"\n                                     Condition=\" '%(ScFilesToTransform.Link)'==''\">\n        <OriginalItemSpec>@(ScFilesToTransform->'$(IntermediateOutputPath)%(RelativeDir)%(Filename)%(Extension)')</OriginalItemSpec>\n        <TargetPath>@(ScFilesToTransform->'%(RelativeDir)%(Filename)%(Extension)')</TargetPath>\n      </BuiltProjectOutputGroupOutput>\n\n      <BuiltProjectOutputGroupOutput Include=\"@(ScFilesToTransform->'%(FullPathToItem)')\"\n                                     Condition=\" '%(ScFilesToTransform.Link)'!=''\">\n        <OriginalItemSpec>@(ScFilesToTransform->'$(IntermediateOutputPath)%(Link)')</OriginalItemSpec>\n        <TargetPath>@(ScFilesToTransform->'%(Link)')</TargetPath>\n      </BuiltProjectOutputGroupOutput>\n    </ItemGroup>\n\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.Web.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n***********************************************************************************************\nSlowCheetah.Web.targets\nLogic for Web Project transformations\nCopyright (C) Microsoft Corporation. All rights reserved.\nCopyright (C) Sayed Ibrahim Hashimi, Chuck England 2011-2013. All rights reserved.\n***********************************************************************************************\n-->\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <PropertyGroup>\n    <!-- Determines if the project is web -->\n    <WapProjectTypeGuid>349c5851-65df-11da-9384-00065b846f21</WapProjectTypeGuid>\n    <ScIsWap Condition=\"'$(ScIsWap)' == '' and '$(WapProjectTypeGuid)' != '' and '$(ProjectTypeGuids)' != ''\">$(ProjectTypeGuids.ToLower().Contains($(WapProjectTypeGuid)))</ScIsWap>\n    <ScIsWap Condition=\"'$(ScIsWap)' == ''\">false</ScIsWap>\n  </PropertyGroup>\n\n  <PropertyGroup Condition=\"'$(ScIsWap)' == 'true'\">\n    <!-- For web projects, web.config is considered the app config file -->\n    <ScAppConfigName>web.config</ScAppConfigName>\n\n    <OnAfterPipelinePreDeployCopyAllFilesToOneFolder>\n      $(OnAfterPipelinePreDeployCopyAllFilesToOneFolder);\n      ScApplyWebTransforms;\n    </OnAfterPipelinePreDeployCopyAllFilesToOneFolder>\n\n    <CopyAllFilesToSingleFolderForMsdeploy>\n      $(CopyAllFilesToSingleFolderForMsdeploy);\n      ScApplyWebTransforms;\n    </CopyAllFilesToSingleFolderForMsdeploy>\n\n    <!-- For VS2012 -->\n    <PipelineCopyAllFilesToOneFolderForMsdeployDependsOn>\n      $(PipelineCopyAllFilesToOneFolderForMsdeployDependsOn);\n      ScApplyWebTransforms;\n    </PipelineCopyAllFilesToOneFolderForMsdeployDependsOn>\n\n    <!-- Required for File System -->\n    <PipelinePreDeployCopyAllFilesToOneFolderDependsOn>\n      $(PipelinePreDeployCopyAllFilesToOneFolderDependsOn);\n      ScApplyWebTransforms;\n    </PipelinePreDeployCopyAllFilesToOneFolderDependsOn>\n\n    <!-- required for FS support from the VS publish dialog -->\n    <OnAfterCopyAllFilesToSingleFolderForPackage>\n      $(OnAfterCopyAllFilesToSingleFolderForPackage);\n      ScApplyWebTransforms;\n    </OnAfterCopyAllFilesToSingleFolderForPackage>\n  </PropertyGroup>\n\n  <Target Name=\"ScCollectWebFiles\" DependsOnTargets=\"ScCollectTransformFiles\" BeforeTargets=\"ScApplyWebTransforms\">\n\n    <Message Text=\"SlowCheetah: Collecting Web files: $(ScIsWap)\" Importance=\"low\"/>\n\n    <!-- Get the name of the publish profile -->\n    <ItemGroup>\n      <ScWapPubProfileFullPath Include=\"$(WebPublishProfileFile)\"/>\n    </ItemGroup>\n\n    <PropertyGroup>\n      <ScPubProfile Condition=\"'$(ScPubProfile)' == '' and '@(ScWapPubProfileFullPath)' != ''\">%(ScWapPubProfileFullPath.Filename)</ScPubProfile>\n    </PropertyGroup>\n\n    <ItemGroup>\n      <!-- Do not transform the web.config file -->\n      <ScFilesToTransform Remove=\"@(ScFilesToTransform)\" Condition=\"'%(Filename)%(Extension)' == 'web.config'\"/>\n\n      <!-- The output for the transformation should be the temporary package directory -->\n      <ScFilesToTransform>\n        <PublishDestinationFile>$(_PackageTempDir)\\%(RelativeDir)%(Filename)%(Extension)</PublishDestinationFile>\n        <PublishDestinationFile Condition=\"'%(Link)' != ''\">$(_PackageTempDir)\\%(Link)</PublishDestinationFile>\n        <PublishTransformFile>%(RelativeDir)%(Filename).$(ScPubProfile)%(Extension)</PublishTransformFile>\n      </ScFilesToTransform>\n    </ItemGroup>\n\n  </Target>\n\n  <Target Name=\"ScApplyWebTransforms\" DependsOnTargets=\"ScApplyTransforms\">\n\n    <Message Text=\"SlowCheetah: Applying Web transforms for publishing: $(ScPubProfile)\" Importance=\"low\"/>\n\n    <!-- Get the directories that must be created -->\n    <ItemGroup>\n      <_ScPublishDirsToCreate Include=\"@(ScFilesToTransform -> '%(PublishDestinationFile)')\" Condition=\"Exists('%(TransformFile)') or Exists('%(PublishTransformFile)')\"/>\n    </ItemGroup>\n\n    <MakeDir Directories=\"@(_ScPublishDirsToCreate->'%(RelativeDir)')\" Condition=\" !Exists('%(RelativeDir)') \" />\n\n    <SlowCheetah.TransformTask Source=\"@(ScFilesToTransform->'%(SourceFile)')\"\n                              Transform=\"%(TransformFile)\"\n                              Destination=\"%(PublishDestinationFile)\"\n                              Condition=\"Exists('%(TransformFile)')\"/>\n\n    <SlowCheetah.TransformTask Source=\"@(ScFilesToTransform->'%(PublishDestinationFile)')\"\n                              Transform=\"%(PublishTransformFile)\"\n                              Destination=\"%(PublishDestinationFile)\"\n                              Condition=\" Exists('%(PublishTransformFile)') and '$(ScPubProfile)'!='' and '$(ScPubProfile)' != '$(Configuration)'\"/>\n\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/Microsoft.VisualStudio.SlowCheetah.targets",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!--\n***********************************************************************************************\nSlowCheetah.targets\nWARNING:  DO NOT MODIFY this file, this file is added to your project automatically\n          through the SlowCheetah NuGet package. If you modify this file it may\n          get out of sync when you update the package at a later date.\nThis file contains the main logic for defining transformations on build.\nCopyright (C) Microsoft Corporation. All rights reserved.\nCopyright (C) Sayed Ibrahim Hashimi, Chuck England 2011-2013. All rights reserved.\n***********************************************************************************************\n-->\n<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <PropertyGroup>\n    <SlowCheetahTaskPath>$(MSBuildThisFileDirectory)..\\tools\\</SlowCheetahTaskPath>\n  </PropertyGroup>\n\n  <!--Main transformation task-->\n  <UsingTask TaskName=\"TransformTask\" AssemblyFile=\"$(SlowCheetahTaskPath)Microsoft.VisualStudio.SlowCheetah.dll\"/>\n\n  <ItemDefinitionGroup>\n    <!-- Default TransformOnBuild values for file types -->\n    <None>\n      <TransformOnBuild>false</TransformOnBuild>\n      <Link></Link>\n      <CopyToOutputDirectory></CopyToOutputDirectory>\n    </None>\n    <Content>\n      <TransformOnBuild>false</TransformOnBuild>\n      <Link></Link>\n      <CopyToOutputDirectory></CopyToOutputDirectory>\n    </Content>\n    <Resource>\n      <TransformOnBuild>false</TransformOnBuild>\n      <Link></Link>\n      <CopyToOutputDirectory></CopyToOutputDirectory>\n    </Resource>\n    <EmbeddedResource>\n      <TransformOnBuild>false</TransformOnBuild>\n      <Link></Link>\n      <CopyToOutputDirectory></CopyToOutputDirectory>\n    </EmbeddedResource>\n    <_NoneWithTargetPath>\n      <TransformOnBuild>false</TransformOnBuild>\n    </_NoneWithTargetPath>\n    <ContentWithTargetPath>\n      <TransformOnBuild>false</TransformOnBuild>\n    </ContentWithTargetPath>\n    <ScFilesToTransform>\n      <_BuildAction></_BuildAction>\n      <TargetPath></TargetPath>\n    </ScFilesToTransform>\n  </ItemDefinitionGroup>\n\n  <PropertyGroup>\n    <BuildDependsOn>\n      $(BuildDependsOn);\n      ScApplyTransforms;\n    </BuildDependsOn>\n\n    <!-- References .dll.config files in referenced projects -->\n    <ScAllowCopyReferencedConfig Condition=\" '$(ScAllowCopyReferencedConfig)'=='' \">true</ScAllowCopyReferencedConfig>\n    <AllowedReferenceRelatedFileExtensions Condition=\" '$(ScAllowCopyReferencedConfig)'=='true' \">\n      $(AllowedReferenceRelatedFileExtensions);\n      .dll.config;\n    </AllowedReferenceRelatedFileExtensions>\n  </PropertyGroup>\n\n  <Target Name=\"ScCollectTransformFiles\" BeforeTargets=\"ScApplyTransforms\" AfterTargets=\"AssignTargetPaths\">\n\n    <Message Text=\"SlowCheetah: Collecting Transform files\" Importance=\"low\"/>\n\n    <ItemGroup>\n      <ScFilesToTransform Include=\"@(_NoneWithTargetPath)\" Condition=\"'%(TransformOnBuild)' == 'true'\">\n        <_BuildAction>None</_BuildAction>\n      </ScFilesToTransform>\n\n      <ScFilesToTransform Include=\"@(ContentWithTargetPath)\" Condition=\"'%(TransformOnBuild)' == 'true'\">\n        <_BuildAction>Content</_BuildAction>\n      </ScFilesToTransform>\n\n      <ScFilesToTransform Include=\"@(Resource)\" Condition=\"'%(TransformOnBuild)' == 'true'\">\n        <_BuildAction>Resource</_BuildAction>\n      </ScFilesToTransform>\n\n      <ScFilesToTransform Include=\"@(EmbeddedResource)\" Condition=\"'%(TransformOnBuild)' == 'true'\">\n        <_BuildAction>EmbeddedResource</_BuildAction>\n      </ScFilesToTransform>\n\n      <ScFilesToTransform>\n        <SourceFile>%(FullPath)</SourceFile>\n        <TransformFile>%(RelativeDir)%(Filename).$(Configuration)%(Extension)</TransformFile>\n        <DestinationFile>$(IntermediateOutputPath)%(RelativeDir)%(Filename)%(Extension)</DestinationFile>\n        <DestinationFile Condition=\"'%(Link)' != ''\">$(IntermediateOutputPath)%(Link)</DestinationFile>\n        <TargetPath Condition=\"'%(Link)' != '' and '%(TargetPath)' == ''\">%(Link)</TargetPath>\n        <TargetPath Condition=\"'%(TargetPath)' == ''\">%(RelativeDir)%(Filename)%(Extension)</TargetPath>\n        <CopyToOutputDirectory Condition=\" '$(CopyToOutputDirectory)' == '' \">PreserveNewest</CopyToOutputDirectory>\n      </ScFilesToTransform>\n    </ItemGroup>\n\n  </Target>\n\n  <Target Name=\"ScApplyTransforms\" BeforeTargets=\"GetCopyToOutputDirectoryItems\">\n\n    <Message Text=\"SlowCheetah: Applying Transforms\" Importance=\"low\"/>\n\n    <!-- Get the directories that must be created -->\n    <ItemGroup>\n      <_ScDirsToCreate Include=\"@(ScFilesToTransform -> '%(DestinationFile)')\" Condition=\"Exists('%(TransformFile)')\"/>\n    </ItemGroup>\n\n    <MakeDir Directories=\"@(_ScDirsToCreate->'%(RelativeDir)')\" Condition=\" !Exists('%(RelativeDir)') \" />\n\n    <SlowCheetah.TransformTask Source=\"@(ScFilesToTransform->'%(SourceFile)')\"\n                              Transform=\"%(TransformFile)\"\n                              Destination=\"%(DestinationFile)\"\n                              Condition=\"Exists('%(TransformFile)')\"/>\n\n    <ItemGroup>\n      <!--Gather each category of files to transform again since more may have been added between targets-->\n      <_ScNoneFilesToTransform Include=\"@(ScFilesToTransform)\" Condition=\"('%(_BuildAction)' == '' or '%(_BuildAction)' == 'None') and Exists('%(DestinationFile)')\" />\n      <_NoneWithTargetPath Remove=\"@(_ScNoneFilesToTransform)\" />\n      <_NoneWithTargetPath Include=\"@(_ScNoneFilesToTransform->'%(DestinationFile)')\" />\n\n      <_ScContentFilesToTransform Include=\"@(ScFilesToTransform)\" Condition=\"'%(_BuildAction)' == 'Content' and Exists('%(DestinationFile)')\" />\n      <ContentWithTargetPath Remove=\"@(_ScContentFilesToTransform)\" />\n      <ContentWithTargetPath Include=\"@(_ScContentFilesToTransform->'%(DestinationFile)')\" />\n\n      <_ScResourceFilesToTransform Include=\"@(ScFilesToTransform)\" Condition=\"'%(_BuildAction)' == 'Resource' and Exists('%(DestinationFile)')\" />\n      <Resource Remove=\"@(_ScResourceFilesToTransform)\" />\n      <Resource Include=\"@(_ScResourceFilesToTransform->'%(DestinationFile)')\" />\n\n      <_ScEmbeddedResourceFilesToTransform Include=\"@(ScFilesToTransform)\" Condition=\"'%(_BuildAction)' == 'EmbeddedResource' and Exists('%(DestinationFile)')\" />\n      <EmbeddedResource Remove=\"@(_ScEmbeddedResourceFilesToTransform)\"  />\n      <EmbeddedResource Include=\"@(_ScEmbeddedResourceFilesToTransform->'%(DestinationFile)')\" />\n\n      <_ScNoneFilesToTransform Remove=\"@(_ScNoneFilesToTransform)\" />\n      <_ScContentFilesToTransform Remove=\"@(_ScContentFilesToTransform)\" />\n      <_ScResourceFilesToTransform Remove=\"@(_ScResourceFilesToTransform)\" />\n      <_ScEmbeddedResourceFilesToTransform Remove=\"@(_ScEmbeddedResourceFilesToTransform)\" />\n    </ItemGroup>\n\n  </Target>\n\n  <!-- Import native SlowCheetah behaviour -->\n  <Import Project=\"$(MSBuildThisFileDirectory)Microsoft.VisualStudio.SlowCheetah.*.targets\" />\n\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/TransformTask.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    using Microsoft.Build.Framework;\n\n    /// <summary>\n    /// Task that performs the transformation of the XML file.\n    /// </summary>\n    public class TransformTask : Microsoft.Build.Utilities.Task\n    {\n        /// <summary>\n        /// Gets or sets the source file path for the transformation.\n        /// </summary>\n        [Required]\n        public string Source { get; set; }\n\n        /// <summary>\n        /// Gets or sets the transformation file path.\n        /// </summary>\n        [Required]\n        public string Transform { get; set; }\n\n        /// <summary>\n        /// Gets or sets the destination path for the transformation.\n        /// </summary>\n        [Required]\n        public string Destination { get; set; }\n\n        /// <inheritdoc/>\n        public override bool Execute()\n        {\n            TransformationTaskLogger logger = new TransformationTaskLogger(this.Log);\n\n            ITransformer transformer = TransformerFactory.GetTransformer(this.Source, logger);\n\n            this.Log.LogMessage(\"Beginning transformation.\");\n\n            bool success = transformer.Transform(this.Source, this.Transform, this.Destination);\n            success = success && !this.Log.HasLoggedErrors;\n\n            this.Log.LogMessage(success ?\n                    \"Transformation succeeded.\" :\n                    \"Transformation failed.\");\n\n            return success;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Build/readme.txt",
    "content": "SlowCheetah\n===========\n\nTransformations for XML files (such as app.config) and JSON files.\n\n## Visual Studio Extension\nfor creating and previewing transforms:\nhttps://marketplace.visualstudio.com/items?itemName=vscps.SlowCheetah-XMLTransforms\n\n## Upgrading From Previous Versions (v2.5.15 and lower)\nhttps://github.com/Microsoft/slow-cheetah/blob/main/doc/update.md\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Exceptions/TransformFailedException.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Exceptions\n{\n    using System;\n\n    /// <summary>\n    /// Exception thrown on transformation failure.\n    /// </summary>\n    [Serializable]\n    public class TransformFailedException : Exception\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TransformFailedException\"/> class.\n        /// </summary>\n        /// <param name=\"message\">The message that describes the error.</param>\n        public TransformFailedException(string message)\n            : base(message)\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TransformFailedException\"/> class.\n        /// </summary>\n        /// <param name=\"message\">The message that describes the error.</param>\n        /// <param name=\"inner\">The exception that is the cause of the current exception, or a null reference if no inner exception is specified.</param>\n        public TransformFailedException(string message, Exception inner)\n            : base(message, inner)\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TransformFailedException\"/> class.\n        /// </summary>\n        /// <param name=\"info\">The System.Runtime.Serialization.SerializationInfo that holds the serialized object data about the exception being thrown.</param>\n        /// <param name=\"context\">The System.Runtime.Serialization.StreamingContext that contains contextual information about the source or destination.</param>\n        protected TransformFailedException(\n          System.Runtime.Serialization.SerializationInfo info,\n          System.Runtime.Serialization.StreamingContext context)\n            : base(info, context)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/ITransformationLogger.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    using System;\n\n    /// <summary>\n    /// Importance of a message.\n    /// </summary>\n    public enum LogMessageImportance\n    {\n        /// <summary>\n        /// High importace. Prioritize.\n        /// </summary>\n        High = 2,\n\n        /// <summary>\n        /// Normal importance.\n        /// </summary>\n        Normal = 1,\n\n        /// <summary>\n        /// Low Importance. Do not show if unnecessary.\n        /// </summary>\n        Low = 0,\n    }\n\n    /// <summary>\n    /// Interface for using an internal logger in an <see cref=\"ITransformer\"/>.\n    /// </summary>\n    public interface ITransformationLogger\n    {\n        /// <summary>\n        /// Log an error.\n        /// </summary>\n        /// <param name=\"message\">The error message.</param>\n        /// <param name=\"messageArgs\">Optional message arguments.</param>\n        void LogError(string message, params object[] messageArgs);\n\n        /// <summary>\n        /// Log an error specifying the file, line and position.\n        /// </summary>\n        /// <param name=\"file\">The file containing the error.</param>\n        /// <param name=\"lineNumber\">Line of the error.</param>\n        /// <param name=\"linePosition\">Position of the error.</param>\n        /// <param name=\"message\">The error message.</param>\n        /// <param name=\"messageArgs\">Optional message arguments.</param>\n        void LogError(string file, int lineNumber, int linePosition, string message, params object[] messageArgs);\n\n        /// <summary>\n        /// Logs an error from an exception.\n        /// </summary>\n        /// <param name=\"ex\">The exception.</param>\n        void LogErrorFromException(Exception ex);\n\n        /// <summary>\n        /// Logs an error from an exception specifying the file, line number and position.\n        /// </summary>\n        /// <param name=\"ex\">The exception.</param>\n        /// <param name=\"file\">The file containing the error.</param>\n        /// <param name=\"lineNumber\">Line of the error.</param>\n        /// <param name=\"linePosition\">Position of the error.</param>\n        void LogErrorFromException(Exception ex, string file, int lineNumber, int linePosition);\n\n        /// <summary>\n        /// Log a message.\n        /// </summary>\n        /// <param name=\"importance\">Importance of the message.</param>\n        /// <param name=\"message\">The message.</param>\n        /// <param name=\"messageArgs\">Optional message arguments.</param>\n        void LogMessage(LogMessageImportance importance, string message, params object[] messageArgs);\n\n        /// <summary>\n        /// Log a warning.\n        /// </summary>\n        /// <param name=\"message\">The warning message.</param>\n        /// <param name=\"messageArgs\">Optional message arguments.</param>\n        void LogWarning(string message, params object[] messageArgs);\n\n        /// <summary>\n        /// Log a warning specifying the file, line and position.\n        /// </summary>\n        /// <param name=\"file\">The file containing the warning.</param>\n        /// <param name=\"lineNumber\">Line of the warning.</param>\n        /// <param name=\"linePosition\">Position of the error.</param>\n        /// <param name=\"message\">The warning message.</param>\n        /// <param name=\"messageArgs\">Optional message arguments.</param>\n        void LogWarning(string file, int lineNumber, int linePosition, string message, params object[] messageArgs);\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/JsonShimLogger.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    using System;\n    using Microsoft.VisualStudio.Jdt;\n\n    /// <summary>\n    /// Shim for using <see cref=\"ITransformationLogger\"/>.\n    /// </summary>\n    public class JsonShimLogger : IJsonTransformationLogger\n    {\n        private readonly ITransformationLogger logger;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"JsonShimLogger\"/> class.\n        /// </summary>\n        /// <param name=\"logger\">Our own logger.</param>\n        public JsonShimLogger(ITransformationLogger logger)\n        {\n            this.logger = logger ?? throw new ArgumentNullException(nameof(logger));\n        }\n\n        /// <inheritdoc/>\n        public void LogError(string message)\n        {\n            this.logger.LogError(message);\n        }\n\n        /// <inheritdoc/>\n        public void LogError(string message, string fileName, int lineNumber, int linePosition)\n        {\n            this.logger.LogError(fileName, lineNumber, linePosition, message);\n        }\n\n        /// <inheritdoc/>\n        public void LogErrorFromException(Exception ex)\n        {\n            this.logger.LogErrorFromException(ex);\n        }\n\n        /// <inheritdoc/>\n        public void LogErrorFromException(Exception ex, string fileName, int lineNumber, int linePosition)\n        {\n            this.logger.LogErrorFromException(ex, fileName, lineNumber, linePosition);\n        }\n\n        /// <inheritdoc/>\n        public void LogMessage(string message)\n        {\n            this.logger.LogMessage(LogMessageImportance.Normal, message);\n        }\n\n        /// <inheritdoc/>\n        public void LogMessage(string message, string fileName, int lineNumber, int linePosition)\n        {\n            throw new NotImplementedException();\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string message)\n        {\n            this.logger.LogWarning(message);\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string message, string fileName)\n        {\n            this.LogWarning(message, fileName, 0, 0);\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string message, string fileName, int lineNumber, int linePosition)\n        {\n            this.logger.LogWarning(fileName, lineNumber, linePosition, message);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/TransformationTaskLogger.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    using System;\n    using System.Diagnostics;\n    using Microsoft.Build.Framework;\n    using Microsoft.Build.Utilities;\n\n    /// <summary>\n    /// Shim for using MSBuild logger in <see cref=\"ITransformer\"/>.\n    /// </summary>\n    public class TransformationTaskLogger : ITransformationLogger\n    {\n        private readonly TaskLoggingHelper loggingHelper;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TransformationTaskLogger\"/> class.\n        /// </summary>\n        /// <param name=\"logger\">The MSBuild logger.</param>\n        public TransformationTaskLogger(TaskLoggingHelper logger)\n        {\n            this.loggingHelper = logger ?? throw new ArgumentNullException(nameof(logger));\n        }\n\n        /// <inheritdoc/>\n        public void LogError(string message, params object[] messageArgs)\n        {\n            this.loggingHelper.LogError(message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogError(string file, int lineNumber, int linePosition, string message, params object[] messageArgs)\n        {\n            this.loggingHelper.LogError(null, null, null, file, lineNumber, linePosition, 0, 0, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogErrorFromException(Exception ex)\n        {\n            this.loggingHelper.LogErrorFromException(ex);\n        }\n\n        /// <inheritdoc/>\n        public void LogErrorFromException(Exception ex, string file, int lineNumber, int linePosition)\n        {\n            this.LogError(file, lineNumber, linePosition, ex.Message);\n        }\n\n        /// <inheritdoc/>\n        public void LogMessage(LogMessageImportance type, string message, params object[] messageArgs)\n        {\n            MessageImportance importance;\n            switch (type)\n            {\n                case LogMessageImportance.High:\n                    importance = MessageImportance.High;\n                    break;\n                case LogMessageImportance.Normal:\n                    importance = MessageImportance.Normal;\n                    break;\n                case LogMessageImportance.Low:\n                    importance = MessageImportance.Low;\n                    break;\n                default:\n                    Debug.Fail(\"Unknown LogMessageImportance\");\n                    importance = MessageImportance.Normal;\n                    break;\n            }\n\n            this.loggingHelper.LogMessage(importance, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string message, params object[] messageArgs)\n        {\n            this.loggingHelper.LogWarning(message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string file, int lineNumber, int linePosition, string message, params object[] messageArgs)\n        {\n            this.loggingHelper.LogWarning(null, null, null, file, lineNumber, linePosition, 0, 0, message, messageArgs);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Logging/XmlShimLogger.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    using System;\n    using System.Diagnostics;\n    using System.Linq;\n    using Microsoft.Web.XmlTransform;\n\n    /// <summary>\n    /// Shim for using an <see cref=\"ITransformationLogger\"/> as a <see cref=\"IXmlTransformationLogger\"/>.\n    /// </summary>\n    public class XmlShimLogger : IXmlTransformationLogger\n    {\n        private static readonly string IndentStringPiece = \"  \";\n\n        private readonly bool useSections;\n\n        private readonly ITransformationLogger logger;\n\n        private int indentLevel = 0;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"XmlShimLogger\"/> class.\n        /// </summary>\n        /// <param name=\"logger\">Our own logger.</param>\n        /// <param name=\"useSections\">Wheter or not to use sections.</param>\n        public XmlShimLogger(ITransformationLogger logger, bool useSections)\n        {\n            this.logger = logger ?? throw new ArgumentNullException(nameof(logger));\n\n            this.useSections = useSections;\n        }\n\n        private string IndentString\n        {\n            get\n            {\n                if (this.indentLevel == 0)\n                {\n                    return string.Empty;\n                }\n\n                return string.Concat(Enumerable.Repeat(IndentStringPiece, this.indentLevel));\n            }\n        }\n\n        /// <inheritdoc/>\n        public void LogError(string message, params object[] messageArgs)\n        {\n            this.logger.LogError(message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogError(string file, string message, params object[] messageArgs)\n        {\n            this.logger.LogError(file, 0, 0, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogError(string file, int lineNumber, int linePosition, string message, params object[] messageArgs)\n        {\n            this.logger.LogError(file, lineNumber, linePosition, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogErrorFromException(Exception ex)\n        {\n            this.logger.LogErrorFromException(ex);\n        }\n\n        /// <inheritdoc/>\n        public void LogErrorFromException(Exception ex, string file)\n        {\n            this.logger.LogErrorFromException(ex, file, 0, 0);\n        }\n\n        /// <inheritdoc/>\n        public void LogErrorFromException(Exception ex, string file, int lineNumber, int linePosition)\n        {\n            this.logger.LogErrorFromException(ex, file, lineNumber, linePosition);\n        }\n\n        /// <inheritdoc/>\n        public void LogMessage(string message, params object[] messageArgs)\n        {\n            if (this.useSections)\n            {\n                message = string.Concat(this.IndentString, message);\n            }\n\n            this.logger.LogMessage(LogMessageImportance.Normal, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogMessage(MessageType type, string message, params object[] messageArgs)\n        {\n            LogMessageImportance importance;\n            switch (type)\n            {\n                case MessageType.Normal:\n                    importance = LogMessageImportance.Normal;\n                    break;\n                case MessageType.Verbose:\n                    importance = LogMessageImportance.Low;\n                    break;\n                default:\n                    Debug.Fail(\"Unknown MessageType\");\n                    importance = LogMessageImportance.Normal;\n                    break;\n            }\n\n            if (this.useSections)\n            {\n                message = string.Concat(this.IndentString, message);\n            }\n\n            this.logger.LogMessage(importance, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string message, params object[] messageArgs)\n        {\n            this.logger.LogWarning(message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string file, string message, params object[] messageArgs)\n        {\n            this.logger.LogWarning(file, 0, 0, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string file, int lineNumber, int linePosition, string message, params object[] messageArgs)\n        {\n            this.logger.LogWarning(file, lineNumber, linePosition, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void StartSection(string message, params object[] messageArgs)\n        {\n            this.StartSection(MessageType.Normal, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void StartSection(MessageType type, string message, params object[] messageArgs)\n        {\n            if (this.useSections)\n            {\n                this.LogMessage(message, messageArgs);\n                this.indentLevel++;\n            }\n        }\n\n        /// <inheritdoc/>\n        public void EndSection(string message, params object[] messageArgs)\n        {\n            this.EndSection(MessageType.Normal, message, messageArgs);\n        }\n\n        /// <inheritdoc/>\n        public void EndSection(MessageType type, string message, params object[] messageArgs)\n        {\n            if (this.useSections)\n            {\n                Debug.Assert(this.indentLevel > 0, \"There must be at least one section started\");\n                if (this.indentLevel > 0)\n                {\n                    this.indentLevel--;\n                }\n\n                this.LogMessage(type, message, messageArgs);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Microsoft.VisualStudio.SlowCheetah.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <OutputType>library</OutputType>\n    <TargetFramework>net472</TargetFramework>\n  </PropertyGroup>\n  <PropertyGroup>\n     <Authors>Microsoft</Authors>\n     <Owners>Microsoft, VisualStudioExtensibility</Owners>\n     <Description>Allows for configuration based XML and JSON transformations at build time.</Description>\n     <Copyright>© Microsoft Corporation. All rights reserved.</Copyright>\n     <PackageTags>SlowCheetah slow cheetah XML JSON Transform XDT JDT web.config app.config</PackageTags>\n     <PackageIconUrl>https://aka.ms/VsExtensibilityIcon</PackageIconUrl>\n     <PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>\n     <PackageProjectUrl>https://github.com/Microsoft/slow-cheetah</PackageProjectUrl>\n     <RepositoryUrl>https://github.com/Microsoft/slow-cheetah</RepositoryUrl>\n     <GeneratePackageOnBuild>True</GeneratePackageOnBuild>\n     <IsTool>true</IsTool>\n     <DevelopmentDependency>true</DevelopmentDependency>\n     <MinClientVersion>2.8</MinClientVersion>\n  </PropertyGroup>\n\n\n\n\n  <ItemGroup>\n    <None Update=\"Build\\*.targets\" Pack=\"true\" PackagePath=\"build/%(Filename)%(Extension)\" CopyToOutputDirectory=\"PreserveNewest\" />\n    <None Update=\"Build\\readme.txt\" Pack=\"true\" PackagePath=\"%(Filename)%(Extension)\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Build.Utilities.Core\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Jdt\" />\n    <PackageReference Include=\"Microsoft.Web.Xdt\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Resources\\Resources.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <EmbeddedResource Update=\"Resources\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Resources\\Resources.*.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n    </EmbeddedResource>\n  </ItemGroup>\n\n  <ItemGroup>\n    <FilesToSign Include=\"$(OutputPath)Newtonsoft.Json.dll\">\n      <Authenticode>3PartySHA2</Authenticode>\n      <StrongName>None</StrongName>\n    </FilesToSign>\n  </ItemGroup>\n\n  <!-- Additional files for the nupkg -->\n  <ItemGroup>\n    <None Include=\"$(OutputPath)Microsoft.Web.XmlTransform.dll\" Pack=\"true\" PackagePath=\"tools\" Visible=\"false\" />\n    <None Include=\"$(OutputPath)Microsoft.VisualStudio.Jdt.dll\" Pack=\"true\" PackagePath=\"tools\" Visible=\"false\" />\n    <!-- Tevin: Test to see what this does and if it is necessary. -->\n    <None Include=\"$(OutputPath)Newtonsoft.Json.dll\" Pack=\"true\" PackagePath=\"tools\" Visible=\"false\" />\n  </ItemGroup>\n\n\n  <ItemDefinitionGroup>\n    <PackageReference>\n      <PrivateAssets>all</PrivateAssets>\n    </PackageReference>\n  </ItemDefinitionGroup>\n\n\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Properties/AssemblyInfo.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nusing System.Resources;\n\n[assembly: NeutralResourcesLanguage(\"en-US\")]\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Resources/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Resources {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Microsoft.VisualStudio.SlowCheetah.Resources.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to File not found.\n        /// </summary>\n        internal static string ErrorMessage_FileNotFound {\n            get {\n                return ResourceManager.GetString(\"ErrorMessage_FileNotFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to File to transform not found.\n        /// </summary>\n        internal static string ErrorMessage_SourceFileNotFound {\n            get {\n                return ResourceManager.GetString(\"ErrorMessage_SourceFileNotFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Transform file not found.\n        /// </summary>\n        internal static string ErrorMessage_TransformFileNotFound {\n            get {\n                return ResourceManager.GetString(\"ErrorMessage_TransformFileNotFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {0} is not a supported file type for transformation.\n        /// </summary>\n        internal static string ErrorMessage_UnsupportedFile {\n            get {\n                return ResourceManager.GetString(\"ErrorMessage_UnsupportedFile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {\n        ///}\n        ///.\n        /// </summary>\n        internal static string JsonTransform_TransformFileContents {\n            get {\n                return ResourceManager.GetString(\"JsonTransform_TransformFileContents\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to For more information on using transformations see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. .\n        /// </summary>\n        internal static string XmlTransform_ContentInfo {\n            get {\n                return ResourceManager.GetString(\"XmlTransform_ContentInfo\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Resources/Resources.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"ErrorMessage_FileNotFound\" xml:space=\"preserve\">\n    <value>File not found</value>\n    <comment>Error message for missing file</comment>\n  </data>\n  <data name=\"ErrorMessage_SourceFileNotFound\" xml:space=\"preserve\">\n    <value>File to transform not found</value>\n    <comment>Message to be shown when the source file is not found</comment>\n  </data>\n  <data name=\"ErrorMessage_TransformFileNotFound\" xml:space=\"preserve\">\n    <value>Transform file not found</value>\n    <comment>Message to be shown when the transform file is not found</comment>\n  </data>\n  <data name=\"ErrorMessage_UnsupportedFile\" xml:space=\"preserve\">\n    <value>{0} is not a supported file type for transformation</value>\n  </data>\n  <data name=\"JsonTransform_TransformFileContents\" xml:space=\"preserve\">\n    <value>{\n}\n</value>\n  </data>\n  <data name=\"XmlTransform_ContentInfo\" xml:space=\"preserve\">\n    <value>For more information on using transformations see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. </value>\n    <comment>Info on XDT transforms, to be added as a comment in the transform file</comment>\n  </data>\n</root>"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/ITransformer.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    /// <summary>\n    /// Interface for file tranformers.\n    /// </summary>\n    public interface ITransformer\n    {\n        /// <summary>\n        /// Returns an instance of the <see cref=\"ITransformer\"/> with the given logger.\n        /// </summary>\n        /// <param name=\"logger\">The external logger. Can be null.</param>\n        /// <returns>A new instance of the transformer.</returns>\n        ITransformer WithLogger(ITransformationLogger logger);\n\n        /// <summary>\n        /// Main method that tranforms a source file according to a transformation file and puts it in a destination file.\n        /// </summary>\n        /// <param name=\"sourcePath\">Path to source file.</param>\n        /// <param name=\"transformPath\">Path to tranformation file.</param>\n        /// <param name=\"destinationPath\">Path to destination of transformed file.</param>\n        /// <returns>True if the transform succeeded.</returns>\n        bool Transform(string sourcePath, string transformPath, string destinationPath);\n\n        /// <summary>\n        /// Verifies if a given file is supported by this transformer.\n        /// </summary>\n        /// <param name=\"filePath\">The path to the file.</param>\n        /// <returns>True if the file can be transformed by this transformer.</returns>\n        bool IsFileSupported(string filePath);\n\n        /// <summary>\n        /// Creates the appropriate transform file in the given path.\n        /// </summary>\n        /// <param name=\"sourcePath\">Path to the source file.</param>\n        /// <param name=\"transformPath\">Path to the transform file to be created.</param>\n        /// <param name=\"overwrite\">Wether an an existing transform file should be overwritten.</param>\n        void CreateTransformFile(string sourcePath, string transformPath, bool overwrite);\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/JsonTransformer.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    using System;\n    using System.IO;\n    using Microsoft.VisualStudio.Jdt;\n\n    /// <summary>\n    /// Transforms JSON files using JSON Document Transformations.\n    /// </summary>\n    public class JsonTransformer : ITransformer\n    {\n        // Contents of a newly created transform file\n        private static readonly string TransformFileContents = \"{\" + Environment.NewLine + \"}\" + Environment.NewLine;\n\n        private IJsonTransformationLogger logger;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"JsonTransformer\"/> class.\n        /// </summary>\n        public JsonTransformer()\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"JsonTransformer\"/> class with an external logger.\n        /// </summary>\n        /// <param name=\"logger\">The external logger.</param>\n        public JsonTransformer(ITransformationLogger logger)\n        {\n            if (logger == null)\n            {\n                throw new ArgumentNullException(nameof(logger));\n            }\n\n            this.logger = new JsonShimLogger(logger);\n        }\n\n        /// <inheritdoc/>\n        public void CreateTransformFile(string sourcePath, string transformPath, bool overwrite)\n        {\n            if (string.IsNullOrWhiteSpace(sourcePath))\n            {\n                throw new ArgumentNullException(nameof(sourcePath));\n            }\n\n            if (string.IsNullOrWhiteSpace(transformPath))\n            {\n                throw new ArgumentNullException(nameof(transformPath));\n            }\n\n            if (!File.Exists(sourcePath))\n            {\n                throw new FileNotFoundException(Resources.Resources.ErrorMessage_SourceFileNotFound, sourcePath);\n            }\n\n            // If the file should be overwritten or if it doesn't exist, we create it\n            if (overwrite || !File.Exists(transformPath))\n            {\n                System.Text.Encoding encoding = TransformUtilities.GetEncoding(sourcePath);\n                File.WriteAllText(transformPath, Resources.Resources.JsonTransform_TransformFileContents, encoding);\n            }\n        }\n\n        /// <inheritdoc/>\n        public bool IsFileSupported(string filePath)\n        {\n            if (string.IsNullOrWhiteSpace(filePath))\n            {\n                throw new ArgumentNullException(nameof(filePath));\n            }\n\n            if (!File.Exists(filePath))\n            {\n                throw new FileNotFoundException(Resources.Resources.ErrorMessage_FileNotFound, filePath);\n            }\n\n            return Path.GetExtension(filePath).Equals(\".json\", StringComparison.OrdinalIgnoreCase);\n        }\n\n        /// <inheritdoc/>\n        public bool Transform(string sourcePath, string transformPath, string destinationPath)\n        {\n            if (string.IsNullOrWhiteSpace(sourcePath))\n            {\n                throw new ArgumentException($\"{nameof(sourcePath)} cannot be null or whitespace\");\n            }\n\n            if (string.IsNullOrWhiteSpace(transformPath))\n            {\n                throw new ArgumentException($\"{nameof(transformPath)} cannot be null or whitespace\");\n            }\n\n            if (string.IsNullOrWhiteSpace(destinationPath))\n            {\n                throw new ArgumentException($\"{nameof(destinationPath)} cannot be null or whitespace\");\n            }\n\n            if (!File.Exists(sourcePath))\n            {\n                throw new FileNotFoundException(Resources.Resources.ErrorMessage_SourceFileNotFound, sourcePath);\n            }\n\n            if (!File.Exists(transformPath))\n            {\n                throw new FileNotFoundException(Resources.Resources.ErrorMessage_TransformFileNotFound, transformPath);\n            }\n\n            var transformation = new JsonTransformation(transformPath, this.logger);\n\n            try\n            {\n                using (Stream result = transformation.Apply(sourcePath))\n                {\n                    return this.TrySaveToFile(result, sourcePath, destinationPath);\n                }\n            }\n            catch\n            {\n                // JDT exceptions are handled by it's own logger\n                return false;\n            }\n        }\n\n        /// <inheritdoc/>\n        public ITransformer WithLogger(ITransformationLogger logger)\n        {\n            if (logger == this.logger)\n            {\n                return this;\n            }\n            else if (logger == null)\n            {\n                return new JsonTransformer();\n            }\n            else\n            {\n                return new JsonTransformer(logger);\n            }\n        }\n\n        private bool TrySaveToFile(Stream result, string sourceFile, string destinationFile)\n        {\n            try\n            {\n                string contents;\n                System.Text.Encoding encoding = TransformUtilities.GetEncoding(sourceFile);\n                using (StreamReader reader = new StreamReader(result, true))\n                {\n                    // Get the contents of the result stram\n                    contents = reader.ReadToEnd();\n                }\n\n                // Make sure to save it in the encoding of the result stream\n                File.WriteAllText(destinationFile, contents, encoding);\n\n                return true;\n            }\n            catch (Exception ex)\n            {\n                this.logger.LogErrorFromException(ex);\n                return false;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformUtilities.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    using System;\n    using System.IO;\n    using System.Text;\n\n    /// <summary>\n    /// Utilities for transformations.\n    /// </summary>\n    public static class TransformUtilities\n    {\n        /// <summary>\n        /// Determines a text file's encoding by analyzing its byte order mark (BOM).\n        /// Defaults to ASCII when detection of the text file's endianness fails.\n        /// </summary>\n        /// <param name=\"filename\">The text file to analyze.</param>\n        /// <returns>The detected encoding.</returns>\n        public static Encoding GetEncoding(string filename)\n        {\n            if (string.IsNullOrWhiteSpace(filename))\n            {\n                throw new ArgumentException(nameof(filename));\n            }\n\n            using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read))\n            {\n                return GetEncoding(file);\n            }\n        }\n\n        /// <summary>\n        /// Determines a stream's encoding by analyzing its byte order mark (BOM).\n        /// Defaults to ASCII when detection of the text file's endianness fails.\n        /// </summary>\n        /// <param name=\"stream\">The stream to analyze.</param>\n        /// <returns>The detected encoding.</returns>\n        public static Encoding GetEncoding(Stream stream)\n        {\n            if (stream == null)\n            {\n                throw new ArgumentNullException(nameof(stream));\n            }\n\n            // Read the BOM\n            var bom = new byte[4];\n            stream.Read(bom, 0, 4);\n\n            // Analyze the BOM\n            if (bom[0] == 0x2b && bom[1] == 0x2f && bom[2] == 0x76)\n            {\n                return Encoding.UTF7;\n            }\n\n            if (bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf)\n            {\n                return Encoding.UTF8;\n            }\n\n            if (bom[0] == 0xff && bom[1] == 0xfe)\n            {\n                return Encoding.Unicode; // UTF-16LE\n            }\n\n            if (bom[0] == 0xfe && bom[1] == 0xff)\n            {\n                return Encoding.BigEndianUnicode; // UTF-16BE\n            }\n\n            if (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff)\n            {\n                return Encoding.UTF32;\n            }\n\n            using (StreamReader reader = new StreamReader(stream, true))\n            {\n                stream.Position = 0;\n                reader.Peek();\n                return reader.CurrentEncoding;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/TransformerFactory.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n\n    /// <summary>\n    /// Factory for <see cref=\"ITransformer\"/>.\n    /// </summary>\n    public static class TransformerFactory\n    {\n        private static readonly List<ITransformer> TransformerCatalog = new List<ITransformer>()\n        {\n            new JsonTransformer(),\n            new XmlTransformer(),\n        };\n\n        /// <summary>\n        /// Gets the appropriate <see cref=\"ITransformer\"/> for the given transformation.\n        /// </summary>\n        /// <param name=\"source\">Path to the file to be transformed.</param>\n        /// <param name=\"logger\">Logger to be used in the transformer.</param>\n        /// <returns>The appropriate transformer for the given file.</returns>\n        public static ITransformer GetTransformer(string source, ITransformationLogger logger)\n        {\n            if (string.IsNullOrWhiteSpace(source))\n            {\n                throw new ArgumentException(nameof(source));\n            }\n\n            return TransformerCatalog.FirstOrDefault(tr => tr.IsFileSupported(source))?.WithLogger(logger)\n                ?? throw new NotSupportedException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.ErrorMessage_UnsupportedFile, source));\n        }\n\n        /// <summary>\n        /// Verifies if a file is of a supported format.\n        /// </summary>\n        /// <param name=\"filePath\">Full path to the file.</param>\n        /// <returns>True is the file type is supported.</returns>\n        public static bool IsSupportedFile(string filePath)\n        {\n            if (string.IsNullOrWhiteSpace(filePath))\n            {\n                throw new ArgumentException(nameof(filePath));\n            }\n\n            return TransformerCatalog.Any(tr => tr.IsFileSupported(filePath));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah/Transformer/XmlTransformer.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah\n{\n    using System;\n    using System.IO;\n    using System.Xml;\n    using Microsoft.Web.XmlTransform;\n\n    /// <summary>\n    /// Transforms XML files utilizing Microsoft Web XmlTransform library.\n    /// </summary>\n    public class XmlTransformer : ITransformer\n    {\n        private const string XdtAttributeName = \"xmlns:xdt\";\n        private const string XdtAttributeValue = \"http://schemas.microsoft.com/XML-Document-Transform\";\n\n        private IXmlTransformationLogger logger = null;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"XmlTransformer\"/> class.\n        /// </summary>\n        public XmlTransformer()\n        {\n        }\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"XmlTransformer\"/> class with an external logger.\n        /// </summary>\n        /// <param name=\"logger\">The external logger.</param>\n        public XmlTransformer(ITransformationLogger logger)\n        {\n            if (logger == null)\n            {\n                throw new ArgumentNullException(nameof(logger));\n            }\n\n            this.logger = new XmlShimLogger(logger, useSections: false);\n        }\n\n        /// <inheritdoc/>\n        public void CreateTransformFile(string sourcePath, string transformPath, bool overwrite)\n        {\n            if (string.IsNullOrWhiteSpace(sourcePath))\n            {\n                throw new ArgumentNullException(nameof(sourcePath));\n            }\n\n            if (string.IsNullOrWhiteSpace(transformPath))\n            {\n                throw new ArgumentNullException(nameof(transformPath));\n            }\n\n            if (!File.Exists(sourcePath))\n            {\n                throw new FileNotFoundException(Resources.Resources.ErrorMessage_SourceFileNotFound, sourcePath);\n            }\n\n            // If the file should be overwritten or if it doesn't exist, we create it\n            if (overwrite || !File.Exists(transformPath))\n            {\n                XmlDocument transformDoc = new XmlDocument();\n                using (XmlTextReader reader = new XmlTextReader(sourcePath))\n                {\n                    reader.DtdProcessing = DtdProcessing.Ignore;\n                    transformDoc.Load(reader);\n                }\n\n                XmlComment xdtInfo = transformDoc.CreateComment(Resources.Resources.XmlTransform_ContentInfo);\n                XmlElement root = transformDoc.DocumentElement;\n                transformDoc.InsertBefore(xdtInfo, root);\n                root.SetAttribute(XdtAttributeName, XdtAttributeValue);\n                root.InnerXml = string.Empty;\n                transformDoc.Save(transformPath);\n            }\n        }\n\n        /// <inheritdoc/>\n        public bool IsFileSupported(string filePath)\n        {\n            if (string.IsNullOrWhiteSpace(filePath))\n            {\n                throw new ArgumentNullException(nameof(filePath));\n            }\n\n            if (!File.Exists(filePath))\n            {\n                throw new FileNotFoundException(Resources.Resources.ErrorMessage_FileNotFound, filePath);\n            }\n\n            try\n            {\n                using (XmlTextReader xmlTextReader = new XmlTextReader(filePath))\n                {\n                    // This is required because if the XML file has a DTD then it will try and download the DTD!\n                    xmlTextReader.DtdProcessing = DtdProcessing.Ignore;\n                    xmlTextReader.Read();\n                    return true;\n                }\n            }\n            catch (XmlException)\n            {\n            }\n\n            return false;\n        }\n\n        /// <inheritdoc/>\n        public bool Transform(string sourcePath, string transformPath, string destinationPath)\n        {\n            if (string.IsNullOrWhiteSpace(sourcePath))\n            {\n                throw new ArgumentNullException(nameof(sourcePath));\n            }\n\n            if (string.IsNullOrWhiteSpace(transformPath))\n            {\n                throw new ArgumentNullException(nameof(transformPath));\n            }\n\n            if (string.IsNullOrWhiteSpace(destinationPath))\n            {\n                throw new ArgumentNullException(nameof(destinationPath));\n            }\n\n            if (!File.Exists(sourcePath))\n            {\n                throw new FileNotFoundException(Resources.Resources.ErrorMessage_SourceFileNotFound, sourcePath);\n            }\n\n            if (!File.Exists(transformPath))\n            {\n                throw new FileNotFoundException(Resources.Resources.ErrorMessage_TransformFileNotFound, transformPath);\n            }\n\n            using (XmlTransformableDocument document = new XmlTransformableDocument())\n            using (XmlTransformation transformation = new XmlTransformation(transformPath, this.logger))\n            {\n                document.PreserveWhitespace = true;\n                document.Load(sourcePath);\n\n                var success = transformation.Apply(document);\n\n                if (success)\n                {\n                    document.Save(destinationPath);\n                }\n\n                return success;\n            }\n        }\n\n        /// <inheritdoc/>\n        public ITransformer WithLogger(ITransformationLogger logger)\n        {\n            if (logger == this.logger)\n            {\n                return this;\n            }\n            else if (logger == null)\n            {\n                return new XmlTransformer();\n            }\n            else\n            {\n                return new XmlTransformer(logger);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"xunit.shadowCopy\" value=\"false\" />\n  </appSettings>\n</configuration>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BaseTest.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests\n{\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n\n    /// <summary>\n    /// Class that contains base initialization methods for all the unit tests, such as creating and deleting temporary files.\n    /// </summary>\n    public class BaseTest : IDisposable\n    {\n        /// <summary>\n        /// Gets the list of temporary files to delete after test.\n        /// </summary>\n        protected IList<string> FilesToDeleteAfterTest { get; } = new List<string>();\n\n        /// <summary>\n        /// At the end of tests, attempts to delete all the files generated during the test.\n        /// </summary>\n        public void Dispose()\n        {\n            foreach (string filename in this.FilesToDeleteAfterTest)\n            {\n                if (File.Exists(filename))\n                {\n                    try\n                    {\n                        File.Delete(filename);\n                    }\n                    catch (System.IO.IOException)\n                    {\n                        // some processes will hold onto the file until the AppDomain is unloaded\n                    }\n                }\n            }\n\n            this.FilesToDeleteAfterTest.Clear();\n        }\n\n        /// <summary>\n        /// Writes a string to a temporary file.\n        /// </summary>\n        /// <param name=\"content\">Content to be written.</param>\n        /// <returns>The path of the created file.</returns>\n        protected virtual string WriteTextToTempFile(string content)\n        {\n            if (string.IsNullOrEmpty(content))\n            {\n                throw new ArgumentNullException(nameof(content));\n            }\n\n            string tempFile = this.GetTempFilename(true);\n            File.WriteAllText(tempFile, content);\n            return tempFile;\n        }\n\n        /// <summary>\n        /// Creates a temporary file for testing.\n        /// </summary>\n        /// <param name=\"ensureFileDoesntExist\">If it is ensured that a file with the same name doesn't already exist.</param>\n        /// <returns>The path to the created file.</returns>\n        protected virtual string GetTempFilename(bool ensureFileDoesntExist)\n        {\n            string path = Path.GetTempFileName();\n            if (ensureFileDoesntExist && File.Exists(path))\n            {\n                File.Delete(path);\n            }\n\n            this.FilesToDeleteAfterTest.Add(path);\n            return path;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConfigTransformTestsBase.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests.BuildTests\n{\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Xml.Linq;\n    using Microsoft.Build.Utilities;\n    using Xunit;\n\n    /// <summary>\n    /// Base class for transformation tests.\n    /// </summary>\n    public abstract class ConfigTransformTestsBase : IDisposable\n    {\n        /// <summary>\n        /// Gets the test solution directory.\n        /// </summary>\n        public string SolutionDir\n        {\n            get { return Path.Combine(Environment.CurrentDirectory, @\"..\\..\\..\\..\\test\"); }\n        }\n\n        /// <summary>\n        /// Gets the output path of the test project.\n        /// </summary>\n        public string OutputPath\n        {\n            get { return Path.Combine(Environment.CurrentDirectory, @\"ProjectOutput\"); }\n        }\n\n        /// <summary>\n        /// Gets the test projects directory.\n        /// </summary>\n        public string TestProjectsDir\n        {\n            get { return Path.Combine(this.SolutionDir, @\"Microsoft.VisualStudio.SlowCheetah.Tests\\BuildTests\\TestProjects\"); }\n        }\n\n        /// <summary>\n        /// Gets the msbuild exe path that was cached during build.\n        /// </summary>\n        private static string MSBuildExePath\n        {\n            get\n            {\n                string msbuildPathCache = Path.Combine(Environment.CurrentDirectory, \"msbuildPath.txt\");\n                return Path.Combine(File.ReadAllLines(msbuildPathCache).First(), \"msbuild.exe\");\n            }\n        }\n\n        /// <summary>\n        /// Builds the project of the given name from the <see cref=\"TestProjectsDir\"/>.\n        /// </summary>\n        /// <param name=\"projectName\">Name of the project to be built.\n        /// Must correspond to a folder name in the test projects directory.</param>\n        public void BuildProject(string projectName)\n        {\n            var globalProperties = new Dictionary<string, string>()\n            {\n               { \"Configuration\", \"Debug\" },\n               { \"OutputPath\", this.OutputPath },\n            };\n\n            var msbuildPath = ToolLocationHelper.GetPathToBuildToolsFile(\"msbuild.exe\", ToolLocationHelper.CurrentToolsVersion);\n\n            // We use an external process to run msbuild, because XUnit test discovery breaks\n            // when using <Reference Include=\"$(MSBuildToolsPath)\\Microsoft.Build.dll\" />.\n            // MSBuild NuGet packages proved to be difficult in getting in-proc test builds to run.\n            string projectPath = Path.Combine(this.TestProjectsDir, projectName, projectName + \".csproj\");\n            //string msbuildPath = MSBuildExePath;\n            string properties = \"/p:\" + string.Join(\",\", globalProperties.Select(x => $\"{x.Key}={x.Value}\"));\n\n            var startInfo = new System.Diagnostics.ProcessStartInfo()\n            {\n                FileName = msbuildPath,\n                Arguments = $\"{projectPath} {properties}\",\n                CreateNoWindow = false,\n                WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,\n            };\n\n            // Tevin: Delete later\n            string path = \"C:\\\\src\\\\libtempslowcheetah\\\\test\\\\Microsoft.VisualStudio.SlowCheetah.Tests\\\\example.txt\";\n\n            // Open the file for reading\n            using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Write))\n            {\n                // Read from the file\n                using (StreamWriter writer = new StreamWriter(fs))\n                {\n                    writer.WriteLine($\"Running msbuild.exe {startInfo.Arguments}\");\n                    writer.WriteLine($\"Running msbuild.exe filename {startInfo.FileName}\");\n                }\n            }\n\n            try\n            {\n\n                using (var process = System.Diagnostics.Process.Start(startInfo))\n                {\n                    process.WaitForExit();\n                    Assert.Equal(0, process.ExitCode);\n                    process.Close();\n                }\n            }\n            catch (Exception ex)\n            {\n                throw new Exception($\"Error running msbuild: {ex.Message}\", ex);\n            }\n        }\n\n        /// <summary>\n        /// Gets a app setting from a configuration file.\n        /// </summary>\n        /// <param name=\"configFilePath\">Path to the configuration file.</param>\n        /// <param name=\"appSettingKey\">Setting key.</param>\n        /// <returns>Value of the setting.</returns>\n        public string GetAppSettingValue(string configFilePath, string appSettingKey)\n        {\n            var configFile = XDocument.Load(configFilePath);\n            var testSetting = (from settingEl in configFile.Descendants(\"appSettings\").Elements()\n                               where settingEl.Attribute(\"key\").Value == appSettingKey\n                               select settingEl.Attribute(\"value\").Value).Single();\n            return testSetting;\n        }\n\n        /// <summary>\n        /// Gets the value of a node within a configuration file.\n        /// </summary>\n        /// <param name=\"configFilePath\">Path to the configuration file.</param>\n        /// <param name=\"nodeName\">Name of the node.</param>\n        /// <returns>Value of the node.</returns>\n        public string GetConfigNodeValue(string configFilePath, string nodeName)\n        {\n            var configFile = XDocument.Load(configFilePath);\n            return configFile.Descendants(nodeName).Single().Value;\n        }\n\n        /// <summary>\n        /// At the end of tests, delete the output path for the tested projects.\n        /// </summary>\n        public void Dispose()\n        {\n            if (Directory.Exists(this.OutputPath))\n            {\n                Directory.Delete(this.OutputPath, recursive: true);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConsoleAppTests.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests.BuildTests\n{\n    using System.IO;\n    using Xunit;\n\n    /// <summary>\n    /// Tests build time transformations for a test console app.\n    /// </summary>\n    [Collection(\"BuildTests\")]\n    public class ConsoleAppTests : ConfigTransformTestsBase\n    {\n        /// <summary>\n        /// Tests if app.config is transformed on build.\n        /// </summary>\n        [Fact]\n        public void ConsoleApp_AppConfig_IsTransformed()\n        {\n            var projectName = \"ConsoleApp\";\n            this.BuildProject(projectName);\n\n            var configFilePath = Path.Combine(this.OutputPath, \"ConsoleApp.exe.config\");\n\n            var testSetting = this.GetAppSettingValue(configFilePath, \"TestSetting\");\n\n            Assert.Equal(\"Debug\", testSetting);\n        }\n\n        /// <summary>\n        /// Tests if other.config is transformed on build.\n        /// </summary>\n        [Fact]\n        public void ConsoleApp_OtherConfig_IsTransformed()\n        {\n            var projectName = \"ConsoleApp\";\n            this.BuildProject(projectName);\n\n            var configFilePath = Path.Combine(this.OutputPath, \"Other.config\");\n\n            var testNodeValue = this.GetConfigNodeValue(configFilePath, \"TestNode\");\n\n            Assert.Equal(\"Debug\", testNodeValue);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <appSettings>\n    <add key=\"TestSetting\" value=\"Debug\" xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(key)\"/>\n  </appSettings>\n</configuration>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <appSettings>\n    <add key=\"TestSetting\" value=\"Release\" xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(key)\"/>\n  </appSettings>\n</configuration>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"TestSetting\" value=\"Default\"/>\n  </appSettings>\n  <startup> \n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n  </startup>\n</configuration>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/ConsoleApp.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1C50F6B9-3E9C-48D1-87C3-783763D11A4C}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>ConsoleApp</RootNamespace>\n    <AssemblyName>ConsoleApp</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.Release.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>App.config</DependentUpon>\n    </None>\n    <None Include=\"App.Debug.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>App.config</DependentUpon>\n    </None>\n    <None Include=\"App.config\">\n      <TransformOnBuild>true</TransformOnBuild>\n    </None>\n    <None Include=\"Other.Release.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>Other.config</DependentUpon>\n    </None>\n    <None Include=\"Other.Debug.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>Other.config</DependentUpon>\n    </None>\n    <None Include=\"Other.config\">\n      <TransformOnBuild>true</TransformOnBuild>\n    </None>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(MSBuildThisFileDirectory)..\\packages\\slowcheetah\\build\\Microsoft.VisualStudio.SlowCheetah.targets\" />\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<SomeNode xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <TestNode xdt:Transform=\"Replace\">Debug</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<SomeNode xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <TestNode xdt:Transform=\"Replace\">Release</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<SomeNode>\n  <TestNode>default</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApp\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ConsoleApp\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApp\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"1c50f6b9-3e9c-48d1-87c3-783763d11a4c\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/Directory.Build.props",
    "content": "<Project />"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/Directory.Build.targets",
    "content": "<Project />"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<SomeNode xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <TestNode xdt:Transform=\"Replace\">Debug</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<SomeNode xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <TestNode xdt:Transform=\"Replace\">Release</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<SomeNode>\n  <TestNode>default</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following \n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"WebApplication\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"WebApplication\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible \n// to COM components.  If you need to access a type in this assembly from \n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"ff416cd8-e3b3-4223-b8fd-e6b3b6720d71\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version \n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Revision and Build Numbers \n// by using the '*' as shown below:\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  https://go.microsoft.com/fwlink/?LinkId=169433\n  -->\n<configuration>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.7.2\" />\n      </system.Web>\n  -->\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\"/>\n    <httpRuntime targetFramework=\"4.5.2\"/>\n  </system.web>\n  <system.codedom>\n    <compilers>\n      <compiler language=\"c#;cs;csharp\" extension=\".cs\" type=\"Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" warningLevel=\"4\" compilerOptions=\"/langversion:6 /nowarn:1659;1699;1701\"/>\n      <compiler language=\"vb;vbs;visualbasic;vbscript\" extension=\".vb\" type=\"Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" warningLevel=\"4\" compilerOptions=\"/langversion:14 /nowarn:41008 /define:_MYTYPE=\\&quot;Web\\&quot; /optionInfer+\"/>\n    </compilers>\n  </system.codedom>\n</configuration>"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/WebApplication.csproj",
    "content": "﻿<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{FF416CD8-E3B3-4223-B8FD-E6B3B6720D71}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>WebApplication</RootNamespace>\n    <AssemblyName>WebApplication</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <ExcludeGlobalPackages>True</ExcludeGlobalPackages>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"CSharpIsNullAnalyzer\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"DotNetAnalyzers.DocumentationAnalyzers\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Internal.MicroBuild.VisualStudio\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"Nerdbank.GitVersioning\"  />\n    <PackageReference Include=\"Nullable\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"StyleCop.Analyzers.Unstable\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"StyleCop.Analyzers\" ExcludeAssets=\"All\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Other.config\">\n      <TransformOnBuild>true</TransformOnBuild>\n    </Content>\n    <Content Include=\"Other.Debug.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>Other.config</DependentUpon>\n    </Content>\n    <Content Include=\"Other.Release.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>Other.config</DependentUpon>\n    </Content>\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Web.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <Import Project=\"$(MSBuildThisFileDirectory)..\\packages\\slowcheetah\\build\\Microsoft.VisualStudio.SlowCheetah.targets\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>57677</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:56732/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/WebAppTests.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests.BuildTests\n{\n    using System.IO;\n    using Xunit;\n\n    /// <summary>\n    /// Tests build time transformations for a test web app.\n    /// </summary>\n    [Collection(\"BuildTests\")]\n    public class WebAppTests : ConfigTransformTestsBase\n    {\n        /// <summary>\n        /// Tests if other.config is transformed on build.\n        /// </summary>\n        [Fact]\n        public void WebApp_OtherConfig_IsTransformed()\n        {\n            var projectName = \"WebApplication\";\n            this.BuildProject(projectName);\n\n            var configFilePath = Path.Combine(this.OutputPath, \"Other.config\");\n\n            var testNodeValue = this.GetConfigNodeValue(configFilePath, \"TestNode\");\n\n            Assert.Equal(\"Debug\", testNodeValue);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/Microsoft.VisualStudio.SlowCheetah.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net472</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Remove=\"BuildTests\\TestProjects\\**\" />\n    <EmbeddedResource Remove=\"BuildTests\\TestProjects\\**\" />\n    <None Remove=\"BuildTests\\TestProjects\\**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Build.Utilities.Core\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Internal.MicroBuild.NonShipping\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" />\n    <PackageReference Include=\"xunit\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" PrivateAssets=\"all\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n    <PackageReference Update=\"Nerdbank.GitVersioning\" PrivateAssets=\"all\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n    <PackageReference Update=\"StyleCop.Analyzers\" ExcludeAssets=\"All\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Microsoft.VisualStudio.SlowCheetah\\Microsoft.VisualStudio.SlowCheetah.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Service Include=\"{82a7f48d-3b50-4b1e-b82e-3ada8210c358}\" />\n  </ItemGroup>\n\n  <!--Copy SlowCheetah Output to test folder-->\n  <Target Name=\"CopySlowCheetahFiles\" AfterTargets=\"Build\">\n    <MSBuild Projects=\"@(ProjectReference)\" Targets=\"GetTargetPath\" BuildInParallel=\"true\" Properties=\"Configuration=$(Configuration)\" Condition=\"'%(Filename)'=='Microsoft.VisualStudio.SlowCheetah'\">\n      <Output TaskParameter=\"TargetOutputs\" ItemName=\"_DependentAssemblies\" />\n    </MSBuild>\n    <ItemGroup>\n      <_CopyTools Include=\"@(_DependentAssemblies);%(_DependentAssemblies.RelativeDir)Microsoft.Web.XmlTransform.dll\" />\n      <_CopyTools Include=\"@(_DependentAssemblies);%(_DependentAssemblies.RelativeDir)Microsoft.VisualStudio.Jdt.dll\" />\n      <_CopyBuild Include=\"%(_DependentAssemblies.RelativeDir)Build\\Microsoft.VisualStudio.SlowCheetah*.targets\" />\n    </ItemGroup>\n    <RemoveDir Directories=\"$(MSBuildThisFileDirectory)BuildTests\\TestProjects\\packages\\slowcheetah\\\" />\n    <Copy SourceFiles=\"@(_CopyTools)\" DestinationFolder=\"$(MSBuildThisFileDirectory)BuildTests\\TestProjects\\packages\\slowcheetah\\tools\" />\n    <Copy SourceFiles=\"@(_CopyBuild)\" DestinationFolder=\"$(MSBuildThisFileDirectory)BuildTests\\TestProjects\\packages\\slowcheetah\\build\" />\n  </Target>\n\n  <Target Name=\"CacheMSBuildPath\" AfterTargets=\"Build\">\n    <ItemGroup>\n      <_MSBuildPathLines Include=\"$(MSBuildToolsPath)\" />\n    </ItemGroup>\n    <WriteLinesToFile File=\"$(OutputPath)msbuildPath.txt\" Lines=\"@(_MSBuildPathLines)\" Overwrite=\"true\" />\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/TestUtilities.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests\n{\n    /// <summary>\n    /// Utilities class for SlowCheetah tests.\n    /// </summary>\n    public static class TestUtilities\n    {\n        /// <summary>\n        /// Example source file for transform testing.\n        /// </summary>\n        public const string Source01 =\n            @\"<?xml version=\"\"1.0\"\"?>\n            <configuration>\n                <appSettings>\n                    <add key=\"\"setting01\"\" value=\"\"default01\"\"/> \n                    <add key=\"\"setting02\"\" value=\"\"default02\"\"/> \n                </appSettings>\n            </configuration>\";\n\n        /// <summary>\n        /// Example transform file for transform testing.\n        /// </summary>\n        public const string Transform01 =\n            @\"<?xml version=\"\"1.0\"\"?>\n            <configuration xmlns:xdt=\"\"http://schemas.microsoft.com/XML-Document-Transform\"\">\n                <appSettings>\n                    <add key=\"\"setting01\"\" value=\"\"debug01\"\"\n                        xdt:Locator=\"\"Match(key)\"\" xdt:Transform=\"\"Replace\"\" />\n                    <add key=\"\"setting02\"\" value=\"\"debug02\"\"\n                        xdt:Locator=\"\"Match(key)\"\" xdt:Transform=\"\"Replace\"\" />\n                </appSettings>\n            </configuration>\";\n\n        /// <summary>\n        /// Example result file for transform testing.\n        /// </summary>\n        public const string Result01 =\n            @\"<?xml version=\"\"1.0\"\"?>\n            <configuration>\n                <appSettings>\n                    <add key=\"\"setting01\"\" value=\"\"debug01\"\"/> \n                    <add key=\"\"setting02\"\" value=\"\"debug02\"\"/> \n                </appSettings>\n            </configuration>\";\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/TransformTest.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests\n{\n    using System.IO;\n    using Xunit;\n\n    /// <summary>\n    /// Tests for <see cref=\"ITransformer\"/>.\n    /// </summary>\n    public class TransformTest : BaseTest\n    {\n        /// <summary>\n        /// Tests for <see cref=\"XmlTransformer\"/>.\n        /// </summary>\n        [Fact]\n        public void TestXmlTransform()\n        {\n            string sourceFile = this.WriteTextToTempFile(TestUtilities.Source01);\n            string transformFile = this.WriteTextToTempFile(TestUtilities.Transform01);\n            string expectedResultFile = this.WriteTextToTempFile(TestUtilities.Result01);\n\n            string destFile = this.GetTempFilename(true);\n            ITransformer transformer = new XmlTransformer();\n            transformer.Transform(sourceFile, transformFile, destFile);\n\n            Assert.True(File.Exists(sourceFile));\n            Assert.True(File.Exists(transformFile));\n            Assert.True(File.Exists(destFile));\n\n            string actualResult = File.ReadAllText(destFile);\n            string expectedResult = File.ReadAllText(expectedResultFile);\n            Assert.Equal(expectedResult.Trim(), actualResult.Trim());\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Tests/example.txt",
    "content": "Running msbuild.exe C:\\src\\libtempslowcheetah\\bin\\Microsoft.VisualStudio.SlowCheetah.Tests\\Debug\\net472\\..\\..\\..\\..\\test\\Microsoft.VisualStudio.SlowCheetah.Tests\\BuildTests\\TestProjects\\WebApplication\\WebApplication.csproj /p:Configuration=Debug,OutputPath=C:\\src\\libtempslowcheetah\\bin\\Microsoft.VisualStudio.SlowCheetah.Tests\\Debug\\net472\\ProjectOutput\nRunning msbuild.exe filename C:\\Program Files\\Microsoft Visual Studio\\2022\\IntPreview\\MSBuild\\Current\\Bin\\amd64\\msbuild.exe\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Directory.Build.targets",
    "content": "<Project>\n  <Import Project=\"$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets\" Condition=\"Exists('$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets')\" />\n\n  <!-- The VSSDK immplements these targets. Since their name ends with OutputGroup,\n       these targets get run during design time builds per convention. If the Project\n       is not a VSIX project and sets $CreateVSIXContainer=false these targets should be \n       a no-op. However they dont check for that and that's a bug. To workaround, we override them\n       with empty targets and conditionally import these if CreateVSIXContainer is false.\n       Tracked by https://devdiv.visualstudio.com/DevDiv/_workitems?id=365685&fullScreen=false&_a=edit -->\n  <Target Name=\"VSIXIdentifierProjectOutputGroup\" />\n  <Target Name=\"VSIXNameProjectOutputGroup\" />\n</Project>"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Microsoft.VisualStudio.SlowCheetah.VS.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Library</OutputType>\n    <TargetFramework>net472</TargetFramework>\n    <IsPackable>false</IsPackable>\n    <Copyright>Copyright © Microsoft Corporation. All rights reserved.</Copyright>\n    <CreateVsixContainer>false</CreateVsixContainer>\n    <LangVersion>10.0</LangVersion>\n    <RuntimeIdentifier>win</RuntimeIdentifier>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"EnvDTE\" />\n    <PackageReference Include=\"Microsoft.IO.Redist\" />\n    <PackageReference Include=\"Microsoft.VSSDK.BuildTools\" PrivateAssets=\"all\" IncludeAssets=\"build; native; contentfiles; analyzers; buildtransitive\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.SDK\" />\n    <PackageReference Include=\"Microsoft.Web.Xdt\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Jdt\" />\n    <PackageReference Include=\"NuGet.VisualStudio\" />\n    <PackageReference Update=\"Nerdbank.GitVersioning\" PrivateAssets=\"all\" />\n    <PackageReference Update=\"StyleCop.Analyzers\" PrivateAssets=\"all\" />\n    <PackageReference Include=\"MessagePack\" />\n    <PackageReference Include=\"System.Text.Json\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Microsoft.VisualStudio.SlowCheetah\\Microsoft.VisualStudio.SlowCheetah.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Reference Include=\"Microsoft.Build\" />\n    <Reference Include=\"System.Design\" />\n    <Reference Include=\"System.Windows.Forms\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <VSCTCompile Include=\"SlowCheetah.vsct\">\n      <ResourceName>Menus.ctmenu</ResourceName>\n      <SubType>Designer</SubType>\n    </VSCTCompile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <Compile Update=\"Options\\AdvancedOptionsDialogPage.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Update=\"Options\\AdvancedOptionsUserControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Update=\"Options\\AdvancedOptionsUserControl.Designer.cs\">\n      <SubType>UserControl</SubType>\n      <DependentUpon>AdvancedOptionsUserControl.cs</DependentUpon>\n    </Compile>\n    <Compile Update=\"Options\\BaseOptionsDialogPage.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Update=\"Options\\OptionsDialogPage.cs\">\n      <SubType>Component</SubType>\n    </Compile>\n    <Compile Update=\"Options\\OptionsUserControl.cs\">\n      <SubType>UserControl</SubType>\n    </Compile>\n    <Compile Update=\"Options\\OptionsUserControl.Designer.cs\">\n      <SubType>UserControl</SubType>\n      <DependentUpon>OptionsUserControl.cs</DependentUpon>\n    </Compile>\n    <Compile Update=\"Resources\\Resources.Designer.cs\">\n      <AutoGen>True</AutoGen>\n      <DesignTime>True</DesignTime>\n      <DependentUpon>Resources.resx</DependentUpon>\n    </Compile>\n    <Compile Update=\"VSPackage.Designer.cs\">\n      <DesignTime>True</DesignTime>\n      <AutoGen>True</AutoGen>\n      <DependentUpon>VSPackage.resx</DependentUpon>\n    </Compile>\n  </ItemGroup>\n\n  <ItemGroup>\n    <EmbeddedResource Update=\"Options\\AdvancedOptionsUserControl.resx\">\n      <DependentUpon>AdvancedOptionsUserControl.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Options\\OptionsUserControl.resx\">\n      <DependentUpon>OptionsUserControl.cs</DependentUpon>\n      <SubType>Designer</SubType>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"Resources\\Resources.resx\">\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>Resources.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n    <EmbeddedResource Update=\"VSPackage.resx\">\n      <MergeWithCTO>true</MergeWithCTO>\n      <ManifestResourceName>VSPackage</ManifestResourceName>\n      <SubType>Designer</SubType>\n      <Generator>ResXFileCodeGenerator</Generator>\n      <LastGenOutput>VSPackage.Designer.cs</LastGenOutput>\n    </EmbeddedResource>\n  </ItemGroup>\n\n  <ItemGroup>\n    <None Update=\"Microsoft.VisualStudio.SlowCheetah.VS.pkgdef\">\n      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\n    </None>\n  </ItemGroup>\n\n  <Target Name=\"LinkNugetEmbeddableAssemblies\" DependsOnTargets=\"ResolveReferences\" AfterTargets=\"ResolveReferences\">\n    <ItemGroup>\n      <ReferencePath Condition=\"'%(FileName)' == 'Nuget.VisualStudio'\">\n        <EmbedInteropTypes>true</EmbedInteropTypes>\n      </ReferencePath>\n    </ItemGroup>\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BackgroundInstallationHandler.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using EnvDTE;\n    using Microsoft.VisualStudio.Shell;\n    using Microsoft.VisualStudio.Shell.Interop;\n    using Microsoft.VisualStudio.Threading;\n    using TPL = System.Threading.Tasks;\n\n    /// <summary>\n    /// Performs installation operations in the background.\n    /// </summary>\n    internal class BackgroundInstallationHandler : UserInstallationHandler\n    {\n        private static readonly HashSet<string> InstallTasks = new HashSet<string>(StringComparer.OrdinalIgnoreCase);\n        private static readonly object SyncObject = new object();\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BackgroundInstallationHandler\"/> class.\n        /// </summary>\n        /// <param name=\"successor\">The successor with the same package.</param>\n        public BackgroundInstallationHandler(IPackageHandler successor)\n            : base(successor)\n        {\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether the operation is an update or a new installation.\n        /// </summary>\n        public bool IsUpdate { get; set; } = false;\n\n        /// <inheritdoc/>\n        public override async TPL.Task ExecuteAsync(Project project)\n        {\n            await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();\n            string projName = project.UniqueName;\n            bool needInstall = true;\n            lock (SyncObject)\n            {\n                needInstall = InstallTasks.Add(projName);\n            }\n\n            if (needInstall)\n            {\n                string warningTitle = this.IsUpdate ? Resources.Resources.NugetUpdate_Title : Resources.Resources.NugetInstall_Title;\n                string warningMessage = this.IsUpdate ? Resources.Resources.NugetUpdate_Text : Resources.Resources.NugetInstall_Text;\n                if (await this.HasUserAcceptedWarningMessageAsync(warningTitle, warningMessage))\n                {\n                    // Gets the general output pane to inform user of installation\n                    IVsOutputWindowPane outputWindow = (IVsOutputWindowPane)await this.Package.GetServiceAsync(typeof(SVsGeneralOutputWindowPane));\n                    outputWindow?.OutputString(string.Format(CultureInfo.CurrentCulture, Resources.Resources.NugetInstall_InstallingOutput, project.Name) + Environment.NewLine);\n\n                    this.Package.JoinableTaskFactory.RunAsync(async () =>\n                    {\n                        await TPL.TaskScheduler.Default;\n\n                        string outputMessage = Resources.Resources.NugetInstall_FinishedOutput;\n                        try\n                        {\n                            await this.Successor.ExecuteAsync(project);\n                        }\n                        catch\n                        {\n                            outputMessage = Resources.Resources.NugetInstall_ErrorOutput;\n                            throw;\n                        }\n                        finally\n                        {\n                            lock (SyncObject)\n                            {\n                                InstallTasks.Remove(projName);\n                            }\n\n                            await this.Package.JoinableTaskFactory.SwitchToMainThreadAsync();\n                            outputWindow?.OutputString(string.Format(CultureInfo.CurrentCulture, outputMessage, project.Name) + Environment.NewLine);\n                        }\n                    }).Task.Forget();\n                }\n                else\n                {\n                    lock (SyncObject)\n                    {\n                        // If the user refuses to install, the task should not be added\n                        InstallTasks.Remove(projName);\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/BasePackageHandler.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using EnvDTE;\n    using Microsoft.VisualStudio.Shell;\n    using TPL = System.Threading.Tasks;\n\n    /// <summary>\n    /// Handles a function relating to the NuGet package.\n    /// </summary>\n    internal abstract class BasePackageHandler : IPackageHandler\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BasePackageHandler\"/> class.\n        /// </summary>\n        /// <param name=\"successor\">The successor.</param>\n        protected BasePackageHandler(IPackageHandler successor)\n        {\n            this.Successor = successor ?? throw new ArgumentNullException(nameof(successor));\n            if (successor.Package == null)\n            {\n                throw new ArgumentException(\"successor.Package must not be null\");\n            }\n\n            this.Package = this.Successor.Package;\n        }\n\n        /// <summary>\n        /// Gets the VS package.\n        /// </summary>\n        public AsyncPackage Package { get; }\n\n        /// <summary>\n        /// Gets the successor handler.\n        /// </summary>\n        protected IPackageHandler Successor { get; }\n\n        /// <inheritdoc/>\n        public abstract TPL.Task ExecuteAsync(Project project);\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/DialogInstallationHandler.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using EnvDTE;\n    using Microsoft.VisualStudio.Shell.Interop;\n    using TPL = System.Threading.Tasks;\n\n    /// <summary>\n    /// Performs installations while showing a wait dialog.\n    /// </summary>\n    internal class DialogInstallationHandler : UserInstallationHandler\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"DialogInstallationHandler\"/> class.\n        /// </summary>\n        /// <param name=\"successor\">The successor with the same package.</param>\n        public DialogInstallationHandler(IPackageHandler successor)\n            : base(successor)\n        {\n        }\n\n        /// <inheritdoc/>\n        public override async TPL.Task ExecuteAsync(Project project)\n        {\n            if (await this.HasUserAcceptedWarningMessageAsync(Resources.Resources.NugetUpdate_Title, Resources.Resources.NugetUpdate_Text))\n            {\n                // Creates dialog informing the user to wait for the installation to finish\n                IVsThreadedWaitDialogFactory twdFactory = await this.Package.GetServiceAsync(typeof(SVsThreadedWaitDialogFactory)) as IVsThreadedWaitDialogFactory;\n                IVsThreadedWaitDialog2 dialog = null;\n                twdFactory?.CreateInstance(out dialog);\n\n                string title = Resources.Resources.NugetUpdate_WaitTitle;\n                string text = Resources.Resources.NugetUpdate_WaitText;\n                dialog?.StartWaitDialog(title, text, null, null, null, 0, false, true);\n\n                try\n                {\n                    await this.Successor.ExecuteAsync(project);\n                }\n                finally\n                {\n                    // Closes the wait dialog. If the dialog failed, does nothing\n                    dialog?.EndWaitDialog(out int canceled);\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/EmptyHandler.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using EnvDTE;\n    using Microsoft.VisualStudio.Shell;\n    using TPL = System.Threading.Tasks;\n\n    /// <summary>\n    /// An empty handler that performs no actions.\n    /// </summary>\n    internal class EmptyHandler : IPackageHandler\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"EmptyHandler\"/> class.\n        /// </summary>\n        /// <param name=\"package\">VS package.</param>\n        public EmptyHandler(AsyncPackage package)\n        {\n            this.Package = package ?? throw new ArgumentNullException(nameof(package));\n        }\n\n        /// <inheritdoc/>\n        public AsyncPackage Package { get; }\n\n        /// <inheritdoc/>\n        public TPL.Task ExecuteAsync(Project project)\n        {\n            // Do nothing\n            return TPL.Task.CompletedTask;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/IPackageHandler.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using EnvDTE;\n    using Microsoft.VisualStudio.Shell;\n    using TPL = System.Threading.Tasks;\n\n    /// <summary>\n    /// Representes a handler of nuget package actions.\n    /// </summary>\n    internal interface IPackageHandler\n    {\n        /// <summary>\n        /// Gets the VS package.\n        /// </summary>\n        AsyncPackage Package { get; }\n\n        /// <summary>\n        /// Executes the function.\n        /// </summary>\n        /// <param name=\"project\">The project to peform actions on.</param>\n        /// <returns>A task that executes the function.</returns>\n        TPL.Task ExecuteAsync(Project project);\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/NuGetUninstaller.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using EnvDTE;\n    using Microsoft.VisualStudio.ComponentModelHost;\n    using Microsoft.VisualStudio.Shell;\n    using NuGet.VisualStudio;\n    using TPL = System.Threading.Tasks;\n\n    /// <summary>\n    /// Uninstalls older versions of the SlowCheetah NuGet package.\n    /// </summary>\n    internal class NuGetUninstaller : BasePackageHandler\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"NuGetUninstaller\"/> class.\n        /// </summary>\n        /// <param name=\"successor\">The successor with the same package.</param>\n        public NuGetUninstaller(IPackageHandler successor)\n            : base(successor)\n        {\n        }\n\n        /// <inheritdoc/>\n        public override async TPL.Task ExecuteAsync(Project project)\n        {\n            var componentModel = (IComponentModel)await this.Package.GetServiceAsync(typeof(SComponentModel));\n            IVsPackageUninstaller packageUninstaller = componentModel.GetService<IVsPackageUninstaller>();\n            packageUninstaller.UninstallPackage(project, SlowCheetahNuGetManager.OldPackageName, true);\n\n            await this.Successor.ExecuteAsync(project);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/NugetInstaller.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using EnvDTE;\n    using Microsoft.VisualStudio.ComponentModelHost;\n    using NuGet.VisualStudio;\n    using TPL = System.Threading.Tasks;\n\n    /// <summary>\n    /// Installs the latest SlowCheetah NuGet package.\n    /// </summary>\n    internal class NugetInstaller : BasePackageHandler\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"NugetInstaller\"/> class.\n        /// </summary>\n        /// <param name=\"successor\">The successor with the same package.</param>\n        public NugetInstaller(IPackageHandler successor)\n            : base(successor)\n        {\n        }\n\n        /// <inheritdoc/>\n        public override async TPL.Task ExecuteAsync(Project project)\n        {\n            var componentModel = (IComponentModel)await this.Package.GetServiceAsync(typeof(SComponentModel));\n            IVsPackageInstaller packageInstaller = componentModel.GetService<IVsPackageInstaller>();\n            packageInstaller.InstallPackage(\n                null,\n                project,\n                SlowCheetahNuGetManager.PackageName,\n                version: (string)null, // install latest stable version\n                ignoreDependencies: false);\n\n            await this.Successor.ExecuteAsync(project);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/TargetsUninstaller.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System.Linq;\n    using EnvDTE;\n    using Microsoft.Build.Construction;\n    using TPL = System.Threading.Tasks;\n\n    /// <summary>\n    /// Uninstalls old SlowCheetah targets from the user's project file.\n    /// </summary>\n    internal class TargetsUninstaller : BasePackageHandler\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TargetsUninstaller\"/> class.\n        /// </summary>\n        /// <param name=\"successor\">The successor with the same package.</param>\n        public TargetsUninstaller(IPackageHandler successor)\n            : base(successor)\n        {\n        }\n\n        /// <inheritdoc/>\n        public override async TPL.Task ExecuteAsync(Project project)\n        {\n            // We handle any NuGet package logic before editing the project file\n            await this.Successor.ExecuteAsync(project);\n\n            project.Save();\n            ProjectRootElement projectRoot = ProjectRootElement.Open(project.FullName);\n            foreach (ProjectPropertyGroupElement propertyGroup in projectRoot.PropertyGroups.Where(pg => pg.Label.Equals(\"SlowCheetah\")))\n            {\n                projectRoot.RemoveChild(propertyGroup);\n            }\n\n            foreach (ProjectImportElement import in projectRoot.Imports.Where(i => i.Label == \"SlowCheetah\" || i.Project == \"$(SlowCheetahTargets)\"))\n            {\n                projectRoot.RemoveChild(import);\n            }\n\n            projectRoot.Save();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/PackageHandlers/UserInstallationHandler.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Threading.Tasks;\n    using Microsoft.VisualStudio;\n    using Microsoft.VisualStudio.Shell.Interop;\n\n    /// <summary>\n    /// Represents a handler that requires user input to install/uninstall packages.\n    /// </summary>\n    internal abstract class UserInstallationHandler : BasePackageHandler\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"UserInstallationHandler\"/> class.\n        /// </summary>\n        /// <param name=\"successor\">The successor with the same package.</param>\n        public UserInstallationHandler(IPackageHandler successor)\n            : base(successor)\n        {\n        }\n\n        /// <summary>\n        ///  Shows a warning message that the user must accept to continue.\n        /// </summary>\n        /// <param name=\"title\">The title of the message box.</param>\n        /// <param name=\"message\">The message to be shown.</param>\n        /// <returns>True if the user has accepted the warning message.</returns>\n        protected async Task<bool> HasUserAcceptedWarningMessageAsync(string title, string message)\n        {\n            var shell = (IVsUIShell)await this.Package.GetServiceAsync(typeof(SVsUIShell));\n\n            if (shell != null)\n            {\n                // Show a yes or no message box with the given title and message\n                Guid compClass = Guid.Empty;\n                if (ErrorHandler.Succeeded(shell.ShowMessageBox(0, ref compClass, title, message, null, 0, OLEMSGBUTTON.OLEMSGBUTTON_YESNO, OLEMSGDEFBUTTON.OLEMSGDEFBUTTON_FIRST, OLEMSGICON.OLEMSGICON_WARNING, 1, out int result)))\n                {\n                    return result == (int)VSConstants.MessageBoxResult.IDYES;\n                }\n            }\n\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/SlowCheetahNuGetManager.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Collections.Generic;\n    using EnvDTE;\n    using Microsoft.VisualStudio;\n    using Microsoft.VisualStudio.ComponentModelHost;\n    using Microsoft.VisualStudio.Shell;\n    using Microsoft.VisualStudio.Shell.Interop;\n    using NuGet.VisualStudio;\n    using TPL = System.Threading.Tasks;\n\n    /// <summary>\n    /// Manages installations of the SlowCheetah NuGet package in the project.\n    /// </summary>\n    public class SlowCheetahNuGetManager\n    {\n        /// <summary>\n        /// The name of the SlowCheetah NuGet package.\n        /// </summary>\n        internal static readonly string PackageName = \"Microsoft.VisualStudio.SlowCheetah\";\n\n        /// <summary>\n        /// The previous name of the SlowCheetah NuGet package.\n        /// </summary>\n        internal static readonly string OldPackageName = \"SlowCheetah\";\n\n        private static readonly Version LastUnsupportedVersion = new Version(2, 5, 15);\n\n        // Fields for checking NuGet support\n        private static readonly Guid INuGetPackageManagerGuid = Guid.Parse(\"FD2DC07E-9054-4115-B86B-26A9F9C1F00B\");\n        private static readonly string SupportedCapabilities = \"AssemblyReferences + DeclaredSourceItems + UserSourceItems\";\n        private static readonly string UnsupportedCapabilities = \"SharedAssetsProject\";\n        private static readonly HashSet<string> SupportedProjectTypes = new HashSet<string>(StringComparer.OrdinalIgnoreCase)\n            {\n                VsProjectTypes.WebSiteProjectTypeGuid,\n                VsProjectTypes.CsharpProjectTypeGuid,\n                VsProjectTypes.VbProjectTypeGuid,\n                VsProjectTypes.CppProjectTypeGuid,\n                VsProjectTypes.JsProjectTypeGuid,\n                VsProjectTypes.FsharpProjectTypeGuid,\n                VsProjectTypes.NemerleProjectTypeGuid,\n                VsProjectTypes.WixProjectTypeGuid,\n                VsProjectTypes.SynergexProjectTypeGuid,\n                VsProjectTypes.NomadForVisualStudioProjectTypeGuid,\n                VsProjectTypes.TDSProjectTypeGuid,\n                VsProjectTypes.DxJsProjectTypeGuid,\n                VsProjectTypes.DeploymentProjectTypeGuid,\n                VsProjectTypes.CosmosProjectTypeGuid,\n                VsProjectTypes.ManagementPackProjectTypeGuid,\n            };\n\n        private readonly AsyncPackage package;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SlowCheetahNuGetManager\"/> class.\n        /// </summary>\n        /// <param name=\"package\">VS Package.</param>\n        public SlowCheetahNuGetManager(AsyncPackage package)\n        {\n            this.package = package ?? throw new ArgumentNullException(nameof(package));\n        }\n\n        /// <summary>\n        /// Checks if the current project supports NuGet.\n        /// </summary>\n        /// <param name=\"hierarchy\">Hierarchy of the project to be verified.</param>\n        /// <returns>True if the project supports NuGet.</returns>\n        /// <remarks>This implementation is derived of the internal NuGet method IsSupported\n        /// https://github.com/NuGet/NuGet.Client/blob/dev/src/NuGet.Clients/NuGet.PackageManagement.VisualStudio/Utility/EnvDTEProjectUtility.cs#L441\n        /// This should be removed when NuGet adds this to their public API.</remarks>\n        public bool ProjectSupportsNuget(IVsHierarchy hierarchy)\n        {\n            if (hierarchy == null)\n            {\n                throw new ArgumentNullException(nameof(hierarchy));\n            }\n\n            if (SupportsINugetProjectSystem(hierarchy))\n            {\n                return true;\n            }\n\n            try\n            {\n                if (hierarchy.IsCapabilityMatch(SupportedCapabilities))\n                {\n                    return true;\n                }\n\n                if (hierarchy.IsCapabilityMatch(UnsupportedCapabilities))\n                {\n                    return false;\n                }\n            }\n            catch (Exception ex) when (!ErrorHandler.IsCriticalException(ex))\n            {\n                // Catch exceptions when hierarchy doesn't support the above methods\n            }\n\n            Project project = PackageUtilities.GetAutomationFromHierarchy<Project>(hierarchy, (uint)VSConstants.VSITEMID.Root);\n\n            return project.Kind != null && SupportedProjectTypes.Contains(project.Kind);\n        }\n\n        /// <summary>\n        /// Checks the SlowCheetah NuGet package on current project.\n        /// If no version is installed, prompts for install of latest version;\n        /// if an older version is detected, shows update information.\n        /// </summary>\n        /// <param name=\"hierarchy\">Hierarchy of the project to be verified.</param>\n        /// <returns>A <see cref=\"TPL.Task\"/> representing the asynchronous operation.</returns>\n        public async TPL.Task CheckSlowCheetahInstallationAsync(IVsHierarchy hierarchy)\n        {\n            if (hierarchy == null)\n            {\n                throw new ArgumentNullException(nameof(hierarchy));\n            }\n\n            Project currentProject = PackageUtilities.GetAutomationFromHierarchy<Project>(hierarchy, (uint)VSConstants.VSITEMID.Root);\n\n            // Whether an older version of SlowCheetah is installed\n            // through manual imports in the user's project file\n            bool isOldScInstalled = IsOldSlowCheetahInstalled(hierarchy as IVsBuildPropertyStorage);\n\n            // Wheter the old NuGet package is installed\n            bool isOldScPackageInstalled = this.IsPackageInstalled(currentProject, OldPackageName);\n\n            // Wether the newest NuGet package is installed\n            bool isNewScPackageInstalled = this.IsPackageInstalled(currentProject, PackageName);\n\n            IPackageHandler plan = new EmptyHandler(this.package);\n\n            if (!isNewScPackageInstalled)\n            {\n                // If the new package is not present, it will need to be installed\n                plan = new NugetInstaller(plan);\n            }\n\n            if (isOldScPackageInstalled)\n            {\n                // If the old package is present, it will need to be uninstalled\n                plan = new NuGetUninstaller(plan);\n            }\n\n            if (isOldScInstalled)\n            {\n                // If the older targets are installed, they need to be removed\n                // This needs to be done through a wait dialog since the project file will be altered\n                plan = new TargetsUninstaller(plan);\n                plan = new DialogInstallationHandler(plan);\n            }\n            else if (!(plan is EmptyHandler))\n            {\n                // If there are actions to execute and no targets are found,\n                // perform these actions in the background\n                plan = new BackgroundInstallationHandler(plan)\n                {\n                    // If the old package is installed, this is an update operation\n                    IsUpdate = isOldScPackageInstalled,\n                };\n            }\n\n            await plan.ExecuteAsync(currentProject);\n        }\n\n        private static IVsPackageInstallerServices GetInstallerServices(IServiceProvider package)\n        {\n            var componentModel = (IComponentModel)package.GetService(typeof(SComponentModel));\n            IVsPackageInstallerServices installerServices = componentModel.GetService<IVsPackageInstallerServices>();\n            return installerServices;\n        }\n\n        private static bool IsOldSlowCheetahInstalled(IVsBuildPropertyStorage buildPropertyStorage)\n        {\n            buildPropertyStorage.GetPropertyValue(\"SlowCheetahImport\", null, (uint)_PersistStorageType.PST_PROJECT_FILE, out string propertyValue);\n            if (!string.IsNullOrEmpty(propertyValue))\n            {\n                return true;\n            }\n\n            buildPropertyStorage.GetPropertyValue(\"SlowCheetahTargets\", null, (uint)_PersistStorageType.PST_PROJECT_FILE, out propertyValue);\n            if (!string.IsNullOrEmpty(propertyValue))\n            {\n                return true;\n            }\n\n            return false;\n        }\n\n        private static bool SupportsINugetProjectSystem(IVsHierarchy hierarchy)\n        {\n            var vsProject = hierarchy as IVsProject;\n            if (vsProject == null)\n            {\n                return false;\n            }\n\n            vsProject.GetItemContext(\n                (uint)VSConstants.VSITEMID.Root,\n                out Microsoft.VisualStudio.OLE.Interop.IServiceProvider serviceProvider);\n            if (serviceProvider == null)\n            {\n                return false;\n            }\n\n            using (var sp = new ServiceProvider(serviceProvider))\n            {\n                var retValue = sp.GetService(INuGetPackageManagerGuid);\n                return retValue != null;\n            }\n        }\n\n        private bool IsPackageInstalled(Project project, string packageName)\n        {\n            IVsPackageInstallerServices installerServices = GetInstallerServices(this.package);\n            return installerServices.IsPackageInstalled(project, packageName);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/NugetHandler/VsProjectTypes.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    /// <summary>\n    /// VS project type GUIDs.\n    /// </summary>\n    [System.Diagnostics.CodeAnalysis.SuppressMessage(\"StyleCop.CSharp.DocumentationRules\", \"SA1600:Elements must be documented\", Justification = \"Static collection of GUIDs\")]\n    internal static class VsProjectTypes\n    {\n#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member\n        // Project type guids\n        public const string WebApplicationProjectTypeGuid = \"{349C5851-65DF-11DA-9384-00065B846F21}\";\n        public const string WebSiteProjectTypeGuid = \"{E24C65DC-7377-472B-9ABA-BC803B73C61A}\";\n        public const string CsharpProjectTypeGuid = \"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\";\n        public const string VbProjectTypeGuid = \"{F184B08F-C81C-45F6-A57F-5ABD9991F28F}\";\n        public const string CppProjectTypeGuid = \"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\";\n        public const string FsharpProjectTypeGuid = \"{F2A71F9B-5D33-465A-A702-920D77279786}\";\n        public const string JsProjectTypeGuid = \"{262852C6-CD72-467D-83FE-5EEB1973A190}\";\n        public const string WixProjectTypeGuid = \"{930C7802-8A8C-48F9-8165-68863BCCD9DD}\";\n        public const string LightSwitchProjectTypeGuid = \"{ECD6D718-D1CF-4119-97F3-97C25A0DFBF9}\";\n        public const string NemerleProjectTypeGuid = \"{edcc3b85-0bad-11db-bc1a-00112fde8b61}\";\n        public const string InstallShieldLimitedEditionTypeGuid = \"{FBB4BD86-BF63-432a-A6FB-6CF3A1288F83}\";\n        public const string WindowsStoreProjectTypeGuid = \"{BC8A1FFA-BEE3-4634-8014-F334798102B3}\";\n        public const string SynergexProjectTypeGuid = \"{BBD0F5D1-1CC4-42fd-BA4C-A96779C64378}\";\n        public const string NomadForVisualStudioProjectTypeGuid = \"{4B160523-D178-4405-B438-79FB67C8D499}\";\n        public const string TDSProjectTypeGuid = \"{CAA73BB0-EF22-4d79-A57E-DF67B3BA9C80}\";\n        public const string TDSItemTypeGuid = \"{6877B9B0-CDF7-4ff2-BC09-9608387B37F2}\";\n        public const string DxJsProjectTypeGuid = \"{1B19158F-E398-40A6-8E3B-350508E125F1}\";\n        public const string DeploymentProjectTypeGuid = \"{151d2e53-a2c4-4d7d-83fe-d05416ebd58e}\";\n        public const string CosmosProjectTypeGuid = \"{471EC4BB-E47E-4229-A789-D1F5F83B52D4}\";\n        public const string ManagementPackProjectTypeGuid = \"{d4b43eb3-688b-4eee-86bd-088f0b28abb3}\";\n\n        // Copied from EnvDTE.Constants since that type can't be embedded\n        public const string VsProjectItemKindPhysicalFile = \"{6BB5F8EE-4483-11D3-8BCF-00C04F8EC28C}\";\n        public const string VsProjectItemKindPhysicalFolder = \"{6BB5F8EF-4483-11D3-8BCF-00C04F8EC28C}\";\n        public const string VsProjectItemKindSolutionFolder = \"{66A26720-8FB5-11D2-AA7E-00C04F688DDE}\";\n        public const string VsProjectItemKindSolutionItem = \"{66A26722-8FB5-11D2-AA7E-00C04F688DDE}\";\n        public const string VsWindowKindSolutionExplorer = \"{3AE79031-E1BC-11D0-8F78-00A0C9110057}\";\n        public const string VsProjectKindMisc = \"{66A2671D-8FB5-11D2-AA7E-00C04F688DDE}\";\n\n        // All unloaded projects have this Kind value\n        public const string UnloadedProjectTypeGuid = \"{67294A52-A4F0-11D2-AA88-00C04F688DDE}\";\n#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsDialogPage.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Diagnostics;\n    using System.Windows.Forms;\n    using Microsoft.VisualStudio;\n    using Microsoft.VisualStudio.Shell.Interop;\n    using Microsoft.Win32;\n\n    /// <summary>\n    /// Advanced Options Page for SlowCheetah.\n    /// </summary>\n    internal class AdvancedOptionsDialogPage : BaseOptionsDialogPage\n    {\n        private const string RegPreviewCmdLine = \"PreviewCmdLine\";\n        private const string RegPreviewExe = \"PreviewExe\";\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AdvancedOptionsDialogPage\"/> class.\n        /// Constructor called by VSIP just in time when user wants to view this tools, options page.\n        /// </summary>\n        public AdvancedOptionsDialogPage()\n        {\n            this.InitializeDefaults();\n        }\n\n        /// <summary>\n        /// Gets or sets the exe path for the diff tool used to preview transformations.\n        /// </summary>\n        public string PreviewToolExecutablePath { get; set; }\n\n        /// <summary>\n        /// Gets or sets the required command on execution of the preview tool.\n        /// </summary>\n        public string PreviewToolCommandLine { get; set; }\n\n        /// <inheritdoc/>\n        protected override IWin32Window Window\n        {\n            get\n            {\n                var optionControl = new AdvancedOptionsUserControl();\n                optionControl.Initialize(this);\n                return optionControl;\n            }\n        }\n\n        /// <inheritdoc/>\n        public override void SaveSettingsToXml(IVsSettingsWriter writer)\n        {\n            try\n            {\n                base.SaveSettingsToXml(writer);\n\n                // Write settings to XML\n                writer.WriteSettingString(RegPreviewExe, this.PreviewToolExecutablePath);\n                writer.WriteSettingString(RegPreviewCmdLine, this.PreviewToolCommandLine);\n            }\n            catch (Exception e)\n            {\n                Debug.Assert(false, \"Error exporting Slow Cheetah settings: \" + e.Message);\n            }\n        }\n\n        /// <inheritdoc/>\n        public override void LoadSettingsFromXml(IVsSettingsReader reader)\n        {\n            try\n            {\n                this.InitializeDefaults();\n                if (ErrorHandler.Succeeded(reader.ReadSettingString(RegPreviewExe, out string exePath)) && !string.IsNullOrEmpty(exePath))\n                {\n                    this.PreviewToolExecutablePath = exePath;\n                }\n\n                if (ErrorHandler.Succeeded(reader.ReadSettingString(RegPreviewCmdLine, out string exeCmdLine)) && !string.IsNullOrEmpty(exeCmdLine))\n                {\n                    this.PreviewToolCommandLine = exeCmdLine;\n                }\n            }\n            catch (Exception e)\n            {\n                Debug.Assert(false, \"Error importing Slow Cheetah settings: \" + e.Message);\n            }\n        }\n\n        /// <summary>\n        /// Load Tools-->Options settings from registry. Defaults are set in constructor so these\n        /// will just override those values.\n        /// </summary>\n        public override void LoadSettingsFromStorage()\n        {\n            try\n            {\n                this.InitializeDefaults();\n                using (RegistryKey userRootKey = SlowCheetahPackage.OurPackage.UserRegistryRoot)\n                using (RegistryKey cheetahKey = userRootKey.OpenSubKey(RegOptionsKey))\n                {\n                    if (cheetahKey != null)\n                    {\n                        object previewTool = cheetahKey.GetValue(RegPreviewExe);\n                        if (previewTool != null && (previewTool is string))\n                        {\n                            this.PreviewToolExecutablePath = (string)previewTool;\n                        }\n\n                        object previewCmdLine = cheetahKey.GetValue(RegPreviewCmdLine);\n                        if (previewCmdLine != null && (previewCmdLine is string))\n                        {\n                            this.PreviewToolCommandLine = (string)previewCmdLine;\n                        }\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                Debug.Assert(false, \"Error reading Slow Cheetah settings from the registry: \" + e.Message);\n            }\n        }\n\n        /// <summary>\n        /// Save Tools-->Options settings to registry.\n        /// </summary>\n        public override void SaveSettingsToStorage()\n        {\n            try\n            {\n                base.SaveSettingsToStorage();\n                using (RegistryKey userRootKey = SlowCheetahPackage.OurPackage.UserRegistryRoot)\n                using (RegistryKey cheetahKey = userRootKey.CreateSubKey(RegOptionsKey))\n                {\n                    cheetahKey.SetValue(RegPreviewExe, this.PreviewToolExecutablePath);\n                    cheetahKey.SetValue(RegPreviewCmdLine, this.PreviewToolCommandLine);\n                }\n            }\n            catch (Exception e)\n            {\n                Debug.Assert(false, \"Error saving Slow Cheetah settings to the registry:\" + e.Message);\n            }\n        }\n\n        /// <summary>\n        /// Sets up our default values.\n        /// </summary>\n        private void InitializeDefaults()\n        {\n            this.PreviewToolExecutablePath = string.Empty;\n            this.PreviewToolCommandLine = \"{0} {1}\";\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsUserControl.Designer.cs",
    "content": "﻿namespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    partial class AdvancedOptionsUserControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AdvancedOptionsUserControl));\n            this.AdvancedGroupBox = new System.Windows.Forms.GroupBox();\n            this.PreviewToolNameLabel = new System.Windows.Forms.Label();\n            this.PreviewToolPathTextbox = new System.Windows.Forms.TextBox();\n            this.OpenToolFileDialogButton = new System.Windows.Forms.Button();\n            this.PreviewCommandLineLabel = new System.Windows.Forms.Label();\n            this.PreviewToolCommandLineTextbox = new System.Windows.Forms.TextBox();\n            this.CommandLineExplanationLabel = new System.Windows.Forms.Label();\n            this.OpenToolFileDialog = new System.Windows.Forms.OpenFileDialog();\n            this.AdvancedGroupBox.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // AdvancedGroupBox\n            // \n            resources.ApplyResources(this.AdvancedGroupBox, \"AdvancedGroupBox\");\n            this.AdvancedGroupBox.Controls.Add(this.PreviewToolNameLabel);\n            this.AdvancedGroupBox.Controls.Add(this.PreviewToolPathTextbox);\n            this.AdvancedGroupBox.Controls.Add(this.OpenToolFileDialogButton);\n            this.AdvancedGroupBox.Controls.Add(this.PreviewCommandLineLabel);\n            this.AdvancedGroupBox.Controls.Add(this.PreviewToolCommandLineTextbox);\n            this.AdvancedGroupBox.Controls.Add(this.CommandLineExplanationLabel);\n            this.AdvancedGroupBox.Name = \"AdvancedGroupBox\";\n            this.AdvancedGroupBox.TabStop = false;\n            // \n            // PreviewToolNameLabel\n            // \n            resources.ApplyResources(this.PreviewToolNameLabel, \"PreviewToolNameLabel\");\n            this.PreviewToolNameLabel.Name = \"PreviewToolNameLabel\";\n            // \n            // PreviewToolPathTextbox\n            // \n            resources.ApplyResources(this.PreviewToolPathTextbox, \"PreviewToolPathTextbox\");\n            this.PreviewToolPathTextbox.Name = \"PreviewToolPathTextbox\";\n            this.PreviewToolPathTextbox.Leave += new System.EventHandler(this.PreviewToolPathTextbox_Leave);\n            // \n            // OpenToolFileDialogButton\n            // \n            resources.ApplyResources(this.OpenToolFileDialogButton, \"OpenToolFileDialogButton\");\n            this.OpenToolFileDialogButton.Name = \"OpenToolFileDialogButton\";\n            this.OpenToolFileDialogButton.UseVisualStyleBackColor = true;\n            this.OpenToolFileDialogButton.Click += new System.EventHandler(this.OpenToolFileDialogButton_Click);\n            // \n            // PreviewCommandLineLabel\n            // \n            resources.ApplyResources(this.PreviewCommandLineLabel, \"PreviewCommandLineLabel\");\n            this.PreviewCommandLineLabel.Name = \"PreviewCommandLineLabel\";\n            // \n            // PreviewToolCommandLineTextbox\n            // \n            resources.ApplyResources(this.PreviewToolCommandLineTextbox, \"PreviewToolCommandLineTextbox\");\n            this.PreviewToolCommandLineTextbox.Name = \"PreviewToolCommandLineTextbox\";\n            this.PreviewToolCommandLineTextbox.Leave += new System.EventHandler(this.PreviewToolCommandLineTextbox_Leave);\n            // \n            // CommandLineExplanationLabel\n            // \n            resources.ApplyResources(this.CommandLineExplanationLabel, \"CommandLineExplanationLabel\");\n            this.CommandLineExplanationLabel.Name = \"CommandLineExplanationLabel\";\n            // \n            // AdvancedOptionsUserControl\n            // \n            resources.ApplyResources(this, \"$this\");\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.AdvancedGroupBox);\n            this.Name = \"AdvancedOptionsUserControl\";\n            this.AdvancedGroupBox.ResumeLayout(false);\n            this.AdvancedGroupBox.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.GroupBox AdvancedGroupBox;\n        private System.Windows.Forms.Label PreviewToolNameLabel;\n        private System.Windows.Forms.TextBox PreviewToolPathTextbox;\n        private System.Windows.Forms.TextBox PreviewToolCommandLineTextbox;\n        private System.Windows.Forms.Label PreviewCommandLineLabel;\n        private System.Windows.Forms.Button OpenToolFileDialogButton;\n        private System.Windows.Forms.Label CommandLineExplanationLabel;\n        private System.Windows.Forms.OpenFileDialog OpenToolFileDialog;\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsUserControl.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System.IO;\n    using System.Windows.Forms;\n\n    /// <summary>\n    /// The UI for the advanced section of the options page.\n    /// </summary>\n    public partial class AdvancedOptionsUserControl : UserControl\n    {\n        private AdvancedOptionsDialogPage advancedOptionsPage = null;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AdvancedOptionsUserControl\"/> class.\n        /// </summary>\n        public AdvancedOptionsUserControl()\n        {\n            this.InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initialized the Advanced Options Page Control.\n        /// </summary>\n        /// <param name=\"advancedOptionsPage\">The options page that corresponds to this control.</param>\n        internal void Initialize(AdvancedOptionsDialogPage advancedOptionsPage)\n        {\n            this.advancedOptionsPage = advancedOptionsPage;\n            this.PreviewToolPathTextbox.Text = advancedOptionsPage.PreviewToolExecutablePath;\n            this.PreviewToolCommandLineTextbox.Text = advancedOptionsPage.PreviewToolCommandLine;\n        }\n\n        private void PreviewToolPathTextbox_Leave(object sender, System.EventArgs e)\n        {\n            if (this.advancedOptionsPage != null)\n            {\n                this.advancedOptionsPage.PreviewToolExecutablePath = this.PreviewToolPathTextbox.Text;\n            }\n        }\n\n        private void PreviewToolCommandLineTextbox_Leave(object sender, System.EventArgs e)\n        {\n            if (this.advancedOptionsPage != null)\n            {\n                this.advancedOptionsPage.PreviewToolCommandLine = this.PreviewToolCommandLineTextbox.Text;\n            }\n        }\n\n        private void OpenToolFileDialogButton_Click(object sender, System.EventArgs e)\n        {\n            if (!string.IsNullOrEmpty(this.PreviewToolPathTextbox.Text) && File.Exists(this.PreviewToolPathTextbox.Text))\n            {\n                this.OpenToolFileDialog.InitialDirectory = Path.GetDirectoryName(this.PreviewToolPathTextbox.Text);\n            }\n\n            if (this.OpenToolFileDialog.ShowDialog() == DialogResult.OK)\n            {\n                this.PreviewToolPathTextbox.Text = this.OpenToolFileDialog.FileName;\n                if (this.advancedOptionsPage != null)\n                {\n                    this.advancedOptionsPage.PreviewToolExecutablePath = this.PreviewToolPathTextbox.Text;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Options/AdvancedOptionsUserControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"mscorlib\" name=\"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"AdvancedGroupBox.AutoSize\" type=\"System.Boolean, mscorlib\">\n    <value>True</value>\n  </data>\n  <data name=\"PreviewToolNameLabel.AutoSize\" type=\"System.Boolean, mscorlib\">\n    <value>True</value>\n  </data>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"PreviewToolNameLabel.Font\" type=\"System.Drawing.Font, System.Drawing\">\n    <value>Microsoft Sans Serif, 8.25pt</value>\n  </data>\n  <data name=\"PreviewToolNameLabel.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>6, 16</value>\n  </data>\n  <data name=\"PreviewToolNameLabel.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>100, 13</value>\n  </data>\n  <data name=\"PreviewToolNameLabel.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>0</value>\n  </data>\n  <data name=\"PreviewToolNameLabel.Text\" xml:space=\"preserve\">\n    <value>Preview Tool P&amp;ath: </value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolNameLabel.Name\" xml:space=\"preserve\">\n    <value>PreviewToolNameLabel</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolNameLabel.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolNameLabel.Parent\" xml:space=\"preserve\">\n    <value>AdvancedGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolNameLabel.ZOrder\" xml:space=\"preserve\">\n    <value>0</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"PreviewToolPathTextbox.Anchor\" type=\"System.Windows.Forms.AnchorStyles, System.Windows.Forms\">\n    <value>Top, Left, Right</value>\n  </data>\n  <data name=\"PreviewToolPathTextbox.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>6, 32</value>\n  </data>\n  <data name=\"PreviewToolPathTextbox.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>336, 20</value>\n  </data>\n  <data name=\"PreviewToolPathTextbox.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>1</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolPathTextbox.Name\" xml:space=\"preserve\">\n    <value>PreviewToolPathTextbox</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolPathTextbox.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolPathTextbox.Parent\" xml:space=\"preserve\">\n    <value>AdvancedGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolPathTextbox.ZOrder\" xml:space=\"preserve\">\n    <value>1</value>\n  </data>\n  <data name=\"OpenToolFileDialogButton.Anchor\" type=\"System.Windows.Forms.AnchorStyles, System.Windows.Forms\">\n    <value>Top, Right</value>\n  </data>\n  <data name=\"OpenToolFileDialogButton.AutoSize\" type=\"System.Boolean, mscorlib\">\n    <value>True</value>\n  </data>\n  <data name=\"OpenToolFileDialogButton.AutoSizeMode\" type=\"System.Windows.Forms.AutoSizeMode, System.Windows.Forms\">\n    <value>GrowAndShrink</value>\n  </data>\n  <data name=\"OpenToolFileDialogButton.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>348, 30</value>\n  </data>\n  <data name=\"OpenToolFileDialogButton.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>26, 23</value>\n  </data>\n  <data name=\"OpenToolFileDialogButton.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>2</value>\n  </data>\n  <data name=\"OpenToolFileDialogButton.Text\" xml:space=\"preserve\">\n    <value>...</value>\n  </data>\n  <data name=\"&gt;&gt;OpenToolFileDialogButton.Name\" xml:space=\"preserve\">\n    <value>OpenToolFileDialogButton</value>\n  </data>\n  <data name=\"&gt;&gt;OpenToolFileDialogButton.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;OpenToolFileDialogButton.Parent\" xml:space=\"preserve\">\n    <value>AdvancedGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;OpenToolFileDialogButton.ZOrder\" xml:space=\"preserve\">\n    <value>2</value>\n  </data>\n  <data name=\"PreviewCommandLineLabel.AutoSize\" type=\"System.Boolean, mscorlib\">\n    <value>True</value>\n  </data>\n  <data name=\"PreviewCommandLineLabel.Font\" type=\"System.Drawing.Font, System.Drawing\">\n    <value>Microsoft Sans Serif, 8.25pt</value>\n  </data>\n  <data name=\"PreviewCommandLineLabel.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>6, 55</value>\n  </data>\n  <data name=\"PreviewCommandLineLabel.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>148, 13</value>\n  </data>\n  <data name=\"PreviewCommandLineLabel.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>3</value>\n  </data>\n  <data name=\"PreviewCommandLineLabel.Text\" xml:space=\"preserve\">\n    <value>Preview Tool C&amp;ommand Line: </value>\n  </data>\n  <data name=\"&gt;&gt;PreviewCommandLineLabel.Name\" xml:space=\"preserve\">\n    <value>PreviewCommandLineLabel</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewCommandLineLabel.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewCommandLineLabel.Parent\" xml:space=\"preserve\">\n    <value>AdvancedGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewCommandLineLabel.ZOrder\" xml:space=\"preserve\">\n    <value>3</value>\n  </data>\n  <data name=\"PreviewToolCommandLineTextbox.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>6, 71</value>\n  </data>\n  <data name=\"PreviewToolCommandLineTextbox.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>239, 20</value>\n  </data>\n  <data name=\"PreviewToolCommandLineTextbox.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>4</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolCommandLineTextbox.Name\" xml:space=\"preserve\">\n    <value>PreviewToolCommandLineTextbox</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolCommandLineTextbox.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolCommandLineTextbox.Parent\" xml:space=\"preserve\">\n    <value>AdvancedGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;PreviewToolCommandLineTextbox.ZOrder\" xml:space=\"preserve\">\n    <value>4</value>\n  </data>\n  <data name=\"CommandLineExplanationLabel.AutoSize\" type=\"System.Boolean, mscorlib\">\n    <value>True</value>\n  </data>\n  <data name=\"CommandLineExplanationLabel.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>6, 94</value>\n  </data>\n  <data name=\"CommandLineExplanationLabel.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>242, 26</value>\n  </data>\n  <data name=\"CommandLineExplanationLabel.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>5</value>\n  </data>\n  <data name=\"CommandLineExplanationLabel.Text\" xml:space=\"preserve\">\n    <value>The command line arguments for the preview tool.\n{0} is the source file, {1} is the transformed file.</value>\n  </data>\n  <data name=\"&gt;&gt;CommandLineExplanationLabel.Name\" xml:space=\"preserve\">\n    <value>CommandLineExplanationLabel</value>\n  </data>\n  <data name=\"&gt;&gt;CommandLineExplanationLabel.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;CommandLineExplanationLabel.Parent\" xml:space=\"preserve\">\n    <value>AdvancedGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;CommandLineExplanationLabel.ZOrder\" xml:space=\"preserve\">\n    <value>5</value>\n  </data>\n  <data name=\"AdvancedGroupBox.Dock\" type=\"System.Windows.Forms.DockStyle, System.Windows.Forms\">\n    <value>Top</value>\n  </data>\n  <data name=\"AdvancedGroupBox.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>0, 0</value>\n  </data>\n  <data name=\"AdvancedGroupBox.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>380, 136</value>\n  </data>\n  <data name=\"AdvancedGroupBox.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>0</value>\n  </data>\n  <data name=\"AdvancedGroupBox.Text\" xml:space=\"preserve\">\n    <value>Preview Transform Tool</value>\n  </data>\n  <data name=\"&gt;&gt;AdvancedGroupBox.Name\" xml:space=\"preserve\">\n    <value>AdvancedGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;AdvancedGroupBox.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;AdvancedGroupBox.Parent\" xml:space=\"preserve\">\n    <value>$this</value>\n  </data>\n  <data name=\"&gt;&gt;AdvancedGroupBox.ZOrder\" xml:space=\"preserve\">\n    <value>0</value>\n  </data>\n  <metadata name=\"OpenToolFileDialog.TrayLocation\" type=\"System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n    <value>17, 17</value>\n  </metadata>\n  <metadata name=\"$this.Localizable\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <data name=\"$this.AutoScaleDimensions\" type=\"System.Drawing.SizeF, System.Drawing\">\n    <value>6, 13</value>\n  </data>\n  <data name=\"$this.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>380, 190</value>\n  </data>\n  <data name=\"&gt;&gt;OpenToolFileDialog.Name\" xml:space=\"preserve\">\n    <value>OpenToolFileDialog</value>\n  </data>\n  <data name=\"&gt;&gt;OpenToolFileDialog.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.OpenFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;$this.Name\" xml:space=\"preserve\">\n    <value>AdvancedOptionsUserControl</value>\n  </data>\n  <data name=\"&gt;&gt;$this.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n</root>"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Options/BaseOptionsDialogPage.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using Microsoft.VisualStudio.Shell;\n\n    /// <summary>\n    /// Base class for options page.\n    /// </summary>\n    internal abstract class BaseOptionsDialogPage : DialogPage\n    {\n        /// <summary>\n        /// Registry key for all options.\n        /// </summary>\n        protected const string RegOptionsKey = \"ConfigTransform\";\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsDialogPage.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.ComponentModel;\n    using System.Diagnostics;\n    using System.Windows.Forms;\n    using Microsoft.VisualStudio;\n    using Microsoft.VisualStudio.Shell.Interop;\n    using Microsoft.Win32;\n\n    /// <summary>\n    /// Options page for SlowCheetah.\n    /// </summary>\n    [System.Runtime.InteropServices.Guid(\"01B6BAC2-0BD6-4ead-95AE-6D6DE30A6286\")]\n    internal class OptionsDialogPage : BaseOptionsDialogPage\n    {\n        private const string RegPreviewEnable = \"EnablePreview\";\n        private const string RegDependentUpon = \"EnableDependentUpon\";\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"OptionsDialogPage\"/> class.\n        /// Constructor called by VSIP just in time when user wants to view this tools, options page.\n        /// </summary>\n        public OptionsDialogPage()\n        {\n            this.InitializeDefaults();\n        }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether preview is enabled or not.\n        /// </summary>\n        public bool EnablePreview { get; set; }\n\n        /// <summary>\n        /// Gets or sets a value indicating whether to add DependentUpon metadata.\n        /// </summary>\n        public bool AddDependentUpon { get; set; }\n\n        /// <inheritdoc/>\n        protected override IWin32Window Window\n        {\n            get\n            {\n                var optionControl = new OptionsUserControl();\n                optionControl.Initialize(this);\n                return optionControl;\n            }\n        }\n\n        /// <inheritdoc/>\n        public override void SaveSettingsToXml(IVsSettingsWriter writer)\n        {\n            try\n            {\n                base.SaveSettingsToXml(writer);\n\n                // Write settings to XML\n                writer.WriteSettingBoolean(RegPreviewEnable, this.EnablePreview ? 1 : 0);\n                writer.WriteSettingBoolean(RegDependentUpon, this.AddDependentUpon ? 1 : 0);\n            }\n            catch (Exception e)\n            {\n                Debug.Assert(false, \"Error exporting Slow Cheetah settings: \" + e.Message);\n            }\n        }\n\n        /// <inheritdoc/>\n        public override void LoadSettingsFromXml(IVsSettingsReader reader)\n        {\n            try\n            {\n                this.InitializeDefaults();\n\n                if (ErrorHandler.Succeeded(reader.ReadSettingBoolean(RegPreviewEnable, out int enablePreview)))\n                {\n                    this.EnablePreview = enablePreview == 1;\n                }\n\n                if (ErrorHandler.Succeeded(reader.ReadSettingBoolean(RegDependentUpon, out int addDependentUpon)))\n                {\n                    this.AddDependentUpon = addDependentUpon == 1;\n                }\n            }\n            catch (Exception e)\n            {\n                Debug.Assert(false, \"Error importing Slow Cheetah settings: \" + e.Message);\n            }\n        }\n\n        /// <summary>\n        /// Load Tools-->Options settings from registry. Defaults are set in constructor so these\n        /// will just override those values.\n        /// </summary>\n        public override void LoadSettingsFromStorage()\n        {\n            try\n            {\n                this.InitializeDefaults();\n                using (RegistryKey userRootKey = SlowCheetahPackage.OurPackage.UserRegistryRoot)\n                using (RegistryKey cheetahKey = userRootKey.OpenSubKey(RegOptionsKey))\n                {\n                    if (cheetahKey != null)\n                    {\n                        object enablePreview = cheetahKey.GetValue(RegPreviewEnable);\n                        if (enablePreview != null && (enablePreview is int))\n                        {\n                            this.EnablePreview = ((int)enablePreview) == 1;\n                        }\n\n                        object addDependentUpon = cheetahKey.GetValue(RegDependentUpon);\n                        if (addDependentUpon != null && (addDependentUpon is int))\n                        {\n                            this.AddDependentUpon = ((int)addDependentUpon) == 1;\n                        }\n                    }\n                }\n            }\n            catch (Exception e)\n            {\n                Debug.Assert(false, \"Error reading Slow Cheetah settings from the registry: \" + e.Message);\n            }\n        }\n\n        /// <summary>\n        /// Save Tools-->Options settings to registry.\n        /// </summary>\n        public override void SaveSettingsToStorage()\n        {\n            try\n            {\n                base.SaveSettingsToStorage();\n                using (RegistryKey userRootKey = SlowCheetahPackage.OurPackage.UserRegistryRoot)\n                using (RegistryKey cheetahKey = userRootKey.CreateSubKey(RegOptionsKey))\n                {\n                    cheetahKey.SetValue(RegPreviewEnable, this.EnablePreview ? 1 : 0);\n                    cheetahKey.SetValue(RegDependentUpon, this.AddDependentUpon ? 1 : 0);\n                }\n            }\n            catch (Exception e)\n            {\n                Debug.Assert(false, \"Error saving Slow Cheetah settings to the registry:\" + e.Message);\n            }\n        }\n\n        /// <summary>\n        /// This event is raised when VS wants to deactivate this page.\n        /// The page is deactivated unless the event is cancelled.\n        /// </summary>\n        /// <param name=\"e\">Arguments for the event.</param>\n        protected override void OnDeactivate(CancelEventArgs e)\n        {\n        }\n\n        /// <summary>\n        /// Sets up our default values.\n        /// </summary>\n        private void InitializeDefaults()\n        {\n            this.EnablePreview = true;\n            this.AddDependentUpon = true;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsUserControl.Designer.cs",
    "content": "﻿namespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    partial class OptionsUserControl\n    {\n        /// <summary> \n        /// Required designer variable.\n        /// </summary>\n        private System.ComponentModel.IContainer components = null;\n\n        /// <summary> \n        /// Clean up any resources being used.\n        /// </summary>\n        /// <param name=\"disposing\">true if managed resources should be disposed; otherwise, false.</param>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing && (components != null))\n            {\n                components.Dispose();\n            }\n            base.Dispose(disposing);\n        }\n\n        #region Component Designer generated code\n\n        /// <summary> \n        /// Required method for Designer support - do not modify \n        /// the contents of this method with the code editor.\n        /// </summary>\n        private void InitializeComponent()\n        {\n            System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OptionsUserControl));\n            this.EnablePreviewCheckbox = new System.Windows.Forms.CheckBox();\n            this.GeneralGroupBox = new System.Windows.Forms.GroupBox();\n            this.AddDepentUponCheckbox = new System.Windows.Forms.CheckBox();\n            this.GeneralGroupBox.SuspendLayout();\n            this.SuspendLayout();\n            // \n            // EnablePreviewCheckbox\n            // \n            resources.ApplyResources(this.EnablePreviewCheckbox, \"EnablePreviewCheckbox\");\n            this.EnablePreviewCheckbox.Name = \"EnablePreviewCheckbox\";\n            this.EnablePreviewCheckbox.UseVisualStyleBackColor = true;\n            this.EnablePreviewCheckbox.CheckedChanged += new System.EventHandler(this.EnablePreviewCheckbox_CheckedChanged);\n            // \n            // GeneralGroupBox\n            // \n            resources.ApplyResources(this.GeneralGroupBox, \"GeneralGroupBox\");\n            this.GeneralGroupBox.Controls.Add(this.EnablePreviewCheckbox);\n            this.GeneralGroupBox.Controls.Add(this.AddDepentUponCheckbox);\n            this.GeneralGroupBox.Name = \"GeneralGroupBox\";\n            this.GeneralGroupBox.TabStop = false;\n            // \n            // AddDepentUponCheckbox\n            // \n            resources.ApplyResources(this.AddDepentUponCheckbox, \"AddDepentUponCheckbox\");\n            this.AddDepentUponCheckbox.Name = \"AddDepentUponCheckbox\";\n            this.AddDepentUponCheckbox.UseVisualStyleBackColor = true;\n            this.AddDepentUponCheckbox.CheckedChanged += new System.EventHandler(this.AddDepentUponCheckbox_CheckedChanged);\n            // \n            // OptionsUserControl\n            // \n            resources.ApplyResources(this, \"$this\");\n            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;\n            this.Controls.Add(this.GeneralGroupBox);\n            this.Name = \"OptionsUserControl\";\n            this.GeneralGroupBox.ResumeLayout(false);\n            this.GeneralGroupBox.PerformLayout();\n            this.ResumeLayout(false);\n            this.PerformLayout();\n\n        }\n\n        #endregion\n\n        private System.Windows.Forms.CheckBox EnablePreviewCheckbox;\n        private System.Windows.Forms.GroupBox GeneralGroupBox;\n        private System.Windows.Forms.CheckBox AddDepentUponCheckbox;\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsUserControl.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Windows.Forms;\n\n    /// <summary>\n    /// The UI for the options page.\n    /// </summary>\n    public partial class OptionsUserControl : UserControl\n    {\n        private OptionsDialogPage optionsPage = null;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"OptionsUserControl\"/> class.\n        /// </summary>\n        public OptionsUserControl()\n        {\n            this.InitializeComponent();\n        }\n\n        /// <summary>\n        /// Initialized the Options Page Control.\n        /// </summary>\n        /// <param name=\"optionsPage\">The options page that corresponds to this control.</param>\n        internal void Initialize(OptionsDialogPage optionsPage)\n        {\n            this.optionsPage = optionsPage ?? throw new ArgumentNullException(nameof(optionsPage));\n            this.EnablePreviewCheckbox.Checked = optionsPage.EnablePreview;\n            this.AddDepentUponCheckbox.Checked = optionsPage.AddDependentUpon;\n        }\n\n        private void EnablePreviewCheckbox_CheckedChanged(object sender, EventArgs e)\n        {\n            if (this.optionsPage != null)\n            {\n                this.optionsPage.EnablePreview = this.EnablePreviewCheckbox.Checked;\n            }\n        }\n\n        private void AddDepentUponCheckbox_CheckedChanged(object sender, EventArgs e)\n        {\n            if (this.optionsPage != null)\n            {\n                this.optionsPage.AddDependentUpon = this.AddDepentUponCheckbox.Checked;\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Options/OptionsUserControl.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <assembly alias=\"mscorlib\" name=\"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"EnablePreviewCheckbox.AutoSize\" type=\"System.Boolean, mscorlib\">\n    <value>True</value>\n  </data>\n  <assembly alias=\"System.Drawing\" name=\"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\" />\n  <data name=\"EnablePreviewCheckbox.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>6, 20</value>\n  </data>\n  <data name=\"EnablePreviewCheckbox.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>194, 17</value>\n  </data>\n  <data name=\"EnablePreviewCheckbox.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>0</value>\n  </data>\n  <data name=\"EnablePreviewCheckbox.Text\" xml:space=\"preserve\">\n    <value>&amp;Show diff on transformation preview</value>\n  </data>\n  <data name=\"&gt;&gt;EnablePreviewCheckbox.Name\" xml:space=\"preserve\">\n    <value>EnablePreviewCheckbox</value>\n  </data>\n  <data name=\"&gt;&gt;EnablePreviewCheckbox.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;EnablePreviewCheckbox.Parent\" xml:space=\"preserve\">\n    <value>GeneralGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;EnablePreviewCheckbox.ZOrder\" xml:space=\"preserve\">\n    <value>0</value>\n  </data>\n  <data name=\"GeneralGroupBox.AutoSize\" type=\"System.Boolean, mscorlib\">\n    <value>True</value>\n  </data>\n  <data name=\"AddDepentUponCheckbox.AutoSize\" type=\"System.Boolean, mscorlib\">\n    <value>True</value>\n  </data>\n  <data name=\"AddDepentUponCheckbox.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>6, 43</value>\n  </data>\n  <data name=\"AddDepentUponCheckbox.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>235, 17</value>\n  </data>\n  <data name=\"AddDepentUponCheckbox.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>1</value>\n  </data>\n  <data name=\"AddDepentUponCheckbox.Text\" xml:space=\"preserve\">\n    <value>&amp;Add DepentUpon metadata to transform files</value>\n  </data>\n  <data name=\"&gt;&gt;AddDepentUponCheckbox.Name\" xml:space=\"preserve\">\n    <value>AddDepentUponCheckbox</value>\n  </data>\n  <data name=\"&gt;&gt;AddDepentUponCheckbox.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;AddDepentUponCheckbox.Parent\" xml:space=\"preserve\">\n    <value>GeneralGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;AddDepentUponCheckbox.ZOrder\" xml:space=\"preserve\">\n    <value>1</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n  <data name=\"GeneralGroupBox.Dock\" type=\"System.Windows.Forms.DockStyle, System.Windows.Forms\">\n    <value>Top</value>\n  </data>\n  <data name=\"GeneralGroupBox.Location\" type=\"System.Drawing.Point, System.Drawing\">\n    <value>0, 0</value>\n  </data>\n  <data name=\"GeneralGroupBox.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>440, 79</value>\n  </data>\n  <data name=\"GeneralGroupBox.TabIndex\" type=\"System.Int32, mscorlib\">\n    <value>1</value>\n  </data>\n  <data name=\"GeneralGroupBox.Text\" xml:space=\"preserve\">\n    <value>General Settings</value>\n  </data>\n  <data name=\"&gt;&gt;GeneralGroupBox.Name\" xml:space=\"preserve\">\n    <value>GeneralGroupBox</value>\n  </data>\n  <data name=\"&gt;&gt;GeneralGroupBox.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.GroupBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n  <data name=\"&gt;&gt;GeneralGroupBox.Parent\" xml:space=\"preserve\">\n    <value>$this</value>\n  </data>\n  <data name=\"&gt;&gt;GeneralGroupBox.ZOrder\" xml:space=\"preserve\">\n    <value>0</value>\n  </data>\n  <metadata name=\"$this.Localizable\" type=\"System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\">\n    <value>True</value>\n  </metadata>\n  <data name=\"$this.AutoScaleDimensions\" type=\"System.Drawing.SizeF, System.Drawing\">\n    <value>6, 13</value>\n  </data>\n  <data name=\"$this.AutoSize\" type=\"System.Boolean, mscorlib\">\n    <value>True</value>\n  </data>\n  <data name=\"$this.Size\" type=\"System.Drawing.Size, System.Drawing\">\n    <value>440, 190</value>\n  </data>\n  <data name=\"&gt;&gt;$this.Name\" xml:space=\"preserve\">\n    <value>OptionsUserControl</value>\n  </data>\n  <data name=\"&gt;&gt;$this.Type\" xml:space=\"preserve\">\n    <value>System.Windows.Forms.UserControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </data>\n</root>"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Package/AddTransformCommand.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Globalization;\n    using System.IO;\n    using System.Linq;\n    using EnvDTE;\n    using Microsoft.VisualStudio.Shell;\n    using Microsoft.VisualStudio.Shell.Interop;\n\n    /// <summary>\n    /// Add Transform command.\n    /// </summary>\n    public class AddTransformCommand : BaseCommand\n    {\n        private readonly SlowCheetahPackage package;\n        private readonly SlowCheetahNuGetManager nuGetManager;\n        private readonly SlowCheetahPackageLogger logger;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"AddTransformCommand\"/> class.\n        /// </summary>\n        /// <param name=\"package\">The VSPackage.</param>\n        /// <param name=\"nuGetManager\">The nuget manager for the VSPackage.</param>\n        /// <param name=\"logger\">VSPackage logger.</param>\n        public AddTransformCommand(SlowCheetahPackage package, SlowCheetahNuGetManager nuGetManager, SlowCheetahPackageLogger logger)\n            : base(package)\n        {\n            this.package = package ?? throw new ArgumentNullException(nameof(package));\n            this.nuGetManager = nuGetManager ?? throw new ArgumentNullException(nameof(nuGetManager));\n            this.logger = logger ?? throw new ArgumentNullException(nameof(logger));\n        }\n\n        /// <inheritdoc/>\n        public override int CommandId { get; } = 0x100;\n\n        /// <inheritdoc/>\n        protected override void OnChange(object sender, EventArgs e)\n        {\n        }\n\n        /// <inheritdoc/>\n        protected override void OnBeforeQueryStatus(object sender, EventArgs e)\n        {\n            // get the menu that fired the event\n            if (sender is OleMenuCommand menuCommand)\n            {\n                // start by assuming that the menu will not be shown\n                menuCommand.Visible = false;\n                menuCommand.Enabled = false;\n                uint itemid = VSConstants.VSITEMID_NIL;\n\n                if (!ProjectUtilities.IsSingleProjectItemSelection(out IVsHierarchy hierarchy, out itemid))\n                {\n                    return;\n                }\n\n                IVsProject vsProject = (IVsProject)hierarchy;\n                if (!this.package.ProjectSupportsTransforms(vsProject))\n                {\n                    return;\n                }\n\n                if (!this.ItemSupportsTransforms(vsProject, itemid))\n                {\n                    return;\n                }\n\n                menuCommand.Visible = true;\n                menuCommand.Enabled = true;\n            }\n        }\n\n        /// <inheritdoc/>\n        protected override void OnInvoke(object sender, EventArgs e)\n        {\n            uint itemid = VSConstants.VSITEMID_NIL;\n\n            if (!ProjectUtilities.IsSingleProjectItemSelection(out IVsHierarchy hierarchy, out itemid))\n            {\n                return;\n            }\n\n            IVsProject vsProject = (IVsProject)hierarchy;\n            if (!this.package.ProjectSupportsTransforms(vsProject))\n            {\n                return;\n            }\n\n            if (ErrorHandler.Failed(vsProject.GetMkDocument(VSConstants.VSITEMID_ROOT, out string projectFullPath)))\n            {\n                return;\n            }\n\n            IVsBuildPropertyStorage buildPropertyStorage = vsProject as IVsBuildPropertyStorage;\n            if (buildPropertyStorage == null)\n            {\n                this.logger.LogMessage(\"Error obtaining IVsBuildPropertyStorage from hierarchy.\");\n                return;\n            }\n\n            // get the name of the item\n            if (ErrorHandler.Failed(vsProject.GetMkDocument(itemid, out string itemFullPath)))\n            {\n                return;\n            }\n\n            // Save the project file\n            IVsSolution solution = (IVsSolution)Shell.Package.GetGlobalService(typeof(SVsSolution));\n            int hr = solution.SaveSolutionElement((uint)__VSSLNSAVEOPTIONS.SLNSAVEOPT_SaveIfDirty, hierarchy, 0);\n            ErrorHandler.ThrowOnFailure(hr);\n\n            ProjectItem selectedProjectItem = PackageUtilities.GetAutomationFromHierarchy<ProjectItem>(hierarchy, itemid);\n            if (selectedProjectItem != null)\n            {\n                try\n                {\n                    selectedProjectItem.Save();\n                }\n                catch\n                {\n                    // If the item is not open, an exception is thrown,\n                    // but that is not a problem as it is not dirty\n                }\n\n                // Checks the SlowCheetah NuGet package installation\n                this.package.JoinableTaskFactory.Run(() => this.nuGetManager.CheckSlowCheetahInstallationAsync(hierarchy));\n\n                // need to enure that this item has metadata TransformOnBuild set to true\n                buildPropertyStorage.SetItemAttribute(itemid, SlowCheetahPackage.TransformOnBuild, \"true\");\n\n                string itemFolder = Path.GetDirectoryName(itemFullPath);\n                string itemFilename = Path.GetFileNameWithoutExtension(itemFullPath);\n                string itemExtension = Path.GetExtension(itemFullPath);\n                string itemFilenameExtension = Path.GetFileName(itemFullPath);\n\n                IEnumerable<string> configs = ProjectUtilities.GetProjectConfigurations(selectedProjectItem.ContainingProject);\n\n                List<string> transformsToCreate = null;\n                if (configs != null)\n                {\n                    transformsToCreate = configs.ToList();\n                }\n\n                if (transformsToCreate == null)\n                {\n                    transformsToCreate = new List<string>();\n                }\n\n                // if it is a web project we should add publish profile specific transforms as well\n                IEnumerable<string> publishProfileTransforms = this.GetPublishProfileTransforms(hierarchy, projectFullPath);\n                if (publishProfileTransforms != null)\n                {\n                    transformsToCreate.AddRange(publishProfileTransforms);\n                }\n\n                using (OptionsDialogPage optionsPage = new OptionsDialogPage())\n                {\n                    optionsPage.LoadSettingsFromStorage();\n\n                    foreach (string config in transformsToCreate)\n                    {\n                        string itemName = string.Format(CultureInfo.CurrentCulture, Resources.Resources.String_FormatTransformFilename, itemFilename, config, itemExtension);\n                        this.AddTransformFile(hierarchy, selectedProjectItem, itemName, itemFolder, optionsPage.AddDependentUpon);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Creates a new transformation file and adds it to the project.\n        /// </summary>\n        /// <param name=\"hierarchy\">The project hierarchy.</param>\n        /// <param name=\"selectedProjectItem\">The selected item to be transformed.</param>\n        /// <param name=\"itemName\">Full name of the transformation file.</param>\n        /// <param name=\"projectPath\">Full path to the current project.</param>\n        /// <param name=\"addDependentUpon\">Wheter to add the new file dependent upon the source file.</param>\n        private void AddTransformFile(\n            IVsHierarchy hierarchy,\n            ProjectItem selectedProjectItem,\n            string itemName,\n            string projectPath,\n            bool addDependentUpon)\n        {\n            try\n            {\n                string transformPath = Path.Combine(projectPath, itemName);\n                string sourceFileName = selectedProjectItem.FileNames[1];\n\n                ITransformer transformer = TransformerFactory.GetTransformer(sourceFileName, null);\n\n                transformer.CreateTransformFile(sourceFileName, transformPath, false);\n\n                // Add the file to the project\n                // If the DependentUpon metadata is required, add it under the original file\n                // If not, add it to the project\n                ProjectItem addedItem = addDependentUpon ? selectedProjectItem.ProjectItems.AddFromFile(transformPath)\n                                                      : selectedProjectItem.ContainingProject.ProjectItems.AddFromFile(transformPath);\n\n                // We need to set the Build Action to None to ensure that it doesn't get published for web projects\n                addedItem.Properties.Item(\"ItemType\").Value = \"None\";\n\n                IVsBuildPropertyStorage buildPropertyStorage = hierarchy as IVsBuildPropertyStorage;\n\n                if (buildPropertyStorage == null)\n                {\n                    this.logger.LogMessage(\"Error obtaining IVsBuildPropertyStorage from hierarcy.\");\n                }\n                else if (ErrorHandler.Succeeded(hierarchy.ParseCanonicalName(addedItem.FileNames[0], out uint addedItemId)))\n                {\n                    buildPropertyStorage.SetItemAttribute(addedItemId, SlowCheetahPackage.IsTransformFile, \"true\");\n\n                    if (addDependentUpon)\n                    {\n                        // Not all projects (like CPS) set the dependent upon metadata when using the automation object\n                        buildPropertyStorage.GetItemAttribute(addedItemId, SlowCheetahPackage.DependentUpon, out string dependentUponValue);\n                        if (string.IsNullOrEmpty(dependentUponValue))\n                        {\n                            // It didm not set it\n                            buildPropertyStorage.SetItemAttribute(addedItemId, SlowCheetahPackage.DependentUpon, selectedProjectItem.Name);\n                        }\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                this.logger.LogMessage(\"AddTransformFile: Exception> \" + ex.Message);\n            }\n        }\n\n        /// <summary>\n        /// Verifies if an item supports transforms.\n        /// </summary>\n        /// <param name=\"project\">Current IVsProject.</param>\n        /// <param name=\"itemid\">Id of the item inside the project.</param>\n        /// <returns>True if the item supports transforms.</returns>\n        private bool ItemSupportsTransforms(IVsProject project, uint itemid)\n        {\n            if (ErrorHandler.Failed(project.GetMkDocument(itemid, out string itemFullPath)))\n            {\n                return false;\n            }\n\n            if (!PackageUtilities.IsExtensionSupportedForFile(itemFullPath))\n            {\n                return false;\n            }\n\n            if (this.package.IsItemTransformItem(project, itemid))\n            {\n                return false;\n            }\n\n            // web.config has its own transform support\n            if (string.Compare(\"web.config\", Path.GetFileName(itemFullPath), StringComparison.OrdinalIgnoreCase) == 0)\n            {\n                return false;\n            }\n\n            // All quick checks done, ask if this is any transformer supports this.\n            // This may hit the disk, which is costly for a context menu check and preferably avoided.\n            return TransformerFactory.IsSupportedFile(itemFullPath);\n        }\n\n        /// <summary>\n        /// Verifies any publish profiles in the project and returns it as a list of strings.\n        /// </summary>\n        /// <param name=\"hierarchy\">The current project hierarchy.</param>\n        /// <param name=\"projectPath\">Full path of the current project.</param>\n        /// <returns>List of publish profile names.</returns>\n        private IEnumerable<string> GetPublishProfileTransforms(IVsHierarchy hierarchy, string projectPath)\n        {\n            if (hierarchy == null)\n            {\n                throw new ArgumentNullException(nameof(hierarchy));\n            }\n\n            if (string.IsNullOrEmpty(projectPath))\n            {\n                throw new ArgumentNullException(nameof(projectPath));\n            }\n\n            List<string> result = new List<string>();\n            IVsProjectSpecialFiles specialFiles = hierarchy as IVsProjectSpecialFiles;\n            if (ErrorHandler.Failed(specialFiles.GetFile((int)__PSFFILEID2.PSFFILEID_AppDesigner, (uint)__PSFFLAGS.PSFF_FullPath, out uint itemid, out string propertiesFolder)))\n            {\n                this.logger.LogMessage(\"Exception trying to create IVsProjectSpecialFiles\");\n            }\n\n            if (!string.IsNullOrEmpty(propertiesFolder))\n            {\n                // Properties\\PublishProfiles\n                string publishProfilesFolder = Path.Combine(propertiesFolder, \"PublishProfiles\");\n                if (Directory.Exists(publishProfilesFolder))\n                {\n                    string[] publishProfiles = Directory.GetFiles(publishProfilesFolder, \"*.pubxml\");\n                    if (publishProfiles != null)\n                    {\n                        return publishProfiles.Select(profile => Path.GetFileNameWithoutExtension(profile));\n                    }\n                }\n            }\n\n            return null;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Package/BaseCommand.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.ComponentModel.Design;\n    using Microsoft.VisualStudio.Shell;\n\n    /// <summary>\n    /// Base class for package commands.\n    /// </summary>\n    public abstract class BaseCommand\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"BaseCommand\"/> class.\n        /// </summary>\n        /// <param name=\"package\">The VSPackage as a servide provider.</param>\n        public BaseCommand(AsyncPackage package)\n        {\n            this.Package = package ?? throw new ArgumentNullException(nameof(package));\n        }\n\n        /// <summary>\n        /// Gets the ID of the command.\n        /// </summary>\n        public abstract int CommandId { get; }\n\n        /// <summary>\n        /// Gets the package.\n        /// </summary>\n        protected AsyncPackage Package { get; }\n\n        /// <summary>\n        /// Asynchronously registers the command in the command service.\n        /// </summary>\n        /// <returns>Async task.</returns>\n        public async System.Threading.Tasks.Task RegisterCommandAsync()\n        {\n            await this.Package.JoinableTaskFactory.SwitchToMainThreadAsync();\n\n            // Add our command handlers for menu (commands must exist in the .vsct file)\n            if (await this.Package.GetServiceAsync(typeof(IMenuCommandService)) is OleMenuCommandService mcs)\n            {\n                // Create the command for this query status menu item\n                CommandID menuContextCommandID = new CommandID(Guids.GuidSlowCheetahCmdSet, this.CommandId);\n                OleMenuCommand menuCommand = new OleMenuCommand(this.OnInvoke, this.OnChange, this.OnBeforeQueryStatus, menuContextCommandID);\n                mcs.AddCommand(menuCommand);\n            }\n        }\n\n        /// <summary>\n        /// This event is called when the command status has changed.\n        /// </summary>\n        /// <param name=\"sender\">The object that fired the event.</param>\n        /// <param name=\"e\">Event arguments.</param>\n        protected abstract void OnChange(object sender, EventArgs e);\n\n        /// <summary>\n        /// This event is fired when a user right-clicks on a menu, but prior to the menu showing.\n        /// This function is used to set the visibility of the menu.\n        /// </summary>\n        /// <param name=\"sender\">The object that fired the event.</param>\n        /// <param name=\"e\">Event arguments.</param>\n        protected abstract void OnBeforeQueryStatus(object sender, EventArgs e);\n\n        /// <summary>\n        /// This function is the callback used to execute a command when the a menu item is clicked.\n        /// </summary>\n        /// <param name=\"sender\">The object that fired the event.</param>\n        /// <param name=\"e\">Event arguments.</param>\n        protected abstract void OnInvoke(object sender, EventArgs e);\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Package/PackageSolutionEvents.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using Microsoft.VisualStudio.Shell;\n    using Microsoft.VisualStudio.Shell.Interop;\n\n    /// <summary>\n    /// Contains solution events for <see cref=\"SlowCheetahPackage\"/>.\n    /// </summary>\n    public class PackageSolutionEvents : IVsUpdateSolutionEvents, IDisposable\n    {\n        private uint solutionUpdateCookie = 0;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PackageSolutionEvents\"/> class.\n        /// </summary>\n        /// <param name=\"asyncPackage\">The VSPackage.</param>\n        /// <param name=\"errorListProvider\">The error list provider.</param>\n        public PackageSolutionEvents(AsyncPackage asyncPackage, ErrorListProvider errorListProvider)\n        {\n            this.Package = asyncPackage ?? throw new ArgumentNullException(nameof(asyncPackage));\n            this.ErrorListProvider = errorListProvider ?? throw new ArgumentNullException(nameof(errorListProvider));\n        }\n\n        private ErrorListProvider ErrorListProvider { get; }\n\n        private AsyncPackage Package { get; }\n\n        /// <inheritdoc/>\n        public int UpdateSolution_Begin(ref int pfCancelUpdate)\n        {\n            return VSConstants.S_OK;\n        }\n\n        /// <inheritdoc/>\n        public int UpdateSolution_Done(int fSucceeded, int fModified, int fCancelCommand)\n        {\n            return VSConstants.S_OK;\n        }\n\n        /// <inheritdoc/>\n        public int UpdateSolution_StartUpdate(ref int pfCancelUpdate)\n        {\n            // On solution update, clear all errors generated\n            this.ErrorListProvider.Tasks.Clear();\n            return VSConstants.S_OK;\n        }\n\n        /// <inheritdoc/>\n        public int UpdateSolution_Cancel()\n        {\n            return VSConstants.S_OK;\n        }\n\n        /// <inheritdoc/>\n        public int OnActiveProjectCfgChange(IVsHierarchy pIVsHierarchy)\n        {\n            return VSConstants.S_OK;\n        }\n\n        /// <summary>\n        /// Asynchronously registers the solution eve.\n        /// </summary>\n        /// <returns>Async task.</returns>\n        public async System.Threading.Tasks.Task RegisterEventsAsync()\n        {\n            await this.Package.JoinableTaskFactory.SwitchToMainThreadAsync();\n\n            if (await this.Package.GetServiceAsync(typeof(SVsSolutionBuildManager)) is IVsSolutionBuildManager solutionBuildManager)\n            {\n                solutionBuildManager.AdviseUpdateSolutionEvents(this, out this.solutionUpdateCookie);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            if (this.solutionUpdateCookie > 0)\n            {\n                this.Package.JoinableTaskFactory.Run(async () =>\n                {\n                    await this.Package.JoinableTaskFactory.SwitchToMainThreadAsync();\n\n                    if (await this.Package.GetServiceAsync(typeof(SVsSolutionBuildManager)) is IVsSolutionBuildManager solutionBuildManager)\n                    {\n                        solutionBuildManager.UnadviseUpdateSolutionEvents(this.solutionUpdateCookie);\n                    }\n                });\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Package/PreviewTransformCommand.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics;\n    using System.Globalization;\n    using System.IO;\n    using EnvDTE;\n    using Microsoft.VisualStudio.Shell;\n    using Microsoft.VisualStudio.Shell.Interop;\n    using Microsoft.VisualStudio.SlowCheetah.Exceptions;\n\n    /// <summary>\n    /// Preview Transform command.\n    /// </summary>\n    public class PreviewTransformCommand : BaseCommand, IDisposable\n    {\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"PreviewTransformCommand\"/> class.\n        /// </summary>\n        /// <param name=\"package\">The VSPackage.</param>\n        /// <param name=\"nuGetManager\">The nuget manager for the VSPackage.</param>\n        /// <param name=\"logger\">VSPackage logger.</param>\n        /// <param name=\"errorListProvider\">The VS error list provider.</param>\n        public PreviewTransformCommand(\n            SlowCheetahPackage package,\n            SlowCheetahNuGetManager nuGetManager,\n            SlowCheetahPackageLogger logger,\n            ErrorListProvider errorListProvider)\n            : base(package)\n        {\n            this.ScPackage = package ?? throw new ArgumentNullException(nameof(package));\n            this.NuGetManager = nuGetManager ?? throw new ArgumentNullException(nameof(nuGetManager));\n            this.Logger = logger ?? throw new ArgumentNullException(nameof(logger));\n            this.ErrorListProvider = errorListProvider ?? throw new ArgumentNullException(nameof(errorListProvider));\n            this.TempFilesCreated = new List<string>();\n        }\n\n        /// <inheritdoc/>\n        public override int CommandId { get; } = 0x101;\n\n        private SlowCheetahNuGetManager NuGetManager { get; }\n\n        private SlowCheetahPackage ScPackage { get; }\n\n        private SlowCheetahPackageLogger Logger { get; }\n\n        private ErrorListProvider ErrorListProvider { get; }\n\n        private List<string> TempFilesCreated { get; }\n\n        /// <inheritdoc/>\n        public void Dispose()\n        {\n            foreach (string file in this.TempFilesCreated)\n            {\n                try\n                {\n                    File.Delete(file);\n                }\n                catch (Exception ex)\n                {\n                    this.Logger.LogMessage(\n                        \"There was an error deleting a temp file [{0}], error: [{1}]\",\n                        file,\n                        ex.Message);\n                }\n            }\n        }\n\n        /// <inheritdoc/>\n        protected override void OnChange(object sender, EventArgs e)\n        {\n        }\n\n        /// <inheritdoc/>\n        protected override void OnBeforeQueryStatus(object sender, EventArgs e)\n        {\n            // Get the menu that fired the event\n            if (sender is OleMenuCommand menuCommand)\n            {\n                // Start by assuming that the menu will not be shown\n                menuCommand.Visible = false;\n                menuCommand.Enabled = false;\n                uint itemid = VSConstants.VSITEMID_NIL;\n\n                if (!ProjectUtilities.IsSingleProjectItemSelection(out IVsHierarchy hierarchy, out itemid))\n                {\n                    return;\n                }\n\n                IVsProject vsProject = (IVsProject)hierarchy;\n                if (!this.ScPackage.ProjectSupportsTransforms(vsProject))\n                {\n                    return;\n                }\n\n                // The file need to be a transform item to preview\n                if (!this.ScPackage.IsItemTransformItem(vsProject, itemid))\n                {\n                    return;\n                }\n\n                menuCommand.Visible = true;\n                menuCommand.Enabled = true;\n            }\n        }\n\n        /// <inheritdoc/>\n        protected override void OnInvoke(object sender, EventArgs e)\n        {\n            uint itemId = VSConstants.VSITEMID_NIL;\n\n            // Verify only one item is selected\n            if (!ProjectUtilities.IsSingleProjectItemSelection(out IVsHierarchy hierarchy, out itemId))\n            {\n                return;\n            }\n\n            // Make sure that the project supports transformations\n            IVsProject project = (IVsProject)hierarchy;\n            if (!this.ScPackage.ProjectSupportsTransforms(project))\n            {\n                return;\n            }\n\n            // Get the full path of the selected file\n            if (ErrorHandler.Failed(project.GetMkDocument(itemId, out string transformPath)))\n            {\n                return;\n            }\n\n            // Checks the SlowCheetah NuGet package installation\n            this.ScPackage.JoinableTaskFactory.Run(() => this.NuGetManager.CheckSlowCheetahInstallationAsync(hierarchy));\n\n            // Get the parent of the file to start searching for the source file\n            ErrorHandler.ThrowOnFailure(hierarchy.GetProperty(itemId, (int)__VSHPROPID.VSHPROPID_Parent, out object parentIdObj));\n            uint parentId = (uint)(int)parentIdObj;\n            if (parentId == (uint)VSConstants.VSITEMID.Nil)\n            {\n                return;\n            }\n\n            if (!this.TryGetFileToTransform(hierarchy, parentId, Path.GetFileName(transformPath), out uint docId, out string documentPath))\n            {\n                throw new FileNotFoundException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Error_FileToTransformNotFound, transformPath));\n            }\n\n            try\n            {\n                // Save the source and transform files before previewing\n                PackageUtilities.GetAutomationFromHierarchy<ProjectItem>(hierarchy, docId).Save();\n                PackageUtilities.GetAutomationFromHierarchy<ProjectItem>(hierarchy, itemId).Save();\n            }\n            catch\n            {\n                // If the item is not open, an exception is thrown,\n                // but that is not a problem as it is not dirty\n            }\n\n            this.PreviewTransform(hierarchy, documentPath, transformPath);\n        }\n\n        /// <summary>\n        /// Shows a preview of the transformation in a temporary file.\n        /// </summary>\n        /// <param name=\"hier\">Current IVsHierarchy.</param>\n        /// <param name=\"sourceFile\">Full path to the file to be transformed.</param>\n        /// <param name=\"transformFile\">Full path to the transformation file.</param>\n        private void PreviewTransform(IVsHierarchy hier, string sourceFile, string transformFile)\n        {\n            if (string.IsNullOrWhiteSpace(sourceFile))\n            {\n                throw new ArgumentNullException(nameof(sourceFile));\n            }\n\n            if (string.IsNullOrWhiteSpace(transformFile))\n            {\n                throw new ArgumentNullException(nameof(transformFile));\n            }\n\n            if (!File.Exists(sourceFile))\n            {\n                throw new FileNotFoundException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Error_SourceFileNotFound, sourceFile), sourceFile);\n            }\n\n            if (!File.Exists(transformFile))\n            {\n                throw new FileNotFoundException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Error_TransformFileNotFound, transformFile), transformFile);\n            }\n\n            // Get our options\n            using (OptionsDialogPage optionsPage = new OptionsDialogPage())\n            using (AdvancedOptionsDialogPage advancedOptionsPage = new AdvancedOptionsDialogPage())\n            {\n                optionsPage.LoadSettingsFromStorage();\n                advancedOptionsPage.LoadSettingsFromStorage();\n\n                this.Logger.LogMessage(\"SlowCheetah PreviewTransform\");\n                FileInfo sourceFileInfo = new FileInfo(sourceFile);\n\n                // Destination file\n                // This should be kept as a temp file in case a custom diff tool is being used\n                string destFile = PackageUtilities.GetTempFilename(true, sourceFileInfo.Extension);\n                this.TempFilesCreated.Add(destFile);\n\n                // Perform the transform and then display the result into the diffmerge tool that comes with VS.\n                this.ErrorListProvider.Tasks.Clear();\n                ITransformationLogger logger = new TransformationPreviewLogger(this.ErrorListProvider, hier);\n                ITransformer transformer = TransformerFactory.GetTransformer(sourceFile, logger);\n                if (!transformer.Transform(sourceFile, transformFile, destFile))\n                {\n                    throw new TransformFailedException(Resources.Resources.TransformPreview_ErrorMessage);\n                }\n\n                // Does the customer want a preview? If not, just open an editor window\n                if (optionsPage.EnablePreview == false)\n                {\n                    ProjectUtilities.GetDTE().ItemOperations.OpenFile(destFile);\n                }\n                else\n                {\n                    // If the diffmerge service is available and no diff tool is specified, or diffmerge.exe is specifed we use the service\n                    if (((IServiceProvider)this.ScPackage).GetService(typeof(SVsDifferenceService)) is IVsDifferenceService diffService && (!File.Exists(advancedOptionsPage.PreviewToolExecutablePath) || advancedOptionsPage.PreviewToolExecutablePath.EndsWith(\"diffmerge.exe\", StringComparison.OrdinalIgnoreCase)))\n                    {\n                        if (!string.IsNullOrEmpty(advancedOptionsPage.PreviewToolExecutablePath) && !File.Exists(advancedOptionsPage.PreviewToolExecutablePath))\n                        {\n                            // If the user specified a preview tool, but it doesn't exist, log a warning\n                            logger.LogWarning(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Error_CantFindPreviewTool, advancedOptionsPage.PreviewToolExecutablePath));\n                        }\n\n                        // Write all the labels for the diff tool\n                        string sourceName = Path.GetFileName(sourceFile);\n                        string leftLabel = string.Format(CultureInfo.CurrentCulture, Resources.Resources.TransformPreview_LeftLabel, sourceName);\n                        string rightLabel = string.Format(CultureInfo.CurrentCulture, Resources.Resources.TransformPreview_RightLabel, sourceName, Path.GetFileName(transformFile));\n                        string caption = string.Format(CultureInfo.CurrentCulture, Resources.Resources.TransformPreview_Caption, sourceName);\n                        string tooltip = string.Format(CultureInfo.CurrentCulture, Resources.Resources.TransformPreview_ToolTip, sourceName);\n\n                        diffService.OpenComparisonWindow2(sourceFile, destFile, caption, tooltip, leftLabel, rightLabel, null, null, (uint)__VSDIFFSERVICEOPTIONS.VSDIFFOPT_RightFileIsTemporary);\n                    }\n                    else if (string.IsNullOrEmpty(advancedOptionsPage.PreviewToolExecutablePath))\n                    {\n                        throw new ArgumentException(Resources.Resources.Error_NoPreviewToolSpecified);\n                    }\n                    else if (!File.Exists(advancedOptionsPage.PreviewToolExecutablePath))\n                    {\n                        throw new FileNotFoundException(string.Format(CultureInfo.CurrentCulture, Resources.Resources.Error_CantFindPreviewTool, advancedOptionsPage.PreviewToolExecutablePath), advancedOptionsPage.PreviewToolExecutablePath);\n                    }\n                    else\n                    {\n                        // Open a process with the specified diff tool\n                        // Add quotes to the file names\n                        ProcessStartInfo psi = new ProcessStartInfo(advancedOptionsPage.PreviewToolExecutablePath, string.Format(CultureInfo.CurrentCulture, advancedOptionsPage.PreviewToolCommandLine, $\"\\\"{sourceFile}\\\"\", $\"\\\"{destFile}\\\"\"))\n                        {\n                            CreateNoWindow = true,\n                            UseShellExecute = false,\n                        };\n                        System.Diagnostics.Process.Start(psi);\n                    }\n                }\n            }\n        }\n\n        /// <summary>\n        /// Searches for a file to transform based on a transformation file.\n        /// Starts the search with the parent of the file then checks all visible children.\n        /// </summary>\n        /// <param name=\"hierarchy\">Current project hierarchy.</param>\n        /// <param name=\"parentId\">Parent ID of the file.</param>\n        /// <param name=\"transformName\">Name of the transformation file.</param>\n        /// <param name=\"docId\">ID of the file to transform.</param>\n        /// <param name=\"documentPath\">Resulting path of the file to transform.</param>\n        /// <returns>True if the correct file was found.</returns>\n        private bool TryGetFileToTransform(IVsHierarchy hierarchy, uint parentId, string transformName, out uint docId, out string documentPath)\n        {\n            IVsProject project = (IVsProject)hierarchy;\n\n            // Get the project configurations to use in comparing the name\n            IEnumerable<string> configs = ProjectUtilities.GetProjectConfigurations(hierarchy);\n\n            docId = 0;\n            if (ErrorHandler.Failed(project.GetMkDocument(parentId, out documentPath)))\n            {\n                return false;\n            }\n\n            if (!PackageUtilities.IsPathValid(documentPath))\n            {\n                return false;\n            }\n\n            // Start by checking if the parent is the source file\n            // Here, we can do a generic transform file test to allow for transformations that aren't associated with build configurations\n            if (PackageUtilities.IsGenericFileTransform(Path.GetFileName(documentPath), transformName))\n            {\n                docId = parentId;\n                return true;\n            }\n            else\n            {\n                // If the parent is no the file to transform, look at all of the original file's siblings\n                // Starting with the parent's first visible child\n                hierarchy.GetProperty(parentId, (int)__VSHPROPID.VSHPROPID_FirstVisibleChild, out object childIdObj);\n                docId = (uint)(int)childIdObj;\n                if (ErrorHandler.Failed(project.GetMkDocument(docId, out documentPath)))\n                {\n                    docId = 0;\n                    documentPath = null;\n                    return false;\n                }\n\n                if (PackageUtilities.IsPathValid(documentPath)\n                    && PackageUtilities.IsFileTransformForBuildConfiguration(Path.GetFileName(documentPath), transformName, configs))\n                {\n                    return true;\n                }\n                else\n                {\n                    // Continue on to the the next visible siblings until there are no more files to analyze\n                    while (docId != VSConstants.VSITEMID_NIL)\n                    {\n                        hierarchy.GetProperty(docId, (int)__VSHPROPID.VSHPROPID_NextVisibleSibling, out childIdObj);\n                        docId = (uint)(int)childIdObj;\n                        if (ErrorHandler.Succeeded(project.GetMkDocument(docId, out documentPath))\n                            && PackageUtilities.IsPathValid(documentPath)\n                            && PackageUtilities.IsFileTransformForBuildConfiguration(Path.GetFileName(documentPath), transformName, configs))\n                        {\n                            return true;\n                        }\n                    }\n                }\n            }\n\n            // If we run out of files, the source file has not been found\n            docId = 0;\n            documentPath = null;\n            return false;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Package/SlowCheetahPackageLogger.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Diagnostics;\n    using System.Globalization;\n    using Microsoft.VisualStudio.Shell.Interop;\n\n    /// <summary>\n    /// A logger class for <see cref=\"SlowCheetahPackage\"/>.\n    /// </summary>\n    public class SlowCheetahPackageLogger\n    {\n        private readonly IServiceProvider package;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SlowCheetahPackageLogger\"/> class.\n        /// </summary>\n        /// <param name=\"package\">The VSPackage.</param>\n        public SlowCheetahPackageLogger(IServiceProvider package)\n        {\n            this.package = package ?? throw new ArgumentNullException(nameof(package));\n        }\n\n        /// <summary>\n        /// Logs a message to the Activity Log.\n        /// </summary>\n        /// <param name=\"message\">The message.</param>\n        /// <param name=\"args\">The message arguments.</param>\n        public void LogMessage(string message, params object[] args)\n        {\n            if (string.IsNullOrWhiteSpace(message))\n            {\n                return;\n            }\n\n            string fullMessage = string.Format(CultureInfo.CurrentCulture, message, args);\n            Trace.WriteLine(fullMessage);\n            Debug.WriteLine(fullMessage);\n\n            IVsActivityLog log = this.package.GetService(typeof(SVsActivityLog)) as IVsActivityLog;\n            if (log == null)\n            {\n                return;\n            }\n\n            int hr = log.LogEntry(\n                (uint)__ACTIVITYLOG_ENTRYTYPE.ALE_INFORMATION,\n                this.ToString(),\n                fullMessage);\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/Guids.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n\n    /// <summary>\n    /// List of Guids necessary for the SlowCheetah extension.\n    /// </summary>\n    public static class Guids\n    {\n        /// <summary>\n        /// Guid string of a Web Application project.\n        /// </summary>\n        public const string GuidWebApplicationString = \"{349c5851-65df-11da-9384-00065b846f21}\";\n\n        /// <summary>\n        /// Guid string for the SlowCheetah Visual Studio Package.\n        /// </summary>\n        public const string GuidSlowCheetahPkgString = \"9eb9f150-fcc9-4db8-9e97-6aef2011017c\";\n\n        /// <summary>\n        /// Guid string for the SlowCheetah commands.\n        /// </summary>\n        public const string GuidSlowCheetahCmdSetString = \"eab4615a-3384-42bd-9589-e2df97a783ee\";\n\n        /// <summary>\n        /// Guid for the SlowCheetah commands.\n        /// </summary>\n        public static readonly Guid GuidSlowCheetahCmdSet = new Guid(GuidSlowCheetahCmdSetString);\n\n        /// <summary>\n        /// Guid of a Web Application project.\n        /// </summary>\n        public static readonly Guid GuidWebApplication = new Guid(GuidWebApplicationString);\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/PkgCmdID.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    /// <summary>\n    /// List of the Command IDs for SlowCheetah.\n    /// </summary>\n    public static class PkgCmdID\n    {\n        /// <summary>\n        /// ID for the \"Add Transform\" command.\n        /// </summary>\n        public const uint CmdIdAddTransform = 0x100;\n\n        /// <summary>\n        /// ID for the \"Preview Transform\" command.\n        /// </summary>\n        public const uint CmdIdPreviewTransform = 0x101;\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/Resources.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS.Resources {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class Resources {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal Resources() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Microsoft.VisualStudio.SlowCheetah.VS.Resources.Resources\", typeof(Resources).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Cannot find the preview tool {0}. Verify the transform settings in Tools\\Options..\n        /// </summary>\n        internal static string Error_CantFindPreviewTool {\n            get {\n                return ResourceManager.GetString(\"Error_CantFindPreviewTool\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unable to preview transform. No source file found for {0}. Check to see if the file has not been renamed or removed from the project..\n        /// </summary>\n        internal static string Error_FileToTransformNotFound {\n            get {\n                return ResourceManager.GetString(\"Error_FileToTransformNotFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to No preview tool specified. You can set a preview tool in the transform settings in Tools\\Options..\n        /// </summary>\n        internal static string Error_NoPreviewToolSpecified {\n            get {\n                return ResourceManager.GetString(\"Error_NoPreviewToolSpecified\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Unable to save the project file {0}. {1}.\n        /// </summary>\n        internal static string Error_SavingProjectFile {\n            get {\n                return ResourceManager.GetString(\"Error_SavingProjectFile\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The source file for the transform {0} was not found..\n        /// </summary>\n        internal static string Error_SourceFileNotFound {\n            get {\n                return ResourceManager.GetString(\"Error_SourceFileNotFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to The transform file {0} was not found..\n        /// </summary>\n        internal static string Error_TransformFileNotFound {\n            get {\n                return ResourceManager.GetString(\"Error_TransformFileNotFound\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Error installing SlowCheetah NuGet package to {0}..\n        /// </summary>\n        internal static string NugetInstall_ErrorOutput {\n            get {\n                return ResourceManager.GetString(\"NugetInstall_ErrorOutput\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Finished installing SlowCheetah NuGet package to {0}..\n        /// </summary>\n        internal static string NugetInstall_FinishedOutput {\n            get {\n                return ResourceManager.GetString(\"NugetInstall_FinishedOutput\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Installing SlowCheetah NuGet package to {0} ....\n        /// </summary>\n        internal static string NugetInstall_InstallingOutput {\n            get {\n                return ResourceManager.GetString(\"NugetInstall_InstallingOutput\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to In order to execute transform on build, you will need the SlowCheetah NuGet package. Do you want to install the package now?.\n        /// </summary>\n        internal static string NugetInstall_Text {\n            get {\n                return ResourceManager.GetString(\"NugetInstall_Text\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Install SlowCheetah NuGet package.\n        /// </summary>\n        internal static string NugetInstall_Title {\n            get {\n                return ResourceManager.GetString(\"NugetInstall_Title\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to https://github.com/Microsoft/slow-cheetah/blob/main/doc/update.md.\n        /// </summary>\n        internal static string NugetUpdate_Link {\n            get {\n                return ResourceManager.GetString(\"NugetUpdate_Link\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to It seems that you have an older version of the SlowCheetah package installed. In order to avoid conflicts, you should update you package. Doing so may cause changes to your project file. Do you wish to update now?.\n        /// </summary>\n        internal static string NugetUpdate_Text {\n            get {\n                return ResourceManager.GetString(\"NugetUpdate_Text\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Update SlowCheetah NuGet package.\n        /// </summary>\n        internal static string NugetUpdate_Title {\n            get {\n                return ResourceManager.GetString(\"NugetUpdate_Title\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Updating the SlowCheetah NuGet package, this may take a few seconds.\n        /// </summary>\n        internal static string NugetUpdate_WaitText {\n            get {\n                return ResourceManager.GetString(\"NugetUpdate_WaitText\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to SlowCheetah Update.\n        /// </summary>\n        internal static string NugetUpdate_WaitTitle {\n            get {\n                return ResourceManager.GetString(\"NugetUpdate_WaitTitle\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {0}.{1}{2}.\n        /// </summary>\n        internal static string String_FormatTransformFilename {\n            get {\n                return ResourceManager.GetString(\"String_FormatTransformFilename\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {0} Preview.\n        /// </summary>\n        internal static string TransformPreview_Caption {\n            get {\n                return ResourceManager.GetString(\"TransformPreview_Caption\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to There was an error transforming your file. See the error list for more details.\n        /// </summary>\n        internal static string TransformPreview_ErrorMessage {\n            get {\n                return ResourceManager.GetString(\"TransformPreview_ErrorMessage\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Original {0}.\n        /// </summary>\n        internal static string TransformPreview_LeftLabel {\n            get {\n                return ResourceManager.GetString(\"TransformPreview_LeftLabel\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to Transformed {0}   (by  {1} ).\n        /// </summary>\n        internal static string TransformPreview_RightLabel {\n            get {\n                return ResourceManager.GetString(\"TransformPreview_RightLabel\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to {0} Preview.\n        /// </summary>\n        internal static string TransformPreview_ToolTip {\n            get {\n                return ResourceManager.GetString(\"TransformPreview_ToolTip\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Resources/Resources.resx",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"Error_CantFindPreviewTool\" xml:space=\"preserve\">\n    <value>Cannot find the preview tool {0}. Verify the transform settings in Tools\\Options.</value>\n    <comment>Error message</comment>\n  </data>\n  <data name=\"Error_FileToTransformNotFound\" xml:space=\"preserve\">\n    <value>Unable to preview transform. No source file found for {0}. Check to see if the file has not been renamed or removed from the project.</value>\n    <comment>Error message for when a transform file has no corresponding source file.</comment>\n  </data>\n  <data name=\"Error_NoPreviewToolSpecified\" xml:space=\"preserve\">\n    <value>No preview tool specified. You can set a preview tool in the transform settings in Tools\\Options.</value>\n    <comment>Error message</comment>\n  </data>\n  <data name=\"Error_SavingProjectFile\" xml:space=\"preserve\">\n    <value>Unable to save the project file {0}. {1}</value>\n    <comment>Error message</comment>\n  </data>\n  <data name=\"Error_SourceFileNotFound\" xml:space=\"preserve\">\n    <value>The source file for the transform {0} was not found.</value>\n    <comment>Error message</comment>\n  </data>\n  <data name=\"Error_TransformFileNotFound\" xml:space=\"preserve\">\n    <value>The transform file {0} was not found.</value>\n    <comment>Error message</comment>\n  </data>\n  <data name=\"NugetInstall_ErrorOutput\" xml:space=\"preserve\">\n    <value>Error installing SlowCheetah NuGet package to {0}.</value>\n    <comment>Text to be shown in the output window if there is an error with installing the SlowCheetah Nuget package</comment>\n  </data>\n  <data name=\"NugetInstall_FinishedOutput\" xml:space=\"preserve\">\n    <value>Finished installing SlowCheetah NuGet package to {0}.</value>\n    <comment>Text to be shown in the output window when the SlowCheetah Nuget package is done installing</comment>\n  </data>\n  <data name=\"NugetInstall_InstallingOutput\" xml:space=\"preserve\">\n    <value>Installing SlowCheetah NuGet package to {0} ...</value>\n    <comment>Text to be shown in the output window as the SlowCheetah NuGet package is being installed</comment>\n  </data>\n  <data name=\"NugetInstall_Text\" xml:space=\"preserve\">\n    <value>In order to execute transform on build, you will need the SlowCheetah NuGet package. Do you want to install the package now?</value>\n    <comment>Text for the prompt to install the SlowCheetah NuGet package</comment>\n  </data>\n  <data name=\"NugetInstall_Title\" xml:space=\"preserve\">\n    <value>Install SlowCheetah NuGet package</value>\n    <comment>Title for the prompt to install the SlowCheetah NuGet package</comment>\n  </data>\n  <data name=\"NugetUpdate_Link\" xml:space=\"preserve\">\n    <value>https://github.com/Microsoft/slow-cheetah/blob/main/doc/update.md</value>\n    <comment>Link to the update info for the SlowCheetah Nuget package</comment>\n  </data>\n  <data name=\"NugetUpdate_Text\" xml:space=\"preserve\">\n    <value>It seems that you have an older version of the SlowCheetah package installed. In order to avoid conflicts, you should update you package. Doing so may cause changes to your project file. Do you wish to update now?</value>\n    <comment>Text for the prompt to update the SlowCheetah NuGet package</comment>\n  </data>\n  <data name=\"NugetUpdate_Title\" xml:space=\"preserve\">\n    <value>Update SlowCheetah NuGet package</value>\n    <comment>Title for the prompt to update the SlowCheetah NuGet package</comment>\n  </data>\n  <data name=\"NugetUpdate_WaitText\" xml:space=\"preserve\">\n    <value>Updating the SlowCheetah NuGet package, this may take a few seconds</value>\n    <comment>Text for the wait dialog on update of the NuGet package</comment>\n  </data>\n  <data name=\"NugetUpdate_WaitTitle\" xml:space=\"preserve\">\n    <value>SlowCheetah Update</value>\n    <comment>Title for the wait dialog on update of the NuGet package</comment>\n  </data>\n  <data name=\"String_FormatTransformFilename\" xml:space=\"preserve\">\n    <value>{0}.{1}{2}</value>\n    <comment>This is the format string for the new transform file's filename.</comment>\n  </data>\n  <data name=\"TransformPreview_Caption\" xml:space=\"preserve\">\n    <value>{0} Preview</value>\n  </data>\n  <data name=\"TransformPreview_ErrorMessage\" xml:space=\"preserve\">\n    <value>There was an error transforming your file. See the error list for more details</value>\n    <comment>Error message to be shown upon failing Preview Transform</comment>\n  </data>\n  <data name=\"TransformPreview_LeftLabel\" xml:space=\"preserve\">\n    <value>Original {0}</value>\n  </data>\n  <data name=\"TransformPreview_RightLabel\" xml:space=\"preserve\">\n    <value>Transformed {0}   (by  {1} )</value>\n  </data>\n  <data name=\"TransformPreview_ToolTip\" xml:space=\"preserve\">\n    <value>{0} Preview</value>\n  </data>\n</root>"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/SlowCheetah.vsct",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<CommandTable xmlns=\"http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">\n\n  <!--  This is the file that defines the actual layout and type of the commands.\n        It is divided in different sections (e.g. command definition, command\n        placement, ...), with each defining a specific set of properties.\n        See the comment before each section for more details about how to\n        use it. -->\n\n  <!--  The VSCT compiler (the tool that translates this file into the binary \n        format that VisualStudio will consume) has the ability to run a preprocessor \n        on the vsct file; this preprocessor is (usually) the C++ preprocessor, so \n        it is possible to define includes and macros with the same syntax used \n        in C++ files. Using this ability of the compiler here, we include some files \n        defining some of the constants that we will use inside the file. -->\n\n  <!--This is the file that defines the IDs for all the commands exposed by VisualStudio. -->\n  <Extern href=\"stdidcmd.h\"/>\n\n  <!--This header contains the command ids for the menus provided by the shell. -->\n  <Extern href=\"vsshlids.h\"/>\n\n  <!--Definition of some VSCT specific constants. In this sample we use it for the IDs inside the guidOfficeIcon group. -->\n  <!-- <Extern href=\"msobtnid.h\"/> -->\n\n  <!--The Commands section is where we the commands, menus and menu groups are defined.\n      This section uses a Guid to identify the package that provides the command defined inside it. -->\n  <Commands package=\"guidSlowCheetahPkg\">\n    <!-- Inside this section we have different sub-sections: one for the menus, another  \n    for the menu groups, one for the buttons (the actual commands), one for the combos \n    and the last one for the bitmaps used. Each element is identified by a command id that  \n    is a unique pair of guid and numeric identifier; the guid part of the identifier is usually  \n    called \"command set\" and is used to group different command inside a logically related  \n    group; your package should define its own command set in order to avoid collisions  \n    with command ids defined by other packages. -->\n\n\n    <!-- In this section you can define new menu groups. A menu group is a container for \n         other menus or buttons (commands); from a visual point of view you can see the \n         group as the part of a menu contained between two lines. The parent of a group \n         must be a menu. -->\n    <Groups>\n      <Group guid=\"guidSlowCheetahCmdSet\" id=\"groupSlowCheetahContextMenu\" priority=\"0x0001\">\n        <Parent guid=\"guidSHLMainMenu\" id=\"IDM_VS_CTXT_ITEMNODE\" />\n      </Group>\n    </Groups>\n\n    <!--Buttons section. -->\n    <!--This section defines the elements the user can interact with, like a menu command or a button \n        or combo box in a toolbar. -->\n    <Buttons>\n      <!--To define a menu group you have to specify its ID, the parent menu and its display priority. \n          The command is visible and enabled by default. If you need to change the visibility, status, etc, you can use\n          the CommandFlag node.\n          You can add more than one CommandFlag node e.g.:\n              <CommandFlag>DefaultInvisible</CommandFlag>\n              <CommandFlag>DynamicVisibility</CommandFlag>\n          If you do not want an image next to your command, remove the Icon node or set it to <Icon guid=\"guidOfficeIcon\" id=\"msotcidNoIcon\" /> -->\n\n      <Button guid=\"guidSlowCheetahCmdSet\" id=\"cmdidSlowCheetahAddTransform\" priority=\"0x9100\" type=\"Button\">\n        <Parent guid=\"guidSHLMainMenu\" id=\"IDG_VS_PROJ_MISCADD\" />\n        <Icon guid=\"guidAddImage\" id=\"1\" />\n        <CommandFlag>DynamicVisibility</CommandFlag>\n        <CommandFlag>DefaultInvisible</CommandFlag>\n        <CommandFlag>DefaultDisabled</CommandFlag>\n        <Strings>\n          <CommandName>cmdidSlowCheetahAddTransform</CommandName>\n          <ButtonText>Add Transform</ButtonText>\n        </Strings>\n      </Button>\n      <Button guid=\"guidSlowCheetahCmdSet\" id=\"cmdidSlowCheetahPreviewTransform\" priority=\"0x9100\" type=\"Button\">\n        <Parent guid=\"guidSHLMainMenu\" id=\"IDG_VS_PROJ_MISCADD\" />\n        <Icon guid=\"guidPreviewImage\" id=\"1\" />\n        <CommandFlag>DynamicVisibility</CommandFlag>\n        <CommandFlag>DefaultInvisible</CommandFlag>\n        <CommandFlag>DefaultDisabled</CommandFlag>\n        <Strings>\n          <CommandName>cmdidSlowCheetahPreviewTransform</CommandName>\n          <ButtonText>Preview Transform</ButtonText>\n        </Strings>\n      </Button>\n\n    </Buttons>\n\n    <!--The bitmaps section is used to define the bitmaps that are used for the commands.-->\n    <Bitmaps>\n      <!--  The bitmap id is defined in a way that is a little bit different from the others: \n            the declaration starts with a guid for the bitmap strip, then there is the resource id of the \n            bitmap strip containing the bitmaps and then there are the numeric ids of the elements used \n            inside a button definition. An important aspect of this declaration is that the element id \n            must be the actual index (1-based) of the bitmap inside the bitmap strip. -->\n      <Bitmap guid=\"guidAddImage\" href=\"Resources\\Images\\AddTransform_16x.png\"/>\n      <Bitmap guid=\"guidPreviewImage\" href=\"Resources\\Images\\PreviewTransform_16x.png\"/>\n\n    </Bitmaps>\n  </Commands>\n\n  <CommandPlacements>\n    <CommandPlacement guid=\"guidSlowCheetahCmdSet\" id=\"cmdidSlowCheetahAddTransform\" priority=\"0x9000\">\n      <Parent guid=\"guidSlowCheetahCmdSet\" id=\"groupSlowCheetahContextMenu\"/>\n    </CommandPlacement>\n    <CommandPlacement guid=\"guidSlowCheetahCmdSet\" id=\"cmdidSlowCheetahPreviewTransform\" priority=\"0x9001\">\n      <Parent guid=\"guidSlowCheetahCmdSet\" id=\"groupSlowCheetahContextMenu\"/>\n    </CommandPlacement>\n  </CommandPlacements>\n\n  <Symbols>\n    <!-- This is the package guid. -->\n    <GuidSymbol name=\"guidSlowCheetahPkg\" value=\"{9eb9f150-fcc9-4db8-9e97-6aef2011017c}\" />\n\n    <!-- This is the guid used to group the menu commands together -->\n    <GuidSymbol name=\"guidSlowCheetahCmdSet\" value=\"{eab4615a-3384-42bd-9589-e2df97a783ee}\">\n      <IDSymbol name=\"groupSlowCheetahContextMenu\" value=\"0x1021\"/>\n      <IDSymbol name=\"cmdidSlowCheetahAddTransform\" value=\"0x0100\" />\n      <IDSymbol name=\"cmdidSlowCheetahPreviewTransform\" value=\"0x0101\" />\n    </GuidSymbol>\n\n    <!-- Menu icons guids -->\n    <GuidSymbol name=\"guidAddImage\" value=\"{0fd0ec5c-2f14-49b5-ba9a-6305981893a2}\"/>\n    <GuidSymbol name=\"guidPreviewImage\" value=\"{a814715d-dd37-404a-96da-ed9ba3418955}\"/>\n  </Symbols>\n</CommandTable>"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/SlowCheetahPackage.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Diagnostics.CodeAnalysis;\n    using System.IO;\n    using System.Runtime.InteropServices;\n    using System.Threading;\n    using Microsoft.VisualStudio.Shell;\n    using Microsoft.VisualStudio.Shell.Interop;\n\n    /// <summary>\n    /// This is the class that implements the package exposed by this assembly.\n    /// </summary>\n    /// <remarks>\n    /// <para>\n    /// The minimum requirement for a class to be considered a valid package for Visual Studio\n    /// is to implement the IVsPackage interface and register itself with the shell.\n    /// This package uses the helper classes defined inside the Managed Package Framework (MPF)\n    /// to do it: it derives from the Package class that provides the implementation of the\n    /// IVsPackage interface and uses the registration attributes defined in the framework to\n    /// register itself and its components with the shell. These attributes tell the pkgdef creation\n    /// utility what data to put into .pkgdef file.\n    /// </para>\n    /// <para>\n    /// To get loaded into VS, the package must be referred by &lt;Asset Type=\"Microsoft.VisualStudio.VsPackage\" ...&gt; in .vsixmanifest file.\n    /// </para>\n    /// </remarks>\n    // This attribute tells the PkgDef creation utility (CreatePkgDef.exe) that this class is a package.\n    [PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]\n\n    // This attribute is used to register the informations needed to show the this package in the Help/About dialog of Visual Studio.\n    [InstalledProductRegistration(\"#110\", \"#112\", \"1.0\", IconResourceID = 400)]\n    [ProvideAutoLoad(UIContextGuids80.SolutionExists, PackageAutoLoadFlags.BackgroundLoad)]\n\n    // This attribute is needed to let the shell know that this package exposes some menus.\n    [ProvideMenuResource(\"Menus.ctmenu\", 1)]\n    [Guid(Guids.GuidSlowCheetahPkgString)]\n    [ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExists_string, PackageAutoLoadFlags.BackgroundLoad)]\n    [ProvideOptionPage(typeof(OptionsDialogPage), \"Slow Cheetah\", \"General\", 100, 101, true)]\n    [ProvideOptionPage(typeof(AdvancedOptionsDialogPage), \"Slow Cheetah\", \"Advanced\", 100, 101, true)]\n    [SuppressMessage(\"StyleCop.CSharp.DocumentationRules\", \"SA1650:ElementDocumentationMustBeSpelledCorrectly\", Justification = \"pkgdef, VS and vsixmanifest are valid VS terms\")]\n    public sealed partial class SlowCheetahPackage : AsyncPackage\n    {\n        /// <summary>\n        /// The TransformOnBuild metadata name.\n        /// </summary>\n        public static readonly string TransformOnBuild = \"TransformOnBuild\";\n\n        /// <summary>\n        /// The IsTransformFile metadata name.\n        /// </summary>\n        public static readonly string IsTransformFile = \"IsTransformFile\";\n\n        /// <summary>\n        /// The DependentUpon metadata name.\n        /// </summary>\n        public static readonly string DependentUpon = \"DependentUpon\";\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"SlowCheetahPackage\"/> class.\n        /// </summary>\n        public SlowCheetahPackage()\n        {\n            // Inside this method you can place any initialization code that does not require\n            // any Visual Studio service because at this point the package object is created but\n            // not sited yet inside Visual Studio environment. The place to do all the other\n            // initialization is the Initialize method.\n            OurPackage = this;\n        }\n\n        /// <summary>\n        /// Gets the SlowCheetahPackage.\n        /// </summary>\n        public static SlowCheetahPackage OurPackage { get; private set; }\n\n        private SlowCheetahNuGetManager NuGetManager { get; set; }\n\n        private SlowCheetahPackageLogger PackageLogger { get; set; }\n\n        private ErrorListProvider ErrorListProvider { get; set; }\n\n        private AddTransformCommand AddCommand { get; set; }\n\n        private PreviewTransformCommand PreviewCommand { get; set; }\n\n        private PackageSolutionEvents SolutionEvents { get; set; }\n\n        /// <summary>\n        /// Verifies if the current project supports transformations.\n        /// </summary>\n        /// <param name=\"project\">Current IVsProject.</param>\n        /// <returns>True if the project supports transformation.</returns>\n        public bool ProjectSupportsTransforms(IVsProject project)\n        {\n            return this.NuGetManager.ProjectSupportsNuget(project as IVsHierarchy);\n        }\n\n        /// <summary>\n        /// Verifies if the item has a trasform configured already.\n        /// </summary>\n        /// <param name=\"vsProject\">The current project.</param>\n        /// <param name=\"itemid\">The id of the selected item inside the project.</param>\n        /// <returns>True if the item has a transform.</returns>\n        public bool IsItemTransformItem(IVsProject vsProject, uint itemid)\n        {\n            IVsBuildPropertyStorage buildPropertyStorage = vsProject as IVsBuildPropertyStorage;\n            if (buildPropertyStorage == null)\n            {\n                this.PackageLogger.LogMessage(\"Error obtaining IVsBuildPropertyStorage from hierarcy.\");\n                return false;\n            }\n\n            buildPropertyStorage.GetItemAttribute(itemid, IsTransformFile, out string value);\n            if (bool.TryParse(value, out bool valueAsBool) && valueAsBool)\n            {\n                return true;\n            }\n\n            // we need to special case web.config transform files\n            buildPropertyStorage.GetItemAttribute(itemid, \"FullPath\", out string filePath);\n            IEnumerable<string> configs = ProjectUtilities.GetProjectConfigurations(vsProject as IVsHierarchy);\n\n            // If the project is a web app, check for the Web.config files added by default\n            return ProjectUtilities.IsProjectWebApp(vsProject) && PackageUtilities.IsFileTransformForBuildConfiguration(\"web.config\", Path.GetFileName(filePath), configs);\n        }\n\n        /// <summary>\n        /// Initialization of the package; this method is called right after the package is sited, so this is the place\n        /// where you can put all the initialization code that rely on services provided by VisualStudio.\n        /// </summary>\n        /// <param name=\"cancellationToken\">Cancellation token.</param>\n        /// <param name=\"progress\">Package load progress provider.</param>\n        /// <returns>Async task.</returns>\n        protected override async System.Threading.Tasks.Task InitializeAsync(CancellationToken cancellationToken, IProgress<ServiceProgressData> progress)\n        {\n            await base.InitializeAsync(cancellationToken, progress);\n\n            // Initialize the properties\n            this.NuGetManager = new SlowCheetahNuGetManager(this);\n            this.PackageLogger = new SlowCheetahPackageLogger(this);\n            this.ErrorListProvider = new ErrorListProvider(this);\n            this.AddCommand = new AddTransformCommand(this, this.NuGetManager, this.PackageLogger);\n            this.PreviewCommand = new PreviewTransformCommand(this, this.NuGetManager, this.PackageLogger, this.ErrorListProvider);\n            this.SolutionEvents = new PackageSolutionEvents(this, this.ErrorListProvider);\n\n            // Asynchronously register the commands and solution events\n            await this.AddCommand.RegisterCommandAsync();\n            await this.PreviewCommand.RegisterCommandAsync();\n            await this.SolutionEvents.RegisterEventsAsync();\n        }\n\n        /// <inheritdoc/>\n        protected override void Dispose(bool disposing)\n        {\n            if (disposing)\n            {\n                this.SolutionEvents.Dispose();\n\n                this.PreviewCommand.Dispose();\n\n                base.Dispose(disposing);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/TransformationPreviewLogger.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Globalization;\n    using Microsoft.VisualStudio.Shell;\n    using Microsoft.VisualStudio.Shell.Interop;\n    using SlowCheetah;\n\n    /// <summary>\n    /// Logger for XDT transformation on Preview Transform.\n    /// </summary>\n    public class TransformationPreviewLogger : ITransformationLogger\n    {\n        private readonly ErrorListProvider errorListProvider;\n        private readonly IVsHierarchy hierachy;\n\n        /// <summary>\n        /// Initializes a new instance of the <see cref=\"TransformationPreviewLogger\"/> class.\n        /// </summary>\n        /// <param name=\"errorListProvider\">The VS Package.</param>\n        /// <param name=\"hierachy\">The current project hierarchy.</param>\n        public TransformationPreviewLogger(ErrorListProvider errorListProvider, IVsHierarchy hierachy)\n        {\n            this.errorListProvider = errorListProvider ?? throw new ArgumentNullException(nameof(errorListProvider));\n            this.hierachy = hierachy ?? throw new ArgumentNullException(nameof(hierachy));\n        }\n\n        /// <inheritdoc/>\n        public void LogError(string message, params object[] messageArgs)\n        {\n            this.AddError(TaskErrorCategory.Error, string.Format(CultureInfo.CurrentCulture, message, messageArgs), null, 0, 0);\n        }\n\n        /// <inheritdoc/>\n        public void LogError(string file, int lineNumber, int linePosition, string message, params object[] messageArgs)\n        {\n            this.AddError(TaskErrorCategory.Error, string.Format(CultureInfo.CurrentCulture, message, messageArgs), file, lineNumber, linePosition);\n        }\n\n        /// <inheritdoc/>\n        public void LogErrorFromException(Exception ex)\n        {\n            this.AddError(ex, TaskErrorCategory.Error, null, 0, 0);\n        }\n\n        /// <inheritdoc/>\n        public void LogErrorFromException(Exception ex, string file, int lineNumber, int linePosition)\n        {\n            this.AddError(ex, TaskErrorCategory.Error, file, lineNumber, linePosition);\n        }\n\n        /// <inheritdoc/>\n        public void LogMessage(LogMessageImportance importance, string message, params object[] messageArgs)\n        {\n            if (importance != LogMessageImportance.Low)\n            {\n                this.AddError(TaskErrorCategory.Message, string.Format(CultureInfo.CurrentCulture, message, messageArgs), null, 0, 0);\n            }\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string message, params object[] messageArgs)\n        {\n            this.AddError(TaskErrorCategory.Warning, string.Format(CultureInfo.CurrentCulture, message, messageArgs), null, 0, 0);\n        }\n\n        /// <inheritdoc/>\n        public void LogWarning(string file, int lineNumber, int linePosition, string message, params object[] messageArgs)\n        {\n            this.AddError(TaskErrorCategory.Warning, string.Format(CultureInfo.CurrentCulture, message, messageArgs), file, lineNumber, linePosition);\n        }\n\n        private void AddError(TaskErrorCategory errorCategory, string text, string file, int lineNumber, int linePosition)\n        {\n            this.ShowError(new ErrorTask(), errorCategory, text, file, lineNumber, linePosition);\n        }\n\n        private void AddError(Exception ex, TaskErrorCategory errorCategory, string file, int lineNumber, int linePosition)\n        {\n            this.ShowError(new ErrorTask(ex), errorCategory, ex.Message, file, lineNumber, linePosition);\n        }\n\n        private void ShowError(ErrorTask newError, TaskErrorCategory errorCategory, string text, string file, int lineNumber, int linePosition)\n        {\n            newError.Category = TaskCategory.Misc;\n            newError.ErrorCategory = errorCategory;\n            newError.Text = text;\n            newError.Document = file;\n            newError.Line = lineNumber;\n            newError.Column = linePosition;\n\n            newError.Navigate += (sender, e) =>\n            {\n                this.errorListProvider.Navigate(newError, new Guid(EnvDTE.Constants.vsViewKindCode));\n            };\n\n            this.errorListProvider.Tasks.Add(newError);\n            this.errorListProvider.Show();\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Utilities/PackageUtilities.cs",
    "content": "// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Text.RegularExpressions;\n    using Microsoft.VisualStudio;\n    using Microsoft.VisualStudio.Shell.Interop;\n\n    /// <summary>\n    /// Utilities class for the Visual Studio Extension Package.\n    /// </summary>\n    public class PackageUtilities\n    {\n        /// <summary>\n        /// Set of extensions we explicitly do not support transforms for.\n        /// We use this avoid hitting the disk in most scenarios.\n        /// </summary>\n        private static readonly HashSet<string> ExcludedExtensions = new HashSet<string>()\n        {\n            \".dll\",\n            \".pdb\",\n            \".txt\",\n            \".settings\",\n            \".snk\",\n\n            // source files\n            \".aspx\",\n            \".c\",\n            \".cpp\",\n            \".cs\",\n            \".cshtml\",\n            \".css\",\n            \".h\",\n            \".htm\",\n            \".html\",\n            \".js\",\n            \".jsx\",\n            \".less\",\n            \".resx\",\n            \".ts\",\n            \".sass\",\n            \".vb\",\n            \".vbs\",\n            \".wsf\",\n\n            // image files\n            \".bmp\",\n            \".gif\",\n            \".ico\",\n            \".jpeg\",\n            \".jpg\",\n            \".png\",\n        };\n\n        /// <summary>\n        /// Verifies if the extension of the given file is supported.\n        /// </summary>\n        /// <param name=\"filePath\">Full path to the file.</param>\n        /// <returns>True if the file is supported.</returns>\n        public static bool IsExtensionSupportedForFile(string filePath)\n        {\n            if (string.IsNullOrWhiteSpace(filePath))\n            {\n                throw new ArgumentNullException(nameof(filePath));\n            }\n\n            if (!File.Exists(filePath))\n            {\n                throw new FileNotFoundException(\"File not found\", filePath);\n            }\n\n            return !ExcludedExtensions.Contains(Path.GetExtension(filePath));\n        }\n\n        /// <summary>\n        /// Creates a temporary file name with an optional extension.\n        /// </summary>\n        /// <param name=\"ensureFileDoesntExist\">Whether it is ensured the file does not exist.</param>\n        /// <param name=\"extension\">Optional extension for the file.</param>\n        /// <returns>Full path to the temporary file.</returns>\n        public static string GetTempFilename(bool ensureFileDoesntExist, string extension = null)\n        {\n            string path = Path.GetTempFileName();\n\n            if (!string.IsNullOrWhiteSpace(extension))\n            {\n                // delete the file at path and then add the extension to it\n                File.Delete(path);\n\n                extension = extension.Trim();\n                if (!extension.StartsWith(\".\", StringComparison.OrdinalIgnoreCase))\n                {\n                    extension = \".\" + extension;\n                }\n\n                path += extension;\n            }\n\n            if (ensureFileDoesntExist && File.Exists(path))\n            {\n                File.Delete(path);\n            }\n\n            return path;\n        }\n\n        /// <summary>\n        /// Checks if a file is a transform of another file according to their names and the given configurations\n        /// If a given file is  \"name.extension\", a transfomation file should be \"name.{configuration}.extension\".\n        /// </summary>\n        /// <param name=\"documentName\">Name of the source file.</param>\n        /// <param name=\"transformName\">Name of the potential transform file.</param>\n        /// <param name=\"configs\">Project configurations.</param>\n        /// <returns>True if the names correspond to compatible transformation files.</returns>\n        public static bool IsFileTransformForBuildConfiguration(string documentName, string transformName, IEnumerable<string> configs)\n        {\n            if (configs == null || !configs.Any())\n            {\n                return false;\n            }\n\n            if (TryGetFileTransform(documentName, transformName, out string config))\n            {\n                return configs.Any(s => s.Equals(config, StringComparison.OrdinalIgnoreCase));\n            }\n            else\n            {\n                return false;\n            }\n        }\n\n        /// <summary>\n        /// Checks if a file is a generic transform of another file\n        /// If a given file is  \"name.extension\", a transfomation file should be \"name.{something}.extension\".\n        /// </summary>\n        /// <param name=\"documentName\">Name of the source file.</param>\n        /// <param name=\"transformName\">Name of the potential transform file.</param>\n        /// <returns>True if the names correspond to compatible transformation files.</returns>\n        public static bool IsGenericFileTransform(string documentName, string transformName)\n        {\n            return TryGetFileTransform(documentName, transformName, out _);\n        }\n\n        /// <summary>\n        /// Gets if a path is valid or not.\n        /// </summary>\n        /// <param name=\"path\">The path to check if it is valid.</param>\n        /// <returns>True if path is valid, false otherwise.</returns>\n        public static bool IsPathValid(string path)\n        {\n            // empty path is valid\n            if (string.IsNullOrEmpty(path))\n            {\n                return true;\n            }\n\n            return !path.Any(c => Path.GetInvalidPathChars().Contains(c));\n        }\n\n        /// <summary>\n        /// Gets an item from the project hierarchy.\n        /// </summary>\n        /// <typeparam name=\"T\">Type of object to be fetched.</typeparam>\n        /// <param name=\"pHierarchy\">Current IVsHierarchy.</param>\n        /// <param name=\"itemID\">ID of the desired item in the project.</param>\n        /// <returns>The desired object typed to T.</returns>\n        public static T GetAutomationFromHierarchy<T>(IVsHierarchy pHierarchy, uint itemID)\n            where T : class\n        {\n            ErrorHandler.ThrowOnFailure(pHierarchy.GetProperty(itemID, (int)__VSHPROPID.VSHPROPID_ExtObject, out object propertyValue));\n            T projectItem = propertyValue as T;\n\n            return projectItem;\n        }\n\n        private static bool TryGetFileTransform(string documentName, string transformName, out string config)\n        {\n            config = null;\n\n            if (string.IsNullOrEmpty(documentName))\n            {\n                return false;\n            }\n\n            if (string.IsNullOrEmpty(transformName))\n            {\n                return false;\n            }\n\n            if (!Path.GetExtension(documentName).Equals(Path.GetExtension(transformName), StringComparison.OrdinalIgnoreCase))\n            {\n                return false;\n            }\n            else\n            {\n                string docNameNoExt = Path.GetFileNameWithoutExtension(documentName);\n                string trnNameNoExt = Path.GetFileNameWithoutExtension(transformName);\n                Regex regex = new Regex(\"^\" + docNameNoExt + @\"\\.\", RegexOptions.IgnoreCase);\n                config = regex.Replace(trnNameNoExt, string.Empty);\n                return !string.IsNullOrEmpty(config) && !config.Equals(trnNameNoExt, StringComparison.OrdinalIgnoreCase);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/Utilities/ProjectUtilities.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS\n{\n    using System;\n    using System.Collections.Generic;\n    using System.Runtime.InteropServices;\n    using EnvDTE;\n    using Microsoft.VisualStudio;\n    using Microsoft.VisualStudio.Shell;\n    using Microsoft.VisualStudio.Shell.Interop;\n\n    /// <summary>\n    /// Utilities class for the Visual Studio Extension Package that deals specifically with projects.\n    /// </summary>\n    public static class ProjectUtilities\n    {\n        private const string SupportedProjectExtensionsKey = @\"XdtTransforms\\SupportedProjectExtensions\";\n        private const string SupportedItemExtensionsKey = @\"XdtTransforms\\SupportedItemExtensions\";\n\n        private static IEnumerable<string> supportedProjectExtensions;\n        private static IEnumerable<string> supportedItemExtensions;\n\n        /// <summary>\n        /// Gets the DTE from current context.\n        /// </summary>\n        /// <returns>The Visual Studio DTE object.</returns>\n        public static DTE GetDTE()\n        {\n            return (DTE)Package.GetGlobalService(typeof(DTE));\n        }\n\n        /// <summary>\n        /// Verifies if a single object is selected.\n        /// </summary>\n        /// <param name=\"hierarchy\">Current selected project hierarchy.</param>\n        /// <param name=\"itemid\">ID of the selected item.</param>\n        /// <returns>True if a single item is selected.</returns>\n        public static bool IsSingleProjectItemSelection(out IVsHierarchy hierarchy, out uint itemid)\n        {\n            hierarchy = null;\n            itemid = VSConstants.VSITEMID_NIL;\n            int hr = VSConstants.S_OK;\n\n            IVsMonitorSelection monitorSelection = Package.GetGlobalService(typeof(SVsShellMonitorSelection)) as IVsMonitorSelection;\n            IVsSolution solution = Package.GetGlobalService(typeof(SVsSolution)) as IVsSolution;\n            if (monitorSelection == null || solution == null)\n            {\n                return false;\n            }\n\n            IVsMultiItemSelect multiItemSelect = null;\n            IntPtr hierarchyPtr = IntPtr.Zero;\n            IntPtr selectionContainerPtr = IntPtr.Zero;\n\n            try\n            {\n                hr = monitorSelection.GetCurrentSelection(out hierarchyPtr, out itemid, out multiItemSelect, out selectionContainerPtr);\n\n                if (ErrorHandler.Failed(hr) || hierarchyPtr == IntPtr.Zero || itemid == VSConstants.VSITEMID_NIL)\n                {\n                    // there is no selection\n                    return false;\n                }\n\n                if (multiItemSelect != null)\n                {\n                    // multiple items are selected\n                    return false;\n                }\n\n                if (itemid == VSConstants.VSITEMID_ROOT)\n                {\n                    // there is a hierarchy root node selected, thus it is not a single item inside a project\n                    return false;\n                }\n\n                hierarchy = Marshal.GetObjectForIUnknown(hierarchyPtr) as IVsHierarchy;\n                if (hierarchy == null)\n                {\n                    return false;\n                }\n\n                Guid guidProjectID = Guid.Empty;\n\n                if (ErrorHandler.Failed(solution.GetGuidOfProject(hierarchy, out guidProjectID)))\n                {\n                    return false; // hierarchy is not a project inside the Solution if it does not have a ProjectID Guid\n                }\n\n                // if we got this far then there is a single project item selected\n                return true;\n            }\n            finally\n            {\n                if (selectionContainerPtr != IntPtr.Zero)\n                {\n                    Marshal.Release(selectionContainerPtr);\n                }\n\n                if (hierarchyPtr != IntPtr.Zero)\n                {\n                    Marshal.Release(hierarchyPtr);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Gets all project configurations.\n        /// </summary>\n        /// <param name=\"project\">Current open project.</param>\n        /// <returns>List of configuration names for that project.</returns>\n        public static IEnumerable<string> GetProjectConfigurations(Project project)\n        {\n            List<string> configurations = new List<string>();\n\n            if (project != null && project.ConfigurationManager != null && project.ConfigurationManager.ConfigurationRowNames != null)\n            {\n                foreach (object objConfigName in (object[])project.ConfigurationManager.ConfigurationRowNames)\n                {\n                    string configName = objConfigName as string;\n                    if (!string.IsNullOrWhiteSpace(configName))\n                    {\n                        configurations.Add(configName);\n                    }\n                }\n            }\n\n            return configurations;\n        }\n\n        /// <summary>\n        /// Gets all project configurations.\n        /// </summary>\n        /// <param name=\"hierarchy\">Current project hierarchy.</param>\n        /// <returns>List of configuration names for that project.</returns>\n        public static IEnumerable<string> GetProjectConfigurations(IVsHierarchy hierarchy)\n        {\n            Project project = PackageUtilities.GetAutomationFromHierarchy<Project>(hierarchy, (uint)VSConstants.VSITEMID.Root);\n            return GetProjectConfigurations(project);\n        }\n\n        /// <summary>\n        /// Retrieves the supported project extensions from the package settings.\n        /// </summary>\n        /// <param name=\"settingsManager\">The settings manager for the project.</param>\n        /// <returns>List of supported project extensions starting with '.'.</returns>\n        public static IEnumerable<string> GetSupportedProjectExtensions(IVsSettingsManager settingsManager)\n        {\n            if (supportedProjectExtensions == null)\n            {\n                supportedProjectExtensions = GetSupportedExtensions(settingsManager, SupportedProjectExtensionsKey);\n            }\n\n            return supportedProjectExtensions;\n        }\n\n        /// <summary>\n        /// Retrieves the supported item extensions from the package settings.\n        /// </summary>\n        /// <param name=\"settingsManager\">The settings manager for the project.</param>\n        /// <returns>A list of supported item extensions.</returns>\n        public static IEnumerable<string> GetSupportedItemExtensions(IVsSettingsManager settingsManager)\n        {\n            if (supportedItemExtensions == null)\n            {\n                supportedItemExtensions = GetSupportedExtensions(settingsManager, SupportedProjectExtensionsKey);\n            }\n\n            return supportedItemExtensions;\n        }\n\n        /// <summary>\n        /// Verifies if the given project is a Web Application.\n        /// Checks the type GUIDs for that project.\n        /// </summary>\n        /// <param name=\"project\">Project to verify.</param>\n        /// <returns>True if a subtype GUID matches the Web App Guid in Resources.</returns>\n        public static bool IsProjectWebApp(IVsProject project)\n        {\n            if (project is IVsAggregatableProject aggregatableProject)\n            {\n                aggregatableProject.GetAggregateProjectTypeGuids(out string projectTypeGuidStrings);\n                var projectTypeGuids = new List<Guid>();\n                foreach (string gs in projectTypeGuidStrings.Split(';'))\n                {\n                    try\n                    {\n                        var guid = new Guid(gs);\n\n                        projectTypeGuids.Add(guid);\n                    }\n                    catch\n                    {\n                        // Don't add to list of guids\n                    }\n                }\n\n                return projectTypeGuids.Contains(Guids.GuidWebApplication);\n            }\n\n            return false;\n        }\n\n        private static IEnumerable<string> GetSupportedExtensions(IVsSettingsManager settingsManager, string rootKey)\n        {\n            ErrorHandler.ThrowOnFailure(settingsManager.GetReadOnlySettingsStore((uint)__VsSettingsScope.SettingsScope_Configuration, out IVsSettingsStore settings));\n            ErrorHandler.ThrowOnFailure(settings.GetSubCollectionCount(rootKey, out uint count));\n\n            List<string> supportedExtensions = new List<string>();\n\n            for (uint i = 0; i != count; ++i)\n            {\n                ErrorHandler.ThrowOnFailure(settings.GetSubCollectionName(rootKey, i, out string keyName));\n                supportedExtensions.Add(keyName);\n            }\n\n            return supportedExtensions;\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/VSPackage.Designer.cs",
    "content": "﻿//------------------------------------------------------------------------------\n// <auto-generated>\n//     This code was generated by a tool.\n//     Runtime Version:4.0.30319.42000\n//\n//     Changes to this file may cause incorrect behavior and will be lost if\n//     the code is regenerated.\n// </auto-generated>\n//------------------------------------------------------------------------------\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS {\n    using System;\n    \n    \n    /// <summary>\n    ///   A strongly-typed resource class, for looking up localized strings, etc.\n    /// </summary>\n    // This class was auto-generated by the StronglyTypedResourceBuilder\n    // class via a tool like ResGen or Visual Studio.\n    // To add or remove a member, edit your .ResX file then rerun ResGen\n    // with the /str option, or rebuild your VS project.\n    [global::System.CodeDom.Compiler.GeneratedCodeAttribute(\"System.Resources.Tools.StronglyTypedResourceBuilder\", \"17.0.0.0\")]\n    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]\n    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]\n    internal class VSPackage {\n        \n        private static global::System.Resources.ResourceManager resourceMan;\n        \n        private static global::System.Globalization.CultureInfo resourceCulture;\n        \n        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute(\"Microsoft.Performance\", \"CA1811:AvoidUncalledPrivateCode\")]\n        internal VSPackage() {\n        }\n        \n        /// <summary>\n        ///   Returns the cached ResourceManager instance used by this class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Resources.ResourceManager ResourceManager {\n            get {\n                if (object.ReferenceEquals(resourceMan, null)) {\n                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager(\"Microsoft.VisualStudio.SlowCheetah.VS.VSPackage\", typeof(VSPackage).Assembly);\n                    resourceMan = temp;\n                }\n                return resourceMan;\n            }\n        }\n        \n        /// <summary>\n        ///   Overrides the current thread's CurrentUICulture property for all\n        ///   resource lookups using this strongly typed resource class.\n        /// </summary>\n        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]\n        internal static global::System.Globalization.CultureInfo Culture {\n            get {\n                return resourceCulture;\n            }\n            set {\n                resourceCulture = value;\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to SlowCheetah - XML config transforms.\n        /// </summary>\n        internal static string _110 {\n            get {\n                return ResourceManager.GetString(\"110\", resourceCulture);\n            }\n        }\n        \n        /// <summary>\n        ///   Looks up a localized string similar to This package enables you to transform your app.config or any other XML file based on the build configuration. It also adds additional tooling to help you create XML transforms..\n        /// </summary>\n        internal static string _112 {\n            get {\n                return ResourceManager.GetString(\"112\", resourceCulture);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/VSPackage.resx",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n  <!-- \n    Microsoft ResX Schema \n    \n    Version 2.0\n    \n    The primary goals of this format is to allow a simple XML format \n    that is mostly human readable. The generation and parsing of the \n    various data types are done through the TypeConverter classes \n    associated with the data types.\n    \n    Example:\n    \n    ... ado.net/XML headers & schema ...\n    <resheader name=\"resmimetype\">text/microsoft-resx</resheader>\n    <resheader name=\"version\">2.0</resheader>\n    <resheader name=\"reader\">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\n    <resheader name=\"writer\">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\n    <data name=\"Name1\"><value>this is my long string</value><comment>this is a comment</comment></data>\n    <data name=\"Color1\" type=\"System.Drawing.Color, System.Drawing\">Blue</data>\n    <data name=\"Bitmap1\" mimetype=\"application/x-microsoft.net.object.binary.base64\">\n        <value>[base64 mime encoded serialized .NET Framework object]</value>\n    </data>\n    <data name=\"Icon1\" type=\"System.Drawing.Icon, System.Drawing\" mimetype=\"application/x-microsoft.net.object.bytearray.base64\">\n        <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\n        <comment>This is a comment</comment>\n    </data>\n                \n    There are any number of \"resheader\" rows that contain simple \n    name/value pairs.\n    \n    Each data row contains a name, and value. The row also contains a \n    type or mimetype. Type corresponds to a .NET class that support \n    text/value conversion through the TypeConverter architecture. \n    Classes that don't support this are serialized and stored with the \n    mimetype set.\n    \n    The mimetype is used for serialized objects, and tells the \n    ResXResourceReader how to depersist the object. This is currently not \n    extensible. For a given mimetype the value must be set accordingly:\n    \n    Note - application/x-microsoft.net.object.binary.base64 is the format \n    that the ResXResourceWriter will generate, however the reader can \n    read any of the formats listed below.\n    \n    mimetype: application/x-microsoft.net.object.binary.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\n            : and then encoded with base64 encoding.\n    \n    mimetype: application/x-microsoft.net.object.soap.base64\n    value   : The object must be serialized with \n            : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\n            : and then encoded with base64 encoding.\n\n    mimetype: application/x-microsoft.net.object.bytearray.base64\n    value   : The object must be serialized into a byte array \n            : using a System.ComponentModel.TypeConverter\n            : and then encoded with base64 encoding.\n    -->\n  <xsd:schema id=\"root\" xmlns=\"\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">\n    <xsd:import namespace=\"http://www.w3.org/XML/1998/namespace\" />\n    <xsd:element name=\"root\" msdata:IsDataSet=\"true\">\n      <xsd:complexType>\n        <xsd:choice maxOccurs=\"unbounded\">\n          <xsd:element name=\"metadata\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" use=\"required\" type=\"xsd:string\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"assembly\">\n            <xsd:complexType>\n              <xsd:attribute name=\"alias\" type=\"xsd:string\" />\n              <xsd:attribute name=\"name\" type=\"xsd:string\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"data\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n                <xsd:element name=\"comment\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"2\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" msdata:Ordinal=\"1\" />\n              <xsd:attribute name=\"type\" type=\"xsd:string\" msdata:Ordinal=\"3\" />\n              <xsd:attribute name=\"mimetype\" type=\"xsd:string\" msdata:Ordinal=\"4\" />\n              <xsd:attribute ref=\"xml:space\" />\n            </xsd:complexType>\n          </xsd:element>\n          <xsd:element name=\"resheader\">\n            <xsd:complexType>\n              <xsd:sequence>\n                <xsd:element name=\"value\" type=\"xsd:string\" minOccurs=\"0\" msdata:Ordinal=\"1\" />\n              </xsd:sequence>\n              <xsd:attribute name=\"name\" type=\"xsd:string\" use=\"required\" />\n            </xsd:complexType>\n          </xsd:element>\n        </xsd:choice>\n      </xsd:complexType>\n    </xsd:element>\n  </xsd:schema>\n  <resheader name=\"resmimetype\">\n    <value>text/microsoft-resx</value>\n  </resheader>\n  <resheader name=\"version\">\n    <value>2.0</value>\n  </resheader>\n  <resheader name=\"reader\">\n    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <resheader name=\"writer\">\n    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\n  </resheader>\n  <data name=\"110\" xml:space=\"preserve\">\n    <value>SlowCheetah - XML config transforms</value>\n  </data>\n  <data name=\"112\" xml:space=\"preserve\">\n    <value>This package enables you to transform your app.config or any other XML file based on the build configuration. It also adds additional tooling to help you create XML transforms.</value>\n  </data>\n  <assembly alias=\"System.Windows.Forms\" name=\"System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\" />\n</root>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS/source.extension.vsixmanifest",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<PackageManifest Version=\"2.0.0\" xmlns=\"http://schemas.microsoft.com/developer/vsx-schema/2011\" xmlns:d=\"http://schemas.microsoft.com/developer/vsx-schema-design/2011\">\n    <Metadata>\n        <Identity Id=\"Microsoft.VisualStudio.SlowCheetah.Dev17\" Version=\"|%CurrentProject%;GetBuildVersion|\" Language=\"en-US\" Publisher=\"Microsoft\" />\n        <DisplayName>SlowCheetah</DisplayName>\n        <Description xml:space=\"preserve\">Transform xml and json files at build time based on configuration. Contains tooling to assist in the creation and previewing of transform files.</Description>\n        <MoreInfo>https://github.com/Microsoft/slow-cheetah</MoreInfo>\n        <License>LICENSE</License>\n        <Icon>VSExtensibility.png</Icon>\n        <PreviewImage>VSExtensibility.png</PreviewImage>\n        <Tags>Transformations Transforms XML XDT JSON JDT</Tags>\n    </Metadata>\n    <Installation>\n        <InstallationTarget Id=\"Microsoft.VisualStudio.Community\" Version=\"[17.0, 18.0)\">\n            <ProductArchitecture>amd64</ProductArchitecture>\n        </InstallationTarget>\n    </Installation>\n    <Prerequisites>\n        <Prerequisite Id=\"Microsoft.VisualStudio.Component.CoreEditor\" Version=\"[17.0,18.0)\" DisplayName=\"Visual Studio core editor\" />\n    </Prerequisites>\n    <Assets>\n      <Asset Type=\"Microsoft.VisualStudio.VsPackage\" Path=\"Microsoft.VisualStudio.SlowCheetah.VS.pkgdef\" />\n    </Assets>\n</PackageManifest>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"xunit.shadowCopy\" value=\"false\"/>\n  </appSettings>\n</configuration>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS.Tests/Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net472</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <AdditionalFiles Remove=\"C:\\src\\libtempslowcheetah\\stylecop.json\" />\n  </ItemGroup>\n\n  <!--<ItemGroup>\n    <PackageReference Include=\"Microsoft.VisualStudio.Internal.MicroBuild.NonShipping\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" />\n    <PackageReference Include=\"xunit\" />\n  </ItemGroup>-->\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Build.Utilities.Core\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Internal.MicroBuild.NonShipping\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" />\n    <PackageReference Include=\"xunit\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" PrivateAssets=\"all\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n    <PackageReference Update=\"Nerdbank.GitVersioning\" PrivateAssets=\"all\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n    <PackageReference Update=\"StyleCop.Analyzers\" PrivateAssets=\"All\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Microsoft.VisualStudio.SlowCheetah.VS\\Microsoft.VisualStudio.SlowCheetah.VS.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Service Include=\"{82a7f48d-3b50-4b1e-b82e-3ada8210c358}\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS.Tests/PackageUtilitiesTest.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT License. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS.Tests\n{\n    using System.Collections.Generic;\n    using Xunit;\n\n    /// <summary>\n    /// Test class for <see cref=\"PackageUtilities\"/>.\n    /// </summary>\n    public class PackageUtilitiesTest\n    {\n        private IEnumerable<string> baseTestProjectConfigs = new List<string>(new string[] { \"Debug\", \"Release\" });\n        private IEnumerable<string> testProjectConfigsWithDots = new List<string>(new string[] { \"Debug\", \"Debug.Test\", \"Release\", \"Test.Release\", \"Test.Rel\" });\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> returns on arguments that are null or empty strings.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(null, null)]\n        [InlineData(\"\", \"\")]\n        [InlineData(\"App.config\", null)]\n        [InlineData(\"App.config\", \"\")]\n        [InlineData(null, \"App.Debug.config\")]\n        [InlineData(\"\", \"App.Debug.config\")]\n        public void IsFileTransformWithNullArguments(string docName, string trnName)\n        {\n            Assert.False(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.baseTestProjectConfigs));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> with valid arguments normally found in projects.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Debug.config\")]\n        [InlineData(\"App.config\", \"app.release.config\")]\n        [InlineData(\"APP.config\", \"App.Debug.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Debug.config\")]\n        public void IsFileTransformWithValidArguments(string docName, string trnName)\n        {\n            Assert.True(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.baseTestProjectConfigs));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> with invalid arguments.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Test.Debug.config\")]\n        [InlineData(\"App.Debug.config\", \"App.Debug.config\")]\n        [InlineData(\"App.Debug.config\", \"App.Release.config\")]\n        public void IsFileTransformWithInvalidArguments(string docName, string trnName)\n        {\n            Assert.False(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.baseTestProjectConfigs));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> with project configurations containing dots\n        /// and file names with similar structures. Tests valid names.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Debug.Test.config\")]\n        [InlineData(\"App.System.config\", \"App.System.Debug.Test.config\")]\n        [InlineData(\"App.config\", \"App.Test.Release.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Release.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Test.Release.config\")]\n        [InlineData(\"App.config\", \"App.Test.Rel.config\")]\n        public void IsFileTransformWithDottedConfigsAndValidNames(string docName, string trnName)\n        {\n            Assert.True(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.testProjectConfigsWithDots));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> with project configurations containing dots\n        /// and file names with similar structures. Tests invalid names.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Release.Test.config\")]\n        [InlineData(\"App.config\", \"App.Rel.Test.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Rel.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Test.config\")]\n        [InlineData(\"App.Test.config\", \"App.Debug.Test.config\")]\n        [InlineData(\"App.config\", \"Test.Rel.config\")]\n        [InlineData(\"App.Test.Rel.config\", \"App.Test.Rel.config\")]\n        public void IsFileTransformWithDottedConfigsAndInvalidNames(string docName, string trnName)\n        {\n            Assert.False(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.testProjectConfigsWithDots));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsGenericFileTransform(string, string)\"/> with invalid arguments.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.config\")]\n        [InlineData(\"App.Debug.config\", \"App.Debug.config\")]\n        [InlineData(\"App.config\", \"App..config\")]\n        [InlineData(\"App.Debug.config\", \"App.config\")]\n        [InlineData(\"App.config\", \"App.config.Debug\")]\n        public void IsFileGenericTransformWithInvalidArguments(string docName, string trnName)\n        {\n            Assert.False(PackageUtilities.IsGenericFileTransform(docName, trnName));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsGenericFileTransform(string, string)\"/> with valid arguments.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Debug.config\")]\n        [InlineData(\"App.config\", \"App.Test.Debug.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Debug.config\")]\n        public void IsFileGenericTransformWithValidArguments(string docName, string trnName)\n        {\n            Assert.True(PackageUtilities.IsGenericFileTransform(docName, trnName));\n        }\n    }\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.VS.Tests/xunit.runner.json",
    "content": "{\n  \"$schema\": \"https://xunit.net/schema/current/xunit.runner.schema.json\",\n  \"shadowCopy\": false\n}\n"
  },
  {
    "path": "src/Microsoft.VisualStudio.SlowCheetah.Vsix/Microsoft.VisualStudio.SlowCheetah.Vsix.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"17.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <PropertyGroup>\n    <MinimumVisualStudioVersion>17.0</MinimumVisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <UseCodebase>true</UseCodebase>\n    <StartAction>Program</StartAction>\n    <StartProgram>$(DevenvDir)devenv.exe</StartProgram>\n    <StartArguments>/rootsuffix Exp</StartArguments>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectTypeGuids>{82b43b9b-a64c-4715-b499-d71e9ca2bd60};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>\n    <ProjectGuid>{CD2AF93D-5714-404B-9D42-61477BE8F3CF}</ProjectGuid>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>Microsoft.VisualStudio.SlowCheetah</RootNamespace>\n    <AssemblyName>Microsoft.VisualStudio.SlowCheetah.Vsix</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <GeneratePkgDefFile>false</GeneratePkgDefFile>\n    <CreateVsixContainer>true</CreateVsixContainer>\n    <IncludeAssemblyInVSIXContainer>false</IncludeAssemblyInVSIXContainer>\n    <IncludeDebugSymbolsInVSIXContainer>false</IncludeDebugSymbolsInVSIXContainer>\n    <IncludeDebugSymbolsInLocalVSIXDeployment>false</IncludeDebugSymbolsInLocalVSIXDeployment>\n    <IncludeCopyLocalReferencesInVSIXContainer>false</IncludeCopyLocalReferencesInVSIXContainer>\n    <CopyBuildOutputToOutputDirectory>false</CopyBuildOutputToOutputDirectory>\n    <CopyOutputSymbolsToOutputDirectory>false</CopyOutputSymbolsToOutputDirectory>\n    <IsPackable>false</IsPackable>\n    <OutputPath>$(BaseOutputPath)$(Configuration)\\net472\\</OutputPath>\n    <TargetName>Microsoft.VisualStudio.SlowCheetah</TargetName>\n    <RuntimeIdentifier>win</RuntimeIdentifier>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <Optimize>true</Optimize>\n    <DefineConstants>TRACE</DefineConstants>\n  </PropertyGroup>\n  <ItemGroup>\n    <Content Include=\"$(OutputPath)Microsoft.Web.XmlTransform.dll\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <Link>Microsoft.Web.XmlTransform.dll</Link>\n      <Visible>false</Visible>\n    </Content>\n    <Content Include=\"$(OutputPath)Microsoft.VisualStudio.Jdt.dll\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <IncludeInVSIX>true</IncludeInVSIX>\n      <Link>Microsoft.VisualStudio.Jdt.dll</Link>\n      <Visible>false</Visible>\n    </Content>\n    <Content Include=\"$(OutputPath)Newtonsoft.Json.dll\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <IncludeInVSIX>false</IncludeInVSIX>\n      <Link>Newtonsoft.Json.dll</Link>\n      <Visible>false</Visible>\n    </Content>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"..\\..\\LICENSE\" Link=\"LICENSE\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"$(RepoRootPath)obj/NOTICE\" Link=\"NOTICE\" Condition=\" Exists('$(RepoRootPath)obj/NOTICE') \">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <Content Include=\"VSExtensibility.png\">\n      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n      <IncludeInVSIX>true</IncludeInVSIX>\n    </Content>\n    <None Include=\"..\\Microsoft.VisualStudio.SlowCheetah.VS\\source.extension.vsixmanifest\">\n      <SubType>Designer</SubType>\n      <Link>source.extension.vsixmanifest</Link>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Update=\"Microsoft.VSSDK.BuildTools\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" PrivateAssets=\"all\" />\n    <PackageReference Update=\"Nerdbank.GitVersioning\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" PrivateAssets=\"all\" />\n  </ItemGroup>\n  <!--<ItemGroup>\n    <PackageReference Update=\"Microsoft.VisualStudio.SDK\" ExcludeAssets=\"all\" />\n    <PackageReference Update=\"Microsoft.Web.Xdt\" ExcludeAssets=\"all\" />\n    <PackageReference Update=\"Microsoft.VisualStudio.Jdt\" ExcludeAssets=\"all\" />\n    <PackageReference Update=\"NuGet.VisualStudio\" ExcludeAssets=\"all\" />\n    <PackageReference Update=\"StyleCop.Analyzers\" ExcludeAssets=\"all\" />\n  </ItemGroup>-->\n  <ItemGroup>\n    <ProjectReference Include=\"..\\Microsoft.VisualStudio.SlowCheetah.VS\\Microsoft.VisualStudio.SlowCheetah.VS.csproj\">\n      <Project>{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}</Project>\n      <Name>Microsoft.VisualStudio.SlowCheetah.VS</Name>\n    </ProjectReference>\n    <ProjectReference Include=\"..\\Microsoft.VisualStudio.SlowCheetah\\Microsoft.VisualStudio.SlowCheetah.csproj\">\n      <Project>{6354d859-e629-49fc-b154-fc0ba42d71b0}</Project>\n      <Name>Microsoft.VisualStudio.SlowCheetah</Name>\n    </ProjectReference>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\VSSDK\\Microsoft.VsSDK.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Target Name=\"Pack\" AfterTargets=\"Build\">\n    <Copy SourceFiles=\"$(TargetVsixContainer)\" DestinationFolder=\"$(VSIXOutputPath)\" UseHardlinksIfPossible=\"true\" SkipUnchangedFiles=\"true\" />\n  </Target>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. \n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "src/OptProf.targets",
    "content": "<Project>\n  <ItemGroup>\n    <OptProf Include=\"$(TargetPath)\">\n      <Technology>IBC</Technology>\n      <InstallationPath>Common7\\IDE\\PrivateAssemblies\\$(TargetFileName)</InstallationPath>\n      <InstrumentationArguments>/ExeConfig:\"%VisualStudio.InstallationUnderTest.Path%\\Common7\\IDE\\vsn.exe\"</InstrumentationArguments>\n      <Scenarios>\n        <TestContainer Name=\"VSPE\">\n          <TestCase FullyQualifiedName=\"VSPE.OptProfTests.vs_perf_DesignTime_solution_loadclose_cs_picasso\" />\n        </TestContainer>\n      </Scenarios>\n    </OptProf>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "src/SlowCheetah.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.13.35505.181\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Microsoft.VisualStudio.SlowCheetah\", \"Microsoft.VisualStudio.SlowCheetah\\Microsoft.VisualStudio.SlowCheetah.csproj\", \"{6354D859-E629-49FC-B154-FC0BA42D71B0}\"\nEndProject\nProject(\"{2150E333-8FDC-42A3-9474-1A3956D46DE8}\") = \"Solution Items\", \"Solution Items\", \"{16014DDD-6525-48EF-9D6A-E1067594E1E8}\"\n\tProjectSection(SolutionItems) = preProject\n\t\t..\\Directory.Build.props = ..\\Directory.Build.props\n\t\t..\\Directory.Packages.props = ..\\Directory.Packages.props\n\t\tMicrosoft.VisualStudio.SlowCheetah.Tests\\Microsoft.VisualStudio.SlowCheetah.Tests.csproj = Microsoft.VisualStudio.SlowCheetah.Tests\\Microsoft.VisualStudio.SlowCheetah.Tests.csproj\n\t\t..\\test\\Microsoft.VisualStudio.SlowCheetah.Tests\\Microsoft.VisualStudio.SlowCheetah.Tests.csproj = ..\\test\\Microsoft.VisualStudio.SlowCheetah.Tests\\Microsoft.VisualStudio.SlowCheetah.Tests.csproj\n\t\tstylecop.json = stylecop.json\n\t\t..\\version.json = ..\\version.json\n\tEndProjectSection\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Microsoft.VisualStudio.SlowCheetah.Vsix\", \"Microsoft.VisualStudio.SlowCheetah.Vsix\\Microsoft.VisualStudio.SlowCheetah.Vsix.csproj\", \"{CD2AF93D-5714-404B-9D42-61477BE8F3CF}\"\nEndProject\nProject(\"{9A19103F-16F7-4668-BE54-9A1E7A4F7556}\") = \"Microsoft.VisualStudio.SlowCheetah.VS\", \"Microsoft.VisualStudio.SlowCheetah.VS\\Microsoft.VisualStudio.SlowCheetah.VS.csproj\", \"{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Microsoft.VisualStudio.SlowCheetah.VS.Tests\", \"..\\test\\Microsoft.VisualStudio.SlowCheetah.VS.Tests\\Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj\", \"{7CAC125E-EE65-2E4D-57C6-25E4C869F409}\"\nEndProject\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}\") = \"Microsoft.VisualStudio.SlowCheetah.Tests\", \"..\\test\\Microsoft.VisualStudio.SlowCheetah.Tests\\Microsoft.VisualStudio.SlowCheetah.Tests.csproj\", \"{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Any CPU = Debug|Any CPU\n\t\tDebug|x64 = Debug|x64\n\t\tDebug|x86 = Debug|x86\n\t\tRelease|Any CPU = Release|Any CPU\n\t\tRelease|x64 = Release|x64\n\t\tRelease|x86 = Release|x86\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Release|x64.Build.0 = Release|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{6354D859-E629-49FC-B154-FC0BA42D71B0}.Release|x86.Build.0 = Release|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Release|x64.Build.0 = Release|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{CD2AF93D-5714-404B-9D42-61477BE8F3CF}.Release|x86.Build.0 = Release|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Release|x64.Build.0 = Release|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{80A712EE-7B5C-44D3-A2AD-F918B893B6DF}.Release|x86.Build.0 = Release|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Release|x64.Build.0 = Release|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{7CAC125E-EE65-2E4D-57C6-25E4C869F409}.Release|x86.Build.0 = Release|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Debug|Any CPU.Build.0 = Debug|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Debug|x64.ActiveCfg = Debug|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Debug|x64.Build.0 = Debug|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Debug|x86.ActiveCfg = Debug|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Debug|x86.Build.0 = Debug|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Release|Any CPU.ActiveCfg = Release|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Release|Any CPU.Build.0 = Release|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Release|x64.ActiveCfg = Release|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Release|x64.Build.0 = Release|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Release|x86.ActiveCfg = Release|Any CPU\n\t\t{2CDACD21-BB66-9B22-E564-3E5D0DFADE8F}.Release|x86.Build.0 = Release|Any CPU\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\n\tGlobalSection(ExtensibilityGlobals) = postSolution\n\t\tSolutionGuid = {AD9FD28F-3EAE-4C44-B1B1-E91933777300}\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "src/build/no_authenticode.txt",
    "content": "*\\*.targets,msbuild target files are not signed\n*\\*.xml,xml doc comments are not signed\n*\\newtonsoft.json.dll,oss"
  },
  {
    "path": "src/build/no_strongname.txt",
    "content": ""
  },
  {
    "path": "stylecop.json",
    "content": "{\n  // https://github.com/DotNetAnalyzers/StyleCopAnalyzers/blob/master/documentation/EnableConfiguration.md\n  \"$schema\": \"https://raw.githubusercontent.com/DotNetAnalyzers/StyleCopAnalyzers/master/StyleCop.Analyzers/StyleCop.Analyzers/Settings/stylecop.schema.json\",\n  \"settings\": {\n    \"documentationRules\": {\n      \"companyName\": \"Microsoft Corporation\",\n      \"copyrightText\": \"Copyright (c) {companyName}. All rights reserved.\\nLicensed under the {licenseName} license. See {licenseFile} file in the project root for full license information.\",\n      \"variables\": {\n        \"licenseName\": \"MIT\",\n        \"licenseFile\": \"LICENSE\"\n      },\n      \"xmlHeader\": false\n    }\n  }\n}\n"
  },
  {
    "path": "test/.editorconfig",
    "content": "[*.cs]\n\n# SA1600: Elements should be documented\ndotnet_diagnostic.SA1600.severity = silent\n\n# SA1601: Partial elements should be documented\ndotnet_diagnostic.SA1601.severity = silent\n\n# SA1602: Enumeration items should be documented\ndotnet_diagnostic.SA1602.severity = silent\n\n# SA1615: Element return value should be documented\ndotnet_diagnostic.SA1615.severity = silent\n\n# VSTHRD103: Call async methods when in an async method\ndotnet_diagnostic.VSTHRD103.severity = silent\n\n# VSTHRD111: Use .ConfigureAwait(bool)\ndotnet_diagnostic.VSTHRD111.severity = none\n\n# VSTHRD200: Use Async suffix for async methods\ndotnet_diagnostic.VSTHRD200.severity = silent\n\n# CA1014: Mark assemblies with CLSCompliant\ndotnet_diagnostic.CA1014.severity = none\n\n# CA1050: Declare types in namespaces\ndotnet_diagnostic.CA1050.severity = none\n\n# CA1303: Do not pass literals as localized parameters\ndotnet_diagnostic.CA1303.severity = none\n\n# CS1591: Missing XML comment for publicly visible type or member\ndotnet_diagnostic.CS1591.severity = silent\n\n# CA1707: Identifiers should not contain underscores\ndotnet_diagnostic.CA1707.severity = silent\n\n# CA1062: Validate arguments of public methods\ndotnet_diagnostic.CA1062.severity = suggestion\n\n# CA1063: Implement IDisposable Correctly\ndotnet_diagnostic.CA1063.severity = silent\n\n# CA1816: Dispose methods should call SuppressFinalize\ndotnet_diagnostic.CA1816.severity = silent\n\n# CA2007: Consider calling ConfigureAwait on the awaited task\ndotnet_diagnostic.CA2007.severity = none\n\n# SA1401: Fields should be private\ndotnet_diagnostic.SA1401.severity = silent\n\n# SA1133: Do not combine attributes\ndotnet_diagnostic.SA1133.severity = silent\n"
  },
  {
    "path": "test/Directory.Build.props",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <Import Project=\"$([MSBuild]::GetPathOfFileAbove($(MSBuildThisFile), $(MSBuildThisFileDirectory)..))\" />\n\n  <PropertyGroup>\n    <IsPackable>false</IsPackable>\n    <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.VisualStudio.Internal.MicroBuild.NonShipping\" PrivateAssets=\"all\" />\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "test/Directory.Build.targets",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project>\n  <ItemGroup>\n    <Content Include=\"xunit.runner.json\" CopyToOutputDirectory=\"PreserveNewest\" Condition=\"Exists('xunit.runner.json')\" />\n  </ItemGroup>\n\n  <Import Project=\"$([MSBuild]::GetPathOfFileAbove($(MSBuildThisFile), $(MSBuildThisFileDirectory)..))\" />\n</Project>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"xunit.shadowCopy\" value=\"false\" />\n  </appSettings>\n</configuration>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BaseTest.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests\n{\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n\n    /// <summary>\n    /// Class that contains base initialization methods for all the unit tests, such as creating and deleting temporary files.\n    /// </summary>\n    public class BaseTest : IDisposable\n    {\n        /// <summary>\n        /// Gets the list of temporary files to delete after test.\n        /// </summary>\n        protected IList<string> FilesToDeleteAfterTest { get; } = new List<string>();\n\n        /// <summary>\n        /// At the end of tests, attempts to delete all the files generated during the test.\n        /// </summary>\n        public void Dispose()\n        {\n            foreach (string filename in this.FilesToDeleteAfterTest)\n            {\n                if (File.Exists(filename))\n                {\n                    try\n                    {\n                        File.Delete(filename);\n                    }\n                    catch (System.IO.IOException)\n                    {\n                        // some processes will hold onto the file until the AppDomain is unloaded\n                    }\n                }\n            }\n\n            this.FilesToDeleteAfterTest.Clear();\n        }\n\n        /// <summary>\n        /// Writes a string to a temporary file.\n        /// </summary>\n        /// <param name=\"content\">Content to be written.</param>\n        /// <returns>The path of the created file.</returns>\n        protected virtual string WriteTextToTempFile(string content)\n        {\n            if (string.IsNullOrEmpty(content))\n            {\n                throw new ArgumentNullException(nameof(content));\n            }\n\n            string tempFile = this.GetTempFilename(true);\n            File.WriteAllText(tempFile, content);\n            return tempFile;\n        }\n\n        /// <summary>\n        /// Creates a temporary file for testing.\n        /// </summary>\n        /// <param name=\"ensureFileDoesntExist\">If it is ensured that a file with the same name doesn't already exist.</param>\n        /// <returns>The path to the created file.</returns>\n        protected virtual string GetTempFilename(bool ensureFileDoesntExist)\n        {\n            string path = Path.GetTempFileName();\n            if (ensureFileDoesntExist && File.Exists(path))\n            {\n                File.Delete(path);\n            }\n\n            this.FilesToDeleteAfterTest.Add(path);\n            return path;\n        }\n    }\n}\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConfigTransformTestsBase.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests.BuildTests\n{\n    using System;\n    using System.Collections.Generic;\n    using System.IO;\n    using System.Linq;\n    using System.Xml.Linq;\n    using Microsoft.Build.Utilities;\n    using Xunit;\n\n    /// <summary>\n    /// Base class for transformation tests.\n    /// </summary>\n    public abstract class ConfigTransformTestsBase : IDisposable\n    {\n        /// <summary>\n        /// Gets the test solution directory.\n        /// </summary>\n        public string SolutionDir\n        {\n            get { return Path.Combine(Environment.CurrentDirectory, @\"..\\..\\..\\..\\test\"); }\n        }\n\n        /// <summary>\n        /// Gets the output path of the test project.\n        /// </summary>\n        public string OutputPath\n        {\n            get { return Path.Combine(Environment.CurrentDirectory, @\"ProjectOutput\"); }\n        }\n\n        /// <summary>\n        /// Gets the test projects directory.\n        /// </summary>\n        public string TestProjectsDir\n        {\n            get { return Path.Combine(this.SolutionDir, @\"Microsoft.VisualStudio.SlowCheetah.Tests\\BuildTests\\TestProjects\"); }\n        }\n\n        /// <summary>\n        /// Builds the project of the given name from the <see cref=\"TestProjectsDir\"/>.\n        /// </summary>\n        /// <param name=\"projectName\">Name of the project to be built.\n        /// Must correspond to a folder name in the test projects directory.</param>\n        public void BuildProject(string projectName)\n        {\n            var globalProperties = new Dictionary<string, string>()\n            {\n               { \"Configuration\", \"Debug\" },\n               { \"OutputPath\", this.OutputPath },\n            };\n\n            var msbuildPath = ResolveMSBuildExePath();\n\n            // We use an external process to run msbuild, because XUnit test discovery breaks\n            // when using <Reference Include=\"$(MSBuildToolsPath)\\Microsoft.Build.dll\" />.\n            // MSBuild NuGet packages proved to be difficult in getting in-proc test builds to run.\n            string projectPath = Path.Combine(this.TestProjectsDir, projectName, projectName + \".csproj\");\n            string properties = \"/p:\" + string.Join(\";\", globalProperties.Select(x => $\"{x.Key}={x.Value}\"));\n\n            var startInfo = new System.Diagnostics.ProcessStartInfo()\n            {\n                FileName = msbuildPath,\n                Arguments = $\"\\\"{projectPath}\\\" {properties}\",\n                CreateNoWindow = false,\n                RedirectStandardError = true,\n                RedirectStandardOutput = true,\n                UseShellExecute = false,\n                WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,\n            };\n\n            try\n            {\n                using (var process = System.Diagnostics.Process.Start(startInfo))\n                {\n                    System.Threading.Tasks.Task<string> standardOutput = process.StandardOutput.ReadToEndAsync();\n                    System.Threading.Tasks.Task<string> standardError = process.StandardError.ReadToEndAsync();\n                    process.WaitForExit();\n                    Assert.True(process.ExitCode == 0, $\"msbuild.exe exited with code {process.ExitCode}.`nCommand: \\\"{startInfo.FileName}\\\" {startInfo.Arguments}`nStandard output:`n{standardOutput.GetAwaiter().GetResult()}`nStandard error:`n{standardError.GetAwaiter().GetResult()}\");\n                    process.Close();\n                }\n            }\n            catch (Exception ex)\n            {\n                throw new Exception($\"Error running msbuild: {ex.Message}\", ex);\n            }\n        }\n\n        /// <summary>\n        /// Gets a app setting from a configuration file.\n        /// </summary>\n        /// <param name=\"configFilePath\">Path to the configuration file.</param>\n        /// <param name=\"appSettingKey\">Setting key.</param>\n        /// <returns>Value of the setting.</returns>\n        public string GetAppSettingValue(string configFilePath, string appSettingKey)\n        {\n            var configFile = XDocument.Load(configFilePath);\n            var testSetting = (from settingEl in configFile.Descendants(\"appSettings\").Elements()\n                               where settingEl.Attribute(\"key\").Value == appSettingKey\n                               select settingEl.Attribute(\"value\").Value).Single();\n            return testSetting;\n        }\n\n        /// <summary>\n        /// Gets the value of a node within a configuration file.\n        /// </summary>\n        /// <param name=\"configFilePath\">Path to the configuration file.</param>\n        /// <param name=\"nodeName\">Name of the node.</param>\n        /// <returns>Value of the node.</returns>\n        public string GetConfigNodeValue(string configFilePath, string nodeName)\n        {\n            var configFile = XDocument.Load(configFilePath);\n            return configFile.Descendants(nodeName).Single().Value;\n        }\n\n        /// <summary>\n        /// At the end of tests, delete the output path for the tested projects.\n        /// </summary>\n        public void Dispose()\n        {\n            if (Directory.Exists(this.OutputPath))\n            {\n                Directory.Delete(this.OutputPath, recursive: true);\n            }\n        }\n\n        private static string ResolveMSBuildExePath()\n        {\n            var msbuildPath = ToolLocationHelper.GetPathToBuildToolsFile(\"msbuild.exe\", ToolLocationHelper.CurrentToolsVersion);\n            if (!string.IsNullOrEmpty(msbuildPath))\n            {\n                return msbuildPath;\n            }\n\n            string msbuildPathCache = Path.Combine(Environment.CurrentDirectory, \"msbuildPath.txt\");\n            if (File.Exists(msbuildPathCache))\n            {\n                var cachedMSBuildToolsPath = File.ReadLines(msbuildPathCache).FirstOrDefault();\n                if (!string.IsNullOrEmpty(cachedMSBuildToolsPath))\n                {\n                    var cachedMSBuildExePath = Path.Combine(cachedMSBuildToolsPath, \"msbuild.exe\");\n                    if (File.Exists(cachedMSBuildExePath))\n                    {\n                        return cachedMSBuildExePath;\n                    }\n                }\n            }\n\n            throw new FileNotFoundException($\"Unable to locate msbuild.exe. ToolLocationHelper returned no path and {msbuildPathCache} did not point to an existing MSBuild tools path.\");\n        }\n    }\n}\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/ConsoleAppTests.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests.BuildTests\n{\n    using System.IO;\n    using Xunit;\n\n    /// <summary>\n    /// Tests build time transformations for a test console app.\n    /// </summary>\n    [Collection(\"BuildTests\")]\n    public class ConsoleAppTests : ConfigTransformTestsBase\n    {\n        /// <summary>\n        /// Tests if app.config is transformed on build.\n        /// </summary>\n        [Fact]\n        public void ConsoleApp_AppConfig_IsTransformed()\n        {\n            var projectName = \"ConsoleApp\";\n            this.BuildProject(projectName);\n\n            var configFilePath = Path.Combine(this.OutputPath, \"ConsoleApp.exe.config\");\n\n            var testSetting = this.GetAppSettingValue(configFilePath, \"TestSetting\");\n\n            Assert.Equal(\"Debug\", testSetting);\n        }\n\n        /// <summary>\n        /// Tests if other.config is transformed on build.\n        /// </summary>\n        [Fact]\n        public void ConsoleApp_OtherConfig_IsTransformed()\n        {\n            var projectName = \"ConsoleApp\";\n            this.BuildProject(projectName);\n\n            var configFilePath = Path.Combine(this.OutputPath, \"Other.config\");\n\n            var testNodeValue = this.GetConfigNodeValue(configFilePath, \"TestNode\");\n\n            Assert.Equal(\"Debug\", testNodeValue);\n        }\n    }\n}\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <appSettings>\n    <add key=\"TestSetting\" value=\"Debug\" xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(key)\"/>\n  </appSettings>\n</configuration>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <appSettings>\n    <add key=\"TestSetting\" value=\"Release\" xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(key)\"/>\n  </appSettings>\n</configuration>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<configuration>\n  <appSettings>\n    <add key=\"TestSetting\" value=\"Default\" />\n    <add key=\"ClientSettingsProvider.ServiceUri\" value=\"\" />\n  </appSettings>\n  <startup>\n    <supportedRuntime version=\"v4.0\" sku=\".NETFramework,Version=v4.5.2\" />\n  </startup>\n  <system.web>\n    <membership defaultProvider=\"ClientAuthenticationMembershipProvider\">\n      <providers>\n        <add name=\"ClientAuthenticationMembershipProvider\" type=\"System.Web.ClientServices.Providers.ClientFormsAuthenticationMembershipProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" serviceUri=\"\" />\n      </providers>\n    </membership>\n    <roleManager defaultProvider=\"ClientRoleProvider\" enabled=\"true\">\n      <providers>\n        <add name=\"ClientRoleProvider\" type=\"System.Web.ClientServices.Providers.ClientRoleProvider, System.Web.Extensions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" serviceUri=\"\" cacheTimeout=\"86400\" />\n      </providers>\n    </roleManager>\n  </system.web>\n</configuration>"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/ConsoleApp.csproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"15.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProjectGuid>{1C50F6B9-3E9C-48D1-87C3-783763D11A4C}</ProjectGuid>\n    <OutputType>Exe</OutputType>\n    <RootNamespace>ConsoleApp</RootNamespace>\n    <AssemblyName>ConsoleApp</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <FileAlignment>512</FileAlignment>\n    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>\n    <RuntimeIdentifier>win</RuntimeIdentifier>\n    <LangVersion>9.0</LangVersion> <!-- Added LangVersion element -->\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\Debug\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <PlatformTarget>AnyCPU</PlatformTarget>\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\Release\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Net.Http\" />\n    <Reference Include=\"System.Xml\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"Nullable\" ExcludeAssets=\"All\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Compile Include=\"Program.cs\" />\n    <Compile Include=\"Properties\\AssemblyInfo.cs\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"App.Release.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>App.config</DependentUpon>\n    </None>\n    <None Include=\"App.Debug.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>App.config</DependentUpon>\n    </None>\n    <None Include=\"App.config\">\n      <TransformOnBuild>true</TransformOnBuild>\n    </None>\n    <None Include=\"Other.Release.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>Other.config</DependentUpon>\n    </None>\n    <None Include=\"Other.Debug.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>Other.config</DependentUpon>\n    </None>\n    <None Include=\"Other.config\">\n      <TransformOnBuild>true</TransformOnBuild>\n    </None>\n  </ItemGroup>\n  <Import Project=\"$(MSBuildToolsPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(MSBuildThisFileDirectory)..\\packages\\slowcheetah\\build\\Microsoft.VisualStudio.SlowCheetah.targets\" />\n</Project>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<SomeNode xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <TestNode xdt:Transform=\"Replace\">Debug</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<SomeNode xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <TestNode xdt:Transform=\"Replace\">Release</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Other.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<SomeNode>\n  <TestNode>default</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Program.cs",
    "content": "﻿using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Text;\nusing System.Threading.Tasks;\n\nnamespace ConsoleApp\n{\n    class Program\n    {\n        static void Main(string[] args)\n        {\n        }\n    }\n}\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/ConsoleApp/Properties/AssemblyInfo.cs",
    "content": "﻿using System.Reflection;\nusing System.Runtime.CompilerServices;\nusing System.Runtime.InteropServices;\n\n// General Information about an assembly is controlled through the following\n// set of attributes. Change these attribute values to modify the information\n// associated with an assembly.\n[assembly: AssemblyTitle(\"ConsoleApp\")]\n[assembly: AssemblyDescription(\"\")]\n[assembly: AssemblyConfiguration(\"\")]\n[assembly: AssemblyCompany(\"\")]\n[assembly: AssemblyProduct(\"ConsoleApp\")]\n[assembly: AssemblyCopyright(\"Copyright ©  2017\")]\n[assembly: AssemblyTrademark(\"\")]\n[assembly: AssemblyCulture(\"\")]\n\n// Setting ComVisible to false makes the types in this assembly not visible\n// to COM components.  If you need to access a type in this assembly from\n// COM, set the ComVisible attribute to true on that type.\n[assembly: ComVisible(false)]\n\n// The following GUID is for the ID of the typelib if this project is exposed to COM\n[assembly: Guid(\"1c50f6b9-3e9c-48d1-87c3-783763d11a4c\")]\n\n// Version information for an assembly consists of the following four values:\n//\n//      Major Version\n//      Minor Version\n//      Build Number\n//      Revision\n//\n// You can specify all the values or you can default the Build and Revision Numbers\n// by using the '*' as shown below:\n// [assembly: AssemblyVersion(\"1.0.*\")]\n[assembly: AssemblyVersion(\"1.0.0.0\")]\n[assembly: AssemblyFileVersion(\"1.0.0.0\")]\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/Directory.Build.props",
    "content": "<Project />"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/Directory.Build.targets",
    "content": "<Project />"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<SomeNode xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <TestNode xdt:Transform=\"Replace\">Debug</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<!-- For more information on using transformations \n     see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->\n<SomeNode xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <TestNode xdt:Transform=\"Replace\">Release</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Other.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<SomeNode>\n  <TestNode>default</TestNode>\n</SomeNode>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.Debug.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.Release.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->\n\n<configuration xmlns:xdt=\"http://schemas.microsoft.com/XML-Document-Transform\">\n  <!--\n    In the example below, the \"SetAttributes\" transform will change the value of \n    \"connectionString\" to use \"ReleaseSQLServer\" only when the \"Match\" locator \n    finds an attribute \"name\" that has a value of \"MyDB\".\n    \n    <connectionStrings>\n      <add name=\"MyDB\" \n        connectionString=\"Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True\" \n        xdt:Transform=\"SetAttributes\" xdt:Locator=\"Match(name)\"/>\n    </connectionStrings>\n  -->\n  <system.web>\n    <compilation xdt:Transform=\"RemoveAttributes(debug)\" />\n    <!--\n      In the example below, the \"Replace\" transform will replace the entire \n      <customErrors> section of your web.config file.\n      Note that because there is only one customErrors section under the \n      <system.web> node, there is no need to use the \"xdt:Locator\" attribute.\n      \n      <customErrors defaultRedirect=\"GenericError.htm\"\n        mode=\"RemoteOnly\" xdt:Transform=\"Replace\">\n        <error statusCode=\"500\" redirect=\"InternalError.htm\"/>\n      </customErrors>\n    -->\n  </system.web>\n</configuration>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/Web.config",
    "content": "﻿<?xml version=\"1.0\"?>\n<!--\n  For more information on how to configure your ASP.NET application, please visit\n  https://go.microsoft.com/fwlink/?LinkId=169433\n  -->\n<configuration>\n  <!--\n    For a description of web.config changes see http://go.microsoft.com/fwlink/?LinkId=235367.\n\n    The following attributes can be set on the <httpRuntime> tag.\n      <system.Web>\n        <httpRuntime targetFramework=\"4.7.2\" />\n      </system.Web>\n  -->\n  <system.web>\n    <compilation debug=\"true\" targetFramework=\"4.5.2\"/>\n    <httpRuntime targetFramework=\"4.5.2\"/>\n  </system.web>\n  <system.codedom>\n    <compilers>\n      <compiler language=\"c#;cs;csharp\" extension=\".cs\" type=\"Microsoft.CodeDom.Providers.DotNetCompilerPlatform.CSharpCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" warningLevel=\"4\" compilerOptions=\"/langversion:6 /nowarn:1659;1699;1701\"/>\n      <compiler language=\"vb;vbs;visualbasic;vbscript\" extension=\".vb\" type=\"Microsoft.CodeDom.Providers.DotNetCompilerPlatform.VBCodeProvider, Microsoft.CodeDom.Providers.DotNetCompilerPlatform, Version=1.0.2.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35\" warningLevel=\"4\" compilerOptions=\"/langversion:14 /nowarn:41008 /define:_MYTYPE=\\&quot;Web\\&quot; /optionInfer+\"/>\n    </compilers>\n  </system.codedom>\n</configuration>"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/TestProjects/WebApplication/WebApplication.csproj",
    "content": "﻿<Project ToolsVersion=\"12.0\" DefaultTargets=\"Build\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <Import Project=\"$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props\" Condition=\"Exists('$(MSBuildExtensionsPath)\\$(MSBuildToolsVersion)\\Microsoft.Common.props')\" />\n  <PropertyGroup>\n    <Configuration Condition=\" '$(Configuration)' == '' \">Debug</Configuration>\n    <Platform Condition=\" '$(Platform)' == '' \">AnyCPU</Platform>\n    <ProductVersion>\n    </ProductVersion>\n    <SchemaVersion>2.0</SchemaVersion>\n    <ProjectGuid>{FF416CD8-E3B3-4223-B8FD-E6B3B6720D71}</ProjectGuid>\n    <ProjectTypeGuids>{349c5851-65df-11da-9384-00065b846f21};{fae04ec0-301f-11d3-bf4b-00c04f79efbc}</ProjectTypeGuids>\n    <OutputType>Library</OutputType>\n    <AppDesignerFolder>Properties</AppDesignerFolder>\n    <RootNamespace>WebApplication</RootNamespace>\n    <AssemblyName>WebApplication</AssemblyName>\n    <TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>\n    <RuntimeIdentifier>win</RuntimeIdentifier>\n    <UseIISExpress>true</UseIISExpress>\n    <IISExpressSSLPort />\n    <IISExpressAnonymousAuthentication />\n    <IISExpressWindowsAuthentication />\n    <IISExpressUseClassicPipelineMode />\n    <UseGlobalApplicationHostFile />\n    <NuGetPackageImportStamp>\n    </NuGetPackageImportStamp>\n    <ExcludeGlobalPackages>True</ExcludeGlobalPackages>\n    <Use64BitIISExpress />\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' \">\n    <DebugSymbols>true</DebugSymbols>\n    <DebugType>full</DebugType>\n    <Optimize>false</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>DEBUG;TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <PropertyGroup Condition=\" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' \">\n    <DebugType>pdbonly</DebugType>\n    <Optimize>true</Optimize>\n    <OutputPath>bin\\</OutputPath>\n    <DefineConstants>TRACE</DefineConstants>\n    <ErrorReport>prompt</ErrorReport>\n    <WarningLevel>4</WarningLevel>\n  </PropertyGroup>\n  <ItemGroup>\n    <Reference Include=\"Microsoft.CSharp\" />\n    <Reference Include=\"System.Web.DynamicData\" />\n    <Reference Include=\"System.Web.Entity\" />\n    <Reference Include=\"System.Web.ApplicationServices\" />\n    <Reference Include=\"System.ComponentModel.DataAnnotations\" />\n    <Reference Include=\"System\" />\n    <Reference Include=\"System.Data\" />\n    <Reference Include=\"System.Core\" />\n    <Reference Include=\"System.Data.DataSetExtensions\" />\n    <Reference Include=\"System.Web.Extensions\" />\n    <Reference Include=\"System.Xml.Linq\" />\n    <Reference Include=\"System.Drawing\" />\n    <Reference Include=\"System.Web\" />\n    <Reference Include=\"System.Xml\" />\n    <Reference Include=\"System.Configuration\" />\n    <Reference Include=\"System.Web.Services\" />\n    <Reference Include=\"System.EnterpriseServices\" />\n  </ItemGroup>\n  <ItemGroup>\n    <PackageReference Include=\"CSharpIsNullAnalyzer\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"DotNetAnalyzers.DocumentationAnalyzers\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"Microsoft.VisualStudio.Internal.MicroBuild.VisualStudio\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"Nerdbank.GitVersioning\" />\n    <PackageReference Include=\"Nullable\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"StyleCop.Analyzers.Unstable\" ExcludeAssets=\"All\" />\n    <PackageReference Include=\"StyleCop.Analyzers\" ExcludeAssets=\"All\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Other.config\">\n      <TransformOnBuild>true</TransformOnBuild>\n    </Content>\n    <Content Include=\"Other.Debug.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>Other.config</DependentUpon>\n    </Content>\n    <Content Include=\"Other.Release.config\">\n      <IsTransformItem>True</IsTransformItem>\n      <DependentUpon>Other.config</DependentUpon>\n    </Content>\n    <None Include=\"Web.Debug.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n    <None Include=\"Web.Release.config\">\n      <DependentUpon>Web.config</DependentUpon>\n    </None>\n  </ItemGroup>\n  <ItemGroup>\n    <Content Include=\"Web.config\" />\n  </ItemGroup>\n  <ItemGroup>\n    <Folder Include=\"Properties\\\" />\n  </ItemGroup>\n  <PropertyGroup>\n    <VisualStudioVersion Condition=\"'$(VisualStudioVersion)' == ''\">10.0</VisualStudioVersion>\n    <VSToolsPath Condition=\"'$(VSToolsPath)' == ''\">$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v$(VisualStudioVersion)</VSToolsPath>\n  </PropertyGroup>\n  <Import Project=\"$(MSBuildBinPath)\\Microsoft.CSharp.targets\" />\n  <Import Project=\"$(VSToolsPath)\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"'$(VSToolsPath)' != ''\" />\n  <Import Project=\"$(MSBuildExtensionsPath32)\\Microsoft\\VisualStudio\\v10.0\\WebApplications\\Microsoft.WebApplication.targets\" Condition=\"false\" />\n  <Import Project=\"$(MSBuildThisFileDirectory)..\\packages\\slowcheetah\\build\\Microsoft.VisualStudio.SlowCheetah.targets\" />\n  <ProjectExtensions>\n    <VisualStudio>\n      <FlavorProperties GUID=\"{349c5851-65df-11da-9384-00065b846f21}\">\n        <WebProjectProperties>\n          <UseIIS>True</UseIIS>\n          <AutoAssignPort>True</AutoAssignPort>\n          <DevelopmentServerPort>57677</DevelopmentServerPort>\n          <DevelopmentServerVPath>/</DevelopmentServerVPath>\n          <IISUrl>http://localhost:56732/</IISUrl>\n          <NTLMAuthentication>False</NTLMAuthentication>\n          <UseCustomServer>False</UseCustomServer>\n          <CustomServerUrl>\n          </CustomServerUrl>\n          <SaveServerSettingsInUserFile>False</SaveServerSettingsInUserFile>\n        </WebProjectProperties>\n      </FlavorProperties>\n    </VisualStudio>\n  </ProjectExtensions>\n  <!-- To modify your build process, add your task inside one of the targets below and uncomment it.\n       Other similar extension points exist, see Microsoft.Common.targets.\n  <Target Name=\"BeforeBuild\">\n  </Target>\n  <Target Name=\"AfterBuild\">\n  </Target>\n  -->\n</Project>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/BuildTests/WebAppTests.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests.BuildTests\n{\n    using System.IO;\n    using Xunit;\n\n    /// <summary>\n    /// Tests build time transformations for a test web app.\n    /// </summary>\n    [Collection(\"BuildTests\")]\n    public class WebAppTests : ConfigTransformTestsBase\n    {\n        /// <summary>\n        /// Tests if other.config is transformed on build.\n        /// </summary>\n        [Fact]\n        public void WebApp_OtherConfig_IsTransformed()\n        {\n            var projectName = \"WebApplication\";\n            this.BuildProject(projectName);\n\n            var configFilePath = Path.Combine(this.OutputPath, \"Other.config\");\n\n            var testNodeValue = this.GetConfigNodeValue(configFilePath, \"TestNode\");\n\n            Assert.Equal(\"Debug\", testNodeValue);\n        }\n    }\n}\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/Microsoft.VisualStudio.SlowCheetah.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net472</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <Compile Remove=\"BuildTests\\TestProjects\\**\" />\n    <EmbeddedResource Remove=\"BuildTests\\TestProjects\\**\" />\n    <None Remove=\"BuildTests\\TestProjects\\**\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Build.Utilities.Core\" />\n    <!--<PackageReference Include=\"Microsoft.VisualStudio.Internal.MicroBuild.NonShipping\" />-->\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" />\n    <PackageReference Include=\"xunit\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" PrivateAssets=\"all\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n    <PackageReference Update=\"Nerdbank.GitVersioning\" PrivateAssets=\"all\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n    <PackageReference Update=\"StyleCop.Analyzers\" PrivateAssets=\"All\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Microsoft.VisualStudio.SlowCheetah\\Microsoft.VisualStudio.SlowCheetah.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Service Include=\"{82a7f48d-3b50-4b1e-b82e-3ada8210c358}\" />\n  </ItemGroup>\n\n  <!--Copy SlowCheetah Output to test folder-->\n  <Target Name=\"CopySlowCheetahFiles\" AfterTargets=\"Build\">\n    <MSBuild Projects=\"@(ProjectReference)\" Targets=\"GetTargetPath\" BuildInParallel=\"true\" Properties=\"Configuration=$(Configuration)\" Condition=\"'%(Filename)'=='Microsoft.VisualStudio.SlowCheetah'\">\n      <Output TaskParameter=\"TargetOutputs\" ItemName=\"_DependentAssemblies\" />\n    </MSBuild>\n    <ItemGroup>\n      <_CopyTools Include=\"@(_DependentAssemblies);%(_DependentAssemblies.RelativeDir)Microsoft.Web.XmlTransform.dll\" />\n      <_CopyTools Include=\"@(_DependentAssemblies);%(_DependentAssemblies.RelativeDir)Microsoft.VisualStudio.Jdt.dll\" />\n      <_CopyBuild Include=\"%(_DependentAssemblies.RelativeDir)Build\\Microsoft.VisualStudio.SlowCheetah*.targets\" />\n    </ItemGroup>\n    <RemoveDir Directories=\"$(MSBuildThisFileDirectory)BuildTests\\TestProjects\\packages\\slowcheetah\\\" />\n    <Copy SourceFiles=\"@(_CopyTools)\" DestinationFolder=\"$(MSBuildThisFileDirectory)BuildTests\\TestProjects\\packages\\slowcheetah\\tools\" />\n    <Copy SourceFiles=\"@(_CopyBuild)\" DestinationFolder=\"$(MSBuildThisFileDirectory)BuildTests\\TestProjects\\packages\\slowcheetah\\build\" />\n  </Target>\n\n  <Target Name=\"CacheMSBuildPath\" AfterTargets=\"Build\">\n    <ItemGroup>\n      <_MSBuildPathLines Include=\"$(MSBuildToolsPath)\" />\n    </ItemGroup>\n    <WriteLinesToFile File=\"$(OutputPath)msbuildPath.txt\" Lines=\"@(_MSBuildPathLines)\" Overwrite=\"true\" />\n  </Target>\n\n</Project>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/TestUtilities.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests\n{\n    /// <summary>\n    /// Utilities class for SlowCheetah tests.\n    /// </summary>\n    public static class TestUtilities\n    {\n        /// <summary>\n        /// Example source file for transform testing.\n        /// </summary>\n        public const string Source01 =\n            @\"<?xml version=\"\"1.0\"\"?>\n            <configuration>\n                <appSettings>\n                    <add key=\"\"setting01\"\" value=\"\"default01\"\"/> \n                    <add key=\"\"setting02\"\" value=\"\"default02\"\"/> \n                </appSettings>\n            </configuration>\";\n\n        /// <summary>\n        /// Example transform file for transform testing.\n        /// </summary>\n        public const string Transform01 =\n            @\"<?xml version=\"\"1.0\"\"?>\n            <configuration xmlns:xdt=\"\"http://schemas.microsoft.com/XML-Document-Transform\"\">\n                <appSettings>\n                    <add key=\"\"setting01\"\" value=\"\"debug01\"\"\n                        xdt:Locator=\"\"Match(key)\"\" xdt:Transform=\"\"Replace\"\" />\n                    <add key=\"\"setting02\"\" value=\"\"debug02\"\"\n                        xdt:Locator=\"\"Match(key)\"\" xdt:Transform=\"\"Replace\"\" />\n                </appSettings>\n            </configuration>\";\n\n        /// <summary>\n        /// Example result file for transform testing.\n        /// </summary>\n        public const string Result01 =\n            @\"<?xml version=\"\"1.0\"\"?>\n            <configuration>\n                <appSettings>\n                    <add key=\"\"setting01\"\" value=\"\"debug01\"\"/> \n                    <add key=\"\"setting02\"\" value=\"\"debug02\"\"/> \n                </appSettings>\n            </configuration>\";\n    }\n}\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/TransformTest.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\n#pragma warning disable SA1512 // Single-line comments must not be followed by blank line\n\n// Copyright (C) Sayed Ibrahim Hashimi\n#pragma warning restore SA1512 // Single-line comments must not be followed by blank line\n\nnamespace Microsoft.VisualStudio.SlowCheetah.Tests\n{\n    using System.IO;\n    using Xunit;\n\n    /// <summary>\n    /// Tests for <see cref=\"ITransformer\"/>.\n    /// </summary>\n    public class TransformTest : BaseTest\n    {\n        /// <summary>\n        /// Tests for <see cref=\"XmlTransformer\"/>.\n        /// </summary>\n        [Fact]\n        public void TestXmlTransform()\n        {\n            string sourceFile = this.WriteTextToTempFile(TestUtilities.Source01);\n            string transformFile = this.WriteTextToTempFile(TestUtilities.Transform01);\n            string expectedResultFile = this.WriteTextToTempFile(TestUtilities.Result01);\n\n            string destFile = this.GetTempFilename(true);\n            ITransformer transformer = new XmlTransformer();\n            transformer.Transform(sourceFile, transformFile, destFile);\n\n            Assert.True(File.Exists(sourceFile));\n            Assert.True(File.Exists(transformFile));\n            Assert.True(File.Exists(destFile));\n\n            string actualResult = File.ReadAllText(destFile);\n            string expectedResult = File.ReadAllText(expectedResultFile);\n            Assert.Equal(expectedResult.Trim(), actualResult.Trim());\n        }\n    }\n}\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.Tests/example.txt",
    "content": "Running msbuild.exe C:\\src\\libtempslowcheetah\\bin\\Microsoft.VisualStudio.SlowCheetah.Tests\\Debug\\net472\\..\\..\\..\\..\\test\\Microsoft.VisualStudio.SlowCheetah.Tests\\BuildTests\\TestProjects\\WebApplication\\WebApplication.csproj /p:Configuration=Debug,OutputPath=C:\\src\\libtempslowcheetah\\bin\\Microsoft.VisualStudio.SlowCheetah.Tests\\Debug\\net472\\ProjectOutput\nRunning msbuild.exe filename C:\\Program Files\\Microsoft Visual Studio\\2022\\IntPreview\\MSBuild\\Current\\Bin\\amd64\\msbuild.exe\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.VS.Tests/App.config",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n<configuration>\n  <appSettings>\n    <add key=\"xunit.shadowCopy\" value=\"false\"/>\n  </appSettings>\n</configuration>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.VS.Tests/Microsoft.VisualStudio.SlowCheetah.VS.Tests.csproj",
    "content": "﻿<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFramework>net472</TargetFramework>\n    <IsPackable>false</IsPackable>\n  </PropertyGroup>\n\n  <ItemGroup>\n    <PackageReference Include=\"Microsoft.Build.Utilities.Core\" />\n    <PackageReference Include=\"Microsoft.NET.Test.Sdk\" />\n    <PackageReference Include=\"xunit\" />\n    <PackageReference Include=\"xunit.runner.visualstudio\" PrivateAssets=\"all\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n    <PackageReference Update=\"Nerdbank.GitVersioning\" PrivateAssets=\"all\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n    <PackageReference Update=\"StyleCop.Analyzers\" PrivateAssets=\"All\" IncludeAssets=\"runtime; build; native; contentfiles; analyzers; buildtransitive\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <ProjectReference Include=\"..\\..\\src\\Microsoft.VisualStudio.SlowCheetah.VS\\Microsoft.VisualStudio.SlowCheetah.VS.csproj\" />\n  </ItemGroup>\n\n  <ItemGroup>\n    <Service Include=\"{82a7f48d-3b50-4b1e-b82e-3ada8210c358}\" />\n  </ItemGroup>\n\n</Project>\n"
  },
  {
    "path": "test/Microsoft.VisualStudio.SlowCheetah.VS.Tests/PackageUtilitiesTest.cs",
    "content": "﻿// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nnamespace Microsoft.VisualStudio.SlowCheetah.VS.Tests\n{\n    using System.Collections.Generic;\n    using Xunit;\n\n    /// <summary>\n    /// Test class for <see cref=\"PackageUtilities\"/>.\n    /// </summary>\n    public class PackageUtilitiesTest\n    {\n        private IEnumerable<string> baseTestProjectConfigs = new List<string>(new string[] { \"Debug\", \"Release\" });\n        private IEnumerable<string> testProjectConfigsWithDots = new List<string>(new string[] { \"Debug\", \"Debug.Test\", \"Release\", \"Test.Release\", \"Test.Rel\" });\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> returns on arguments that are null or empty strings.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(null, null)]\n        [InlineData(\"\", \"\")]\n        [InlineData(\"App.config\", null)]\n        [InlineData(\"App.config\", \"\")]\n        [InlineData(null, \"App.Debug.config\")]\n        [InlineData(\"\", \"App.Debug.config\")]\n        public void IsFileTransformWithNullArguments(string docName, string trnName)\n        {\n            Assert.False(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.baseTestProjectConfigs));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> with valid arguments normally found in projects.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Debug.config\")]\n        [InlineData(\"App.config\", \"app.release.config\")]\n        [InlineData(\"APP.config\", \"App.Debug.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Debug.config\")]\n        public void IsFileTransformWithValidArguments(string docName, string trnName)\n        {\n            Assert.True(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.baseTestProjectConfigs));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> with invalid arguments.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Test.Debug.config\")]\n        [InlineData(\"App.Debug.config\", \"App.Debug.config\")]\n        [InlineData(\"App.Debug.config\", \"App.Release.config\")]\n        public void IsFileTransformWithInvalidArguments(string docName, string trnName)\n        {\n            Assert.False(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.baseTestProjectConfigs));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> with project configurations containing dots\n        /// and file names with similar structures. Tests valid names.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Debug.Test.config\")]\n        [InlineData(\"App.System.config\", \"App.System.Debug.Test.config\")]\n        [InlineData(\"App.config\", \"App.Test.Release.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Release.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Test.Release.config\")]\n        [InlineData(\"App.config\", \"App.Test.Rel.config\")]\n        public void IsFileTransformWithDottedConfigsAndValidNames(string docName, string trnName)\n        {\n            Assert.True(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.testProjectConfigsWithDots));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsFileTransformForBuildConfiguration(string, string, IEnumerable{string})\"/> with project configurations containing dots\n        /// and file names with similar structures. Tests invalid names.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Release.Test.config\")]\n        [InlineData(\"App.config\", \"App.Rel.Test.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Rel.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Test.config\")]\n        [InlineData(\"App.Test.config\", \"App.Debug.Test.config\")]\n        [InlineData(\"App.config\", \"Test.Rel.config\")]\n        [InlineData(\"App.Test.Rel.config\", \"App.Test.Rel.config\")]\n        public void IsFileTransformWithDottedConfigsAndInvalidNames(string docName, string trnName)\n        {\n            Assert.False(PackageUtilities.IsFileTransformForBuildConfiguration(docName, trnName, this.testProjectConfigsWithDots));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsGenericFileTransform(string, string)\"/> with invalid arguments.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.config\")]\n        [InlineData(\"App.Debug.config\", \"App.Debug.config\")]\n        [InlineData(\"App.config\", \"App..config\")]\n        [InlineData(\"App.Debug.config\", \"App.config\")]\n        [InlineData(\"App.config\", \"App.config.Debug\")]\n        public void IsFileGenericTransformWithInvalidArguments(string docName, string trnName)\n        {\n            Assert.False(PackageUtilities.IsGenericFileTransform(docName, trnName));\n        }\n\n        /// <summary>\n        /// Tests <see cref=\"PackageUtilities.IsGenericFileTransform(string, string)\"/> with valid arguments.\n        /// </summary>\n        /// <param name=\"docName\">Document name.</param>\n        /// <param name=\"trnName\">Transform file name.</param>\n        [Theory]\n        [InlineData(\"App.config\", \"App.Debug.config\")]\n        [InlineData(\"App.config\", \"App.Test.Debug.config\")]\n        [InlineData(\"App.Test.config\", \"App.Test.Debug.config\")]\n        public void IsFileGenericTransformWithValidArguments(string docName, string trnName)\n        {\n            Assert.True(PackageUtilities.IsGenericFileTransform(docName, trnName));\n        }\n    }\n}\n"
  },
  {
    "path": "test/dirs.proj",
    "content": "<Project Sdk=\"Microsoft.Build.Traversal\">\n  <ItemGroup>\n    <ProjectReference Include=\"**\\*.*proj\" Exclude=\"**\\TestProjects\\**\" />\n  </ItemGroup>\n</Project>"
  },
  {
    "path": "tools/Check-DotNetRuntime.ps1",
    "content": "<#\n.SYNOPSIS\n    Checks whether a given .NET Core runtime is installed.\n#>\n[CmdletBinding()]\nParam (\n    [Parameter()]\n    [ValidateSet('Microsoft.AspNetCore.App','Microsoft.NETCore.App')]\n    [string]$Runtime='Microsoft.NETCore.App',\n    [Parameter(Mandatory=$true)]\n    [Version]$Version\n)\n\n$dotnet = Get-Command dotnet -ErrorAction SilentlyContinue\nif (!$dotnet) {\n    # Nothing is installed.\n    Write-Output $false\n    exit 1\n}\n\nFunction IsVersionMatch {\n    Param(\n        [Parameter()]\n        $actualVersion\n    )\n    return $actualVersion -and\n           $Version.Major -eq $actualVersion.Major -and\n           $Version.Minor -eq $actualVersion.Minor -and\n           (($Version.Build -eq -1) -or ($Version.Build -eq $actualVersion.Build)) -and\n           (($Version.Revision -eq -1) -or ($Version.Revision -eq $actualVersion.Revision))\n}\n\n$installedRuntimes = dotnet --list-runtimes |? { $_.Split()[0] -ieq $Runtime } |% { $v = $null; [Version]::tryparse($_.Split()[1], [ref] $v); $v }\n$matchingRuntimes = $installedRuntimes |? { IsVersionMatch -actualVersion $_ }\nif (!$matchingRuntimes) {\n    Write-Output $false\n    exit 1\n}\n\nWrite-Output $true\nexit 0\n"
  },
  {
    "path": "tools/Check-DotNetSdk.ps1",
    "content": "<#\n.SYNOPSIS\n    Checks whether the .NET Core SDK required by this repo is installed.\n#>\n[CmdletBinding()]\nParam (\n)\n\n$dotnet = Get-Command dotnet -ErrorAction SilentlyContinue\nif (!$dotnet) {\n    # Nothing is installed.\n    Write-Output $false\n    exit 1\n}\n\n# We need to set the current directory so dotnet considers the SDK required by our global.json file.\nPush-Location \"$PSScriptRoot\\..\"\ntry {\n    dotnet -h 2>&1 | Out-Null\n    if (($LASTEXITCODE -eq 129) -or      # On Linux\n        ($LASTEXITCODE -eq -2147450751)  # On Windows\n        ) {\n        # These exit codes indicate no matching SDK exists.\n        Write-Output $false\n        exit 2\n    }\n\n    # The required SDK is already installed!\n    Write-Output $true\n    exit 0\n} catch {\n    # I don't know why, but on some build agents (e.g. MicroBuild), an exception is thrown from the `dotnet` invocation when a match is not found.\n    Write-Output $false\n    exit 3\n} finally {\n    Pop-Location\n}\n"
  },
  {
    "path": "tools/Convert-PDB.ps1",
    "content": "<#\n.SYNOPSIS\n    Converts between Windows PDB and Portable PDB formats.\n.PARAMETER DllPath\n    The path to the DLL whose PDB is to be converted.\n.PARAMETER PdbPath\n    The path to the PDB to convert. May be omitted if the DLL was compiled on this machine and the PDB is still at its original path.\n.PARAMETER OutputPath\n    The path of the output PDB to write.\n#>\n[CmdletBinding()]\nParam(\n    [Parameter(Mandatory = $true, Position = 0)]\n    [string]$DllPath,\n    [Parameter()]\n    [string]$PdbPath,\n    [Parameter(Mandatory = $true, Position = 1)]\n    [string]$OutputPath\n)\n\nif ($IsMacOS -or $IsLinux) {\n    Write-Error \"This script only works on Windows\"\n    return\n}\n\n# This package originally comes from the https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json feed.\n# Add this feed as an upstream to whatever feed is in nuget.config if this step fails.\n$packageID = 'Microsoft.DiaSymReader.Pdb2Pdb'\n$packageVersion = '1.1.0-beta2-21101-01'\ntry {\n    $pdb2pdbpath = & \"$PSScriptRoot/Download-NuGetPackage.ps1\" -PackageId $packageID -Version $packageVersion -Source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json\n}\ncatch {\n    Write-Error \"Failed to install $packageID. Consider adding https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json as an upstream to your nuget.config feed.\"\n    return\n}\n\n$outputDirectory = Split-Path $OutputPath -Parent\nif ($outputDirectory) {\n    New-Item -ItemType Directory -Force -Path $outputDirectory | Out-Null\n}\n\n$toolpath = Join-Path $pdb2pdbpath 'tools\\Pdb2Pdb.exe'\n$arguments = $DllPath, '/out', $OutputPath, '/nowarn', '0021'\nif ($PdbPath) {\n    $arguments += '/pdb', $PdbPath\n}\n\nWrite-Verbose \"$toolpath $arguments\"\n& $toolpath $arguments\n"
  },
  {
    "path": "tools/Download-NuGetPackage.ps1",
    "content": "<#\n.SYNOPSIS\n    Downloads a NuGet package to a local folder using dotnet package download.\n.PARAMETER PackageId\n    The Package ID to download.\n.PARAMETER Version\n    The version of the package to download. If unspecified, the latest version is downloaded.\n.PARAMETER Source\n    An additional package source to search. Used as a fallback alongside the configured feeds.\n.PARAMETER OutputDirectory\n    The directory to download the package to. By default, it uses the obj\\tools folder at the root of the repo.\n.PARAMETER ConfigFile\n    The nuget.config file to use. By default, it uses the repo root nuget.config.\n.PARAMETER Verbosity\n    The verbosity level for the download. Defaults to quiet.\n.OUTPUTS\n    System.String. The path to the downloaded package directory.\n#>\n[CmdletBinding()]\nParam(\n    [Parameter(Position=1,Mandatory=$true)]\n    [string]$PackageId,\n    [Parameter()]\n    [string]$Version,\n    [Parameter()]\n    [string]$Source,\n    [Parameter()]\n    [string]$OutputDirectory=\"$PSScriptRoot\\..\\obj\\tools\",\n    [Parameter()]\n    [string]$ConfigFile=\"$PSScriptRoot\\..\\nuget.config\",\n    [Parameter()]\n    [ValidateSet('quiet','minimal','normal','detailed','diagnostic')]\n    [string]$Verbosity='quiet'\n)\n\nif (!(Test-Path $OutputDirectory)) { New-Item -ItemType Directory -Path $OutputDirectory -Force | Out-Null }\n$OutputDirectory = (Resolve-Path $OutputDirectory).Path\n$ConfigFile = (Resolve-Path $ConfigFile).Path\n\n$packageIdLower = $PackageId.ToLowerInvariant()\n$packageRoot = Join-Path $OutputDirectory $packageIdLower\n\nif ($Version) {\n    $predictedPackageDir = Join-Path $packageRoot $Version\n    if (Test-Path -Path $predictedPackageDir -PathType Container) {\n        Write-Output (Resolve-Path $predictedPackageDir).Path\n        return\n    }\n}\n\n$packageArg = $PackageId\nif ($Version) { $packageArg = \"$PackageId@$Version\" }\n\n$extraArgs = @()\nif ($Source) { $extraArgs += '--source', $Source }\nif ($Version -and $Version -match '-') { $extraArgs += '--prerelease' }\n\n$prevErrorActionPreference = $ErrorActionPreference\n$ErrorActionPreference = 'Continue'\n$downloadOutput = & dotnet package download $packageArg --configfile $ConfigFile --output $OutputDirectory --verbosity $Verbosity @extraArgs 2>&1\n$downloadExitCode = $LASTEXITCODE\n$ErrorActionPreference = $prevErrorActionPreference\n\nif ($downloadExitCode -ne 0) {\n    $downloadOutput | Write-Host\n    throw \"Failed to download package $packageArg (exit code $downloadExitCode).\"\n}\n\n# Return the path to the downloaded package directory (dotnet package download uses lowercase id)\nif ($Version) {\n    $packageDir = Get-ChildItem -Path $packageRoot -Directory -ErrorAction SilentlyContinue |\n        Where-Object { $_.Name -ieq $Version } |\n        Select-Object -First 1\n    if ($packageDir) { $packageDir = $packageDir.FullName }\n} else {\n    # When no version is specified, pick the most recently written version directory.\n    $packageDir = Get-ChildItem -Path $packageRoot -Directory -ErrorAction SilentlyContinue |\n        Sort-Object -Property LastWriteTimeUtc -Descending |\n        Select-Object -First 1\n    if ($packageDir) { $packageDir = $packageDir.FullName }\n}\n\nif ($packageDir -and (Test-Path $packageDir)) {\n    Write-Output $packageDir\n} else {\n    throw \"Package directory not found after download. PackageId='$PackageId'; Version='$Version'; OutputDirectory='$OutputDirectory'; PackageRoot='$packageRoot'.\"\n}\n"
  },
  {
    "path": "tools/Get-ArtifactsStagingDirectory.ps1",
    "content": "Param(\n    [switch]$CleanIfLocal\n)\nif ($env:BUILD_ARTIFACTSTAGINGDIRECTORY) {\n    $ArtifactStagingFolder = $env:BUILD_ARTIFACTSTAGINGDIRECTORY\n} elseif ($env:RUNNER_TEMP) {\n    $ArtifactStagingFolder = Join-Path $env:RUNNER_TEMP _artifacts\n} else {\n    $ArtifactStagingFolder = [System.IO.Path]::GetFullPath(\"$PSScriptRoot/../obj/_artifacts\")\n    if ($CleanIfLocal -and (Test-Path $ArtifactStagingFolder)) {\n        Remove-Item $ArtifactStagingFolder -Recurse -Force\n    }\n}\n\n$ArtifactStagingFolder\n"
  },
  {
    "path": "tools/Get-CodeCovTool.ps1",
    "content": "<#\n.SYNOPSIS\n    Downloads the CodeCov.io uploader tool and returns the path to it.\n.PARAMETER AllowSkipVerify\n    Allows skipping signature verification of the downloaded tool if gpg is not installed.\n#>\n[CmdletBinding()]\nParam(\n    [switch]$AllowSkipVerify\n)\n\nif ($IsMacOS) {\n    $codeCovUrl = \"https://uploader.codecov.io/latest/macos/codecov\"\n    $toolName = 'codecov'\n}\nelseif ($IsLinux) {\n    $codeCovUrl = \"https://uploader.codecov.io/latest/linux/codecov\"\n    $toolName = 'codecov'\n}\nelse {\n    $codeCovUrl = \"https://uploader.codecov.io/latest/windows/codecov.exe\"\n    $toolName = 'codecov.exe'\n}\n\n$shaSuffix = \".SHA256SUM\"\n$sigSuffix = $shaSuffix + \".sig\"\n\nFunction Get-FileFromWeb([Uri]$Uri, $OutDir) {\n    $OutFile = Join-Path $OutDir $Uri.Segments[-1]\n    if (!(Test-Path $OutFile)) {\n        Write-Verbose \"Downloading $Uri...\"\n        if (!(Test-Path $OutDir)) { New-Item -ItemType Directory -Path $OutDir | Out-Null }\n        try {\n            (New-Object System.Net.WebClient).DownloadFile($Uri, $OutFile)\n        } finally {\n            # This try/finally causes the script to abort\n        }\n    }\n\n    $OutFile\n}\n\n$toolsPath = & \"$PSScriptRoot\\Get-TempToolsPath.ps1\"\n$binaryToolsPath = Join-Path $toolsPath codecov\n$testingPath = Join-Path $binaryToolsPath unverified\n$finalToolPath = Join-Path $binaryToolsPath $toolName\n\nif (!(Test-Path $finalToolPath)) {\n    if (Test-Path $testingPath) {\n        Remove-Item -Recurse -Force $testingPath # ensure we download all matching files\n    }\n    $tool = Get-FileFromWeb $codeCovUrl $testingPath\n    $sha = Get-FileFromWeb \"$codeCovUrl$shaSuffix\" $testingPath\n    $sig = Get-FileFromWeb \"$codeCovUrl$sigSuffix\" $testingPath\n    $key = Get-FileFromWeb https://keybase.io/codecovsecurity/pgp_keys.asc $testingPath\n\n    if ((Get-Command gpg -ErrorAction SilentlyContinue)) {\n        Write-Host \"Importing codecov key\" -ForegroundColor Yellow\n        gpg --import $key\n        Write-Host \"Verifying signature on codecov hash\" -ForegroundColor Yellow\n        gpg --verify $sig $sha\n    } else {\n        if ($AllowSkipVerify) {\n            Write-Warning \"gpg not found. Unable to verify hash signature.\"\n        } else {\n            throw \"gpg not found. Unable to verify hash signature. Install gpg or add -AllowSkipVerify to override.\"\n        }\n    }\n\n    Write-Host \"Verifying hash on downloaded tool\" -ForegroundColor Yellow\n    $actualHash = (Get-FileHash -LiteralPath $tool -Algorithm SHA256).Hash\n    $expectedHash = (Get-Content $sha).Split()[0]\n    if ($actualHash -ne $expectedHash) {\n        # Validation failed. Delete the tool so we can't execute it.\n        #Remove-Item $codeCovPath\n        throw \"codecov uploader tool failed signature validation.\"\n    }\n\n    Copy-Item $tool $finalToolPath\n\n    if ($IsMacOS -or $IsLinux) {\n        chmod u+x $finalToolPath\n    }\n}\n\nreturn $finalToolPath\n"
  },
  {
    "path": "tools/Get-ExternalSymbolFiles.ps1",
    "content": "[CmdletBinding()]\nParam (\n)\n\n# Symbol servers to search for PDBs, in order of priority.\n$SymbolServers = @(\n    'https://msdl.microsoft.com/download/symbols'\n    'https://symbols.nuget.org/download/symbols'\n)\n\nFunction Get-SymbolsFromPackage($id, $version) {\n    $symbolPackagesPath = \"$PSScriptRoot/../obj/SymbolsPackages\"\n    New-Item -ItemType Directory -Path $symbolPackagesPath -Force | Out-Null\n    $packagePath = $null\n\n    # Download the package from configured feeds (failures are non-fatal for symbol collection)\n    $previousLastExitCode = $global:LASTEXITCODE\n    try {\n        $packagePath = & \"$PSScriptRoot\\Download-NuGetPackage.ps1\" -PackageId $id -Version $version -OutputDirectory $symbolPackagesPath -ErrorAction SilentlyContinue\n    }\n    catch {\n        Write-Warning \"Failed to download package $id $version from configured feeds. Skipping if not found locally. $($_.Exception.Message)\"\n    }\n    $global:LASTEXITCODE = $previousLastExitCode\n    if (!$packagePath -or !(Test-Path -LiteralPath $packagePath)) {\n        Write-Warning \"Package $id $version not found in configured feeds. Skipping.\"\n        return\n    }\n\n    # Download symbols for each binary using dotnet-symbol\n    $serverArgs = $SymbolServers | ForEach-Object { '--server-path'; $_ }\n    $binaries = @(Get-ChildItem -Recurse -LiteralPath $packagePath -Include *.dll, *.exe)\n    if ($binaries) {\n        $prevErrorActionPreference = $ErrorActionPreference\n        $ErrorActionPreference = 'Continue'\n        & dotnet symbol --symbols @serverArgs @($binaries.FullName) 2>&1 | Out-Null\n        $ErrorActionPreference = $prevErrorActionPreference\n    }\n\n    # Output pairs of binary + PDB paths for archival\n    Get-ChildItem -Recurse -LiteralPath $packagePath -Filter *.pdb | % {\n        $rootName = Join-Path $_.Directory $_.BaseName\n        if ($rootName.EndsWith('.ni')) {\n            $rootName = $rootName.Substring(0, $rootName.Length - 3)\n        }\n\n        $dllPath = \"$rootName.dll\"\n        $exePath = \"$rootName.exe\"\n        if (Test-Path $dllPath) {\n            $BinaryImagePath = $dllPath\n        }\n        elseif (Test-Path $exePath) {\n            $BinaryImagePath = $exePath\n        }\n        else {\n            Write-Warning \"`\"$_`\" found with no matching binary file.\"\n            $BinaryImagePath = $null\n        }\n\n        if ($BinaryImagePath) {\n            Write-Output $BinaryImagePath\n            Write-Output $_.FullName\n        }\n    }\n}\n\nFunction Get-PackageVersions() {\n    if ($script:PackageVersions) {\n        return $script:PackageVersions\n    }\n\n    $propsPath = (Resolve-Path -LiteralPath (Join-Path $PSScriptRoot '..\\Directory.Packages.props')).Path\n    $output = & dotnet msbuild $propsPath -nologo -verbosity:quiet -getItem:PackageVersion 2>&1\n    if ($LASTEXITCODE -ne 0) {\n        Write-Error \"Failed to evaluate package versions from Directory.Packages.props.`n$($output | Out-String)\"\n        return @{}\n    }\n\n    $jsonText = ($output | Out-String).Trim()\n    $jsonStart = $jsonText.IndexOf('{')\n    if ($jsonStart -lt 0) {\n        Write-Error 'Failed to locate JSON output from `dotnet msbuild -getItem:PackageVersion`.'\n        return @{}\n    }\n\n    $packageVersions = @{}\n    foreach ($item in @((ConvertFrom-Json $jsonText.Substring($jsonStart)).Items.PackageVersion)) {\n        $packageVersions[$item.Identity] = $item.Version\n    }\n\n    $script:PackageVersions = $packageVersions\n    $packageVersions\n}\n\nFunction Get-PackageVersion($id) {\n    $version = (Get-PackageVersions)[$id]\n    if (!$version) {\n        Write-Error \"No package version found in Directory.Packages.props for the package '$id'\"\n    }\n\n    $version\n}\n\n# All 1st party packages for which symbols packages are expected should be listed here.\n# These must all be sourced from nuget.org, as it is the only feed that supports symbol packages.\n# We should NOT add 3rd party packages to this list because PDBs may be unsafe for our debuggers to load,\n# so we should only archive 1st party symbols.\n$1stPartyPackageIds = @()\n\n$1stPartyPackageIds | % {\n    $version = Get-PackageVersion $_\n    if ($version) {\n        Write-Verbose \"Downloading symbols for package '$_' version '$version'.\"\n        Get-SymbolsFromPackage -id $_ -version $version\n    } else {\n        Write-Warning \"No version found for package '$_'. Skipping symbol download.\"\n    }\n}\n"
  },
  {
    "path": "tools/Get-LibTemplateBasis.ps1",
    "content": "<#\n.SYNOPSIS\n    Returns the name of the well-known branch in the Library.Template repository upon which HEAD is based.\n#>\n[CmdletBinding(SupportsShouldProcess = $true)]\nParam(\n    [switch]$ErrorIfNotRelated\n)\n\n# This list should be sorted in order of decreasing specificity.\n$branchMarkers = @(\n    @{ commit = 'fd0a7b25ccf030bbd16880cca6efe009d5b1fffc'; branch = 'microbuild' };\n    @{ commit = '05f49ce799c1f9cc696d53eea89699d80f59f833'; branch = 'main' };\n)\n\nforeach ($entry in $branchMarkers) {\n    if (git rev-list HEAD | Select-String -Pattern $entry.commit) {\n        return $entry.branch\n    }\n}\n\nif ($ErrorIfNotRelated) {\n    Write-Error \"Library.Template has not been previously merged with this repo. Please review https://github.com/AArnott/Library.Template/tree/main?tab=readme-ov-file#readme for instructions.\"\n    exit 1\n}\n"
  },
  {
    "path": "tools/Get-NuGetTool.ps1",
    "content": "<#\n.SYNOPSIS\n    Downloads the NuGet.exe tool and returns the path to it.\n.PARAMETER NuGetVersion\n    The version of the NuGet tool to acquire.\n#>\nParam(\n    [Parameter()]\n    [string]$NuGetVersion='7.3.1'\n)\n\nfunction Test-NuGetExecutableSignature {\n    Param(\n        [Parameter(Mandatory=$true)]\n        [string]$Path\n    )\n\n    if (!(Test-Path -LiteralPath $Path)) {\n        return $false\n    }\n\n    $signature = Get-AuthenticodeSignature -FilePath $Path\n    if ($signature.Status -eq [System.Management.Automation.SignatureStatus]::Valid -and\n        $null -ne $signature.SignerCertificate -and\n        $signature.SignerCertificate.Subject -like '*CN=Microsoft Corporation*') {\n        Write-Verbose \"NuGet executable signature is valid.\"\n        return $true\n    }\n\n    Write-Verbose \"NuGet executable signature is invalid.\"\n    return $false\n}\n\n$toolsPath = & \"$PSScriptRoot\\Get-TempToolsPath.ps1\"\n$binaryToolsPath = Join-Path $toolsPath $NuGetVersion\nif (!(Test-Path $binaryToolsPath)) { $null = mkdir $binaryToolsPath }\n$nugetPath = Join-Path $binaryToolsPath nuget.exe\n\nif (!(Test-Path $nugetPath) -or -not (Test-NuGetExecutableSignature -Path $nugetPath)) {\n    Write-Host \"Downloading nuget.exe $NuGetVersion...\" -ForegroundColor Yellow\n    (New-Object System.Net.WebClient).DownloadFile(\"https://dist.nuget.org/win-x86-commandline/v$NuGetVersion/NuGet.exe\", $nugetPath)\n\n    if (!(Test-NuGetExecutableSignature -Path $nugetPath)) {\n        Remove-Item $nugetPath -Force -ErrorAction SilentlyContinue\n        throw \"Downloaded nuget.exe $NuGetVersion failed Authenticode signature validation.\"\n    }\n}\n\nreturn (Resolve-Path $nugetPath).Path\n"
  },
  {
    "path": "tools/Get-ProcDump.ps1",
    "content": "<#\n.SYNOPSIS\nDownloads 32-bit and 64-bit procdump executables and returns the path to where they were installed.\n#>\nJoin-Path (& \"$PSScriptRoot\\Download-NuGetPackage.ps1\" -PackageId procdump -Version 0.0.1) 'bin'\n"
  },
  {
    "path": "tools/Get-SymbolFiles.ps1",
    "content": "<#\n.SYNOPSIS\n    Collect the list of PDBs built in this repo.\n.PARAMETER Path\n    The directory to recursively search for PDBs.\n.PARAMETER Tests\n    A switch indicating to find PDBs only for test binaries instead of only for shipping shipping binaries.\n#>\n[CmdletBinding()]\nparam (\n    [parameter(Mandatory=$true)]\n    [string]$Path,\n    [switch]$Tests\n)\n\n$ActivityName = \"Collecting symbols from $Path\"\nWrite-Progress -Activity $ActivityName -CurrentOperation \"Discovery PDB files\"\n$PDBs = Get-ChildItem -rec \"$Path/*.pdb\"\n\n# Filter PDBs to product OR test related.\n$testregex = \"unittest|tests|\\.test\\.\"\n\nWrite-Progress -Activity $ActivityName -CurrentOperation \"De-duplicating symbols\"\n$PDBsByHash = @{}\n$i = 0\n$PDBs |% {\n    Write-Progress -Activity $ActivityName -CurrentOperation \"De-duplicating symbols\" -PercentComplete (100 * $i / $PDBs.Length)\n    $hash = Get-FileHash $_\n    $i++\n    Add-Member -InputObject $_ -MemberType NoteProperty -Name Hash -Value $hash.Hash\n    Write-Output $_\n} | Sort-Object CreationTime |% {\n    # De-dupe based on hash. Prefer the first match so we take the first built copy.\n    if (-not $PDBsByHash.ContainsKey($_.Hash)) {\n        $PDBsByHash.Add($_.Hash, $_.FullName)\n        Write-Output $_\n    }\n} |? {\n    if ($Tests) {\n        $_.FullName -match $testregex\n    } else {\n        $_.FullName -notmatch $testregex\n    }\n} |% {\n    # Collect the DLLs/EXEs as well.\n    $rootName = Join-Path $_.Directory $_.BaseName\n    if ($rootName.EndsWith('.ni')) {\n        $rootName = $rootName.Substring(0, $rootName.Length - 3)\n    }\n\n    $dllPath = \"$rootName.dll\"\n    $exePath = \"$rootName.exe\"\n    if (Test-Path $dllPath) {\n        $BinaryImagePath = $dllPath\n    } elseif (Test-Path $exePath) {\n        $BinaryImagePath = $exePath\n    } else {\n        Write-Warning \"`\"$_`\" found with no matching binary file.\"\n        $BinaryImagePath = $null\n    }\n\n    if ($BinaryImagePath) {\n        Write-Output $BinaryImagePath\n        Write-Output $_.FullName\n    }\n}\n"
  },
  {
    "path": "tools/Get-TempToolsPath.ps1",
    "content": "if ($env:AGENT_TEMPDIRECTORY) {\n    $path = \"$env:AGENT_TEMPDIRECTORY\\$env:BUILD_BUILDID\"\n} elseif ($env:localappdata) {\n    $path = \"$env:localappdata\\gitrepos\\tools\"\n} else {\n    $path = \"$PSScriptRoot\\..\\obj\\tools\"\n}\n\nif (!(Test-Path $path)) {\n    New-Item -ItemType Directory -Path $Path | Out-Null\n}\n\n(Resolve-Path $path).Path\n"
  },
  {
    "path": "tools/Install-DotNetSdk.ps1",
    "content": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n    Installs the .NET SDK specified in the global.json file at the root of this repository,\n    along with supporting .NET runtimes used for testing.\n.DESCRIPTION\n    This MAY not require elevation, as the SDK and runtimes are installed locally to this repo location,\n    unless `-InstallLocality machine` is specified.\n.PARAMETER InstallLocality\n    A value indicating whether dependencies should be installed locally to the repo or at a per-user location.\n    Per-user allows sharing the installed dependencies across repositories and allows use of a shared expanded package cache.\n    Visual Studio will only notice and use these SDKs/runtimes if VS is launched from the environment that runs this script.\n    Per-repo allows for high isolation, allowing for a more precise recreation of the environment within an Azure Pipelines build.\n    When using 'repo', environment variables are set to cause the locally installed dotnet SDK to be used.\n    Per-repo can lead to file locking issues when dotnet.exe is left running as a build server and can be mitigated by running `dotnet build-server shutdown`.\n    Per-machine requires elevation and will download and install all SDKs and runtimes to machine-wide locations so all applications can find it.\n.PARAMETER SdkOnly\n    Skips installing the runtime.\n.PARAMETER IncludeX86\n    Installs a x86 SDK and runtimes in addition to the x64 ones. Only supported on Windows. Ignored on others.\n.PARAMETER IncludeAspNetCore\n    Installs the ASP.NET Core runtime along with the .NET runtime.\n#>\n[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='Medium')]\nParam (\n    [ValidateSet('repo','user','machine')]\n    [string]$InstallLocality='user',\n    [switch]$SdkOnly,\n    [switch]$IncludeX86,\n    [switch]$IncludeAspNetCore\n)\n\n$DotNetInstallScriptRoot = \"$PSScriptRoot/../obj/tools\"\nif (!(Test-Path $DotNetInstallScriptRoot)) { New-Item -ItemType Directory -Path $DotNetInstallScriptRoot -WhatIf:$false | Out-Null }\n$DotNetInstallScriptRoot = Resolve-Path $DotNetInstallScriptRoot\n\n# Look up actual required .NET SDK version from global.json\n$sdks = @(New-Object PSObject -Property @{ Version = & \"$PSScriptRoot/variables/DotNetSdkVersion.ps1\" })\n\n# Sometimes a repo requires extra SDKs to be installed (e.g. msbuild.locator scenarios running in tests).\n# In such a circumstance, a precise SDK version or a channel can be added as in the example below:\n# $sdks += New-Object PSObject -Property @{ Channel = '8.0' }\n\nIf ($IncludeX86 -and ($IsMacOS -or $IsLinux)) {\n    Write-Verbose \"Ignoring -IncludeX86 switch because 32-bit runtimes are only supported on Windows.\"\n    $IncludeX86 = $false\n}\n\n$arch = [System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture\nif (!$arch) { # Windows Powershell leaves this blank\n    $arch = 'x64'\n    if ($env:PROCESSOR_ARCHITECTURE -eq 'ARM64') { $arch = 'ARM64' }\n    if (${env:ProgramFiles(Arm)}) { $arch = 'ARM64' }\n}\n\n# Search for all .NET runtime versions referenced from MSBuild projects and arrange to install them.\n$runtimeVersions = @()\n$windowsDesktopRuntimeVersions = @()\n$aspnetRuntimeVersions = @()\nif (!$SdkOnly) {\n    Get-ChildItem \"$PSScriptRoot\\..\\src\\*.*proj\", \"$PSScriptRoot\\..\\test\\*.*proj\", \"$PSScriptRoot\\..\\Directory.Build.props\" -Recurse | % {\n        $projXml = [xml](Get-Content -LiteralPath $_)\n        $pg = $projXml.Project.PropertyGroup\n        if ($pg) {\n            $targetFrameworks = @()\n            $tf = $pg.TargetFramework\n            $targetFrameworks += $tf\n            $tfs = $pg.TargetFrameworks\n            if ($tfs) {\n                $targetFrameworks = $tfs -Split ';'\n            }\n        }\n        $targetFrameworks |? { $_ -match 'net(?:coreapp)?(\\d+\\.\\d+)' } |% {\n            $v = $Matches[1]\n            $runtimeVersions += $v\n            $aspnetRuntimeVersions += $v\n            if ($v -ge '3.0' -and -not ($IsMacOS -or $IsLinux)) {\n                $windowsDesktopRuntimeVersions += $v\n            }\n        }\n\n        # Add target frameworks of the form: netXX\n        $targetFrameworks |? { $_ -match 'net(\\d+\\.\\d+)' } |% {\n            $v = $Matches[1]\n            $runtimeVersions += $v\n            $aspnetRuntimeVersions += $v\n            if (-not ($IsMacOS -or $IsLinux)) {\n                $windowsDesktopRuntimeVersions += $v\n            }\n        }\n    }\n}\n\nif (!$IncludeAspNetCore) {\n    $aspnetRuntimeVersions = @()\n}\n\nFunction Get-FileFromWeb([Uri]$Uri, $OutDir) {\n    $OutFile = Join-Path $OutDir $Uri.Segments[-1]\n    if (!(Test-Path $OutFile)) {\n        Write-Verbose \"Downloading $Uri...\"\n        if (!(Test-Path $OutDir)) { New-Item -ItemType Directory -Path $OutDir | Out-Null }\n        try {\n            (New-Object System.Net.WebClient).DownloadFile($Uri, $OutFile)\n        } finally {\n            # This try/finally causes the script to abort\n        }\n    }\n\n    $OutFile\n}\n\nFunction Get-InstallerExe(\n    $Version,\n    $Architecture,\n    [ValidateSet('Sdk','Runtime','WindowsDesktop')]\n    [string]$sku\n) {\n    # Get the latest/actual version for the specified one\n    $TypedVersion = $null\n    if (![Version]::TryParse($Version, [ref] $TypedVersion)) {\n        Write-Error \"Unable to parse $Version into an a.b.c.d version. This version cannot be installed machine-wide.\"\n        exit 1\n    }\n\n    if ($TypedVersion.Build -eq -1) {\n        $versionInfo = -Split (Invoke-WebRequest -Uri \"https://builds.dotnet.microsoft.com/dotnet/$sku/$Version/latest.version\" -UseBasicParsing)\n        $Version = $versionInfo[-1]\n    }\n\n    $majorMinor = \"$($TypedVersion.Major).$($TypedVersion.Minor)\"\n    $ReleasesFile = Join-Path $DotNetInstallScriptRoot \"$majorMinor\\releases.json\"\n    if (!(Test-Path $ReleasesFile)) {\n        Get-FileFromWeb -Uri \"https://builds.dotnet.microsoft.com/dotnet/release-metadata/$majorMinor/releases.json\" -OutDir (Split-Path $ReleasesFile) | Out-Null\n    }\n\n    $releases = Get-Content $ReleasesFile | ConvertFrom-Json\n    $url = $null\n    foreach ($release in $releases.releases) {\n        $filesElement = $null\n        if ($release.$sku.version -eq $Version) {\n            $filesElement = $release.$sku.files\n        }\n        if (!$filesElement -and ($sku -eq 'sdk') -and $release.sdks) {\n            foreach ($sdk in $release.sdks) {\n                if ($sdk.version -eq $Version) {\n                    $filesElement = $sdk.files\n                    break\n                }\n            }\n        }\n\n        if ($filesElement) {\n            foreach ($file in $filesElement) {\n                if ($file.rid -eq \"win-$Architecture\") {\n                    $url = $file.url\n                    Break\n                }\n            }\n\n            if ($url) {\n                Break\n            }\n        }\n    }\n\n    if ($url) {\n        Get-FileFromWeb -Uri $url -OutDir $DotNetInstallScriptRoot\n    } else {\n        throw \"Unable to find release of $sku v$Version\"\n    }\n}\n\nFunction Install-DotNet($Version, $Architecture, [ValidateSet('Sdk','Runtime','WindowsDesktop','AspNetCore')][string]$sku = 'Sdk') {\n    Write-Host \"Downloading .NET $sku $Version...\"\n    $Installer = Get-InstallerExe -Version $Version -Architecture $Architecture -sku $sku\n    Write-Host \"Installing .NET $sku $Version...\"\n    cmd /c start /wait $Installer /install /passive /norestart\n    if ($LASTEXITCODE -eq 3010) {\n        Write-Verbose \"Restart required\"\n    } elseif ($LASTEXITCODE -ne 0) {\n        throw \"Failure to install .NET SDK\"\n    }\n}\n\n$switches = @()\n$envVars = @{\n    # For locally installed dotnet, skip first time experience which takes a long time\n    'DOTNET_SKIP_FIRST_TIME_EXPERIENCE' = 'true';\n}\n\nif ($InstallLocality -eq 'machine') {\n    if ($IsMacOS -or $IsLinux) {\n        $DotNetInstallDir = '/usr/share/dotnet'\n    } else {\n        $restartRequired = $false\n        $sdks |% {\n            if ($_.Version) { $version = $_.Version } else { $version = $_.Channel }\n            if ($PSCmdlet.ShouldProcess(\".NET SDK $version ($arch)\", \"Install\")) {\n                Install-DotNet -Version $version -Architecture $arch\n                $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)\n\n                if ($IncludeX86) {\n                    Install-DotNet -Version $version -Architecture x86\n                    $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)\n                }\n            }\n        }\n\n        $runtimeVersions | Sort-Object | Get-Unique |% {\n            if ($PSCmdlet.ShouldProcess(\".NET runtime $_\", \"Install\")) {\n                Install-DotNet -Version $_ -sku Runtime -Architecture $arch\n                $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)\n\n                if ($IncludeX86) {\n                    Install-DotNet -Version $_ -sku Runtime -Architecture x86\n                    $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)\n                }\n            }\n        }\n\n        $windowsDesktopRuntimeVersions | Sort-Object | Get-Unique |% {\n            if ($PSCmdlet.ShouldProcess(\".NET Windows Desktop $_\", \"Install\")) {\n                Install-DotNet -Version $_ -sku WindowsDesktop -Architecture $arch\n                $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)\n\n                if ($IncludeX86) {\n                    Install-DotNet -Version $_ -sku WindowsDesktop -Architecture x86\n                    $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)\n                }\n            }\n        }\n\n        $aspnetRuntimeVersions | Sort-Object | Get-Unique |% {\n            if ($PSCmdlet.ShouldProcess(\"ASP.NET Core $_\", \"Install\")) {\n                Install-DotNet -Version $_ -sku AspNetCore -Architecture $arch\n                $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)\n\n                if ($IncludeX86) {\n                    Install-DotNet -Version $_ -sku AspNetCore -Architecture x86\n                    $restartRequired = $restartRequired -or ($LASTEXITCODE -eq 3010)\n                }\n            }\n        }\n        if ($restartRequired) {\n            Write-Host -ForegroundColor Yellow \"System restart required\"\n            Exit 3010\n        }\n\n        return\n    }\n} elseif ($InstallLocality -eq 'repo') {\n    $DotNetInstallDir = \"$DotNetInstallScriptRoot/.dotnet\"\n    $DotNetX86InstallDir = \"$DotNetInstallScriptRoot/x86/.dotnet\"\n} elseif ($env:AGENT_TOOLSDIRECTORY) {\n    $DotNetInstallDir = \"$env:AGENT_TOOLSDIRECTORY/dotnet\"\n    $DotNetX86InstallDir = \"$env:AGENT_TOOLSDIRECTORY/x86/dotnet\"\n} else {\n    $DotNetInstallDir = Join-Path $HOME .dotnet\n}\n\nif ($DotNetInstallDir) {\n    if (!(Test-Path $DotNetInstallDir)) { New-Item -ItemType Directory -Path $DotNetInstallDir }\n    $DotNetInstallDir = Resolve-Path $DotNetInstallDir\n    Write-Host \"Installing .NET SDK and runtimes to $DotNetInstallDir\" -ForegroundColor Blue\n    $envVars['DOTNET_MULTILEVEL_LOOKUP'] = '0'\n    $envVars['DOTNET_ROOT'] = $DotNetInstallDir\n}\n\nif ($IncludeX86) {\n    if ($DotNetX86InstallDir) {\n        if (!(Test-Path $DotNetX86InstallDir)) { New-Item -ItemType Directory -Path $DotNetX86InstallDir }\n        $DotNetX86InstallDir = Resolve-Path $DotNetX86InstallDir\n        Write-Host \"Installing x86 .NET SDK and runtimes to $DotNetX86InstallDir\" -ForegroundColor Blue\n    } else {\n        # Only machine-wide or repo-wide installations can handle two unique dotnet.exe architectures.\n        Write-Error \"The installation location or OS isn't supported for x86 installation. Try a different -InstallLocality value.\"\n        return 1\n    }\n}\n\nif ($IsMacOS -or $IsLinux) {\n    $DownloadUri = \"https://raw.githubusercontent.com/dotnet/install-scripts/a3fbd0fd625032bac207f1f590e5353fe26faa59/src/dotnet-install.sh\"\n    $DotNetInstallScriptPath = \"$DotNetInstallScriptRoot/dotnet-install.sh\"\n} else {\n    $DownloadUri = \"https://raw.githubusercontent.com/dotnet/install-scripts/a3fbd0fd625032bac207f1f590e5353fe26faa59/src/dotnet-install.ps1\"\n    $DotNetInstallScriptPath = \"$DotNetInstallScriptRoot/dotnet-install.ps1\"\n}\n\nif (-not (Test-Path $DotNetInstallScriptPath)) {\n    Invoke-WebRequest -Uri $DownloadUri -OutFile $DotNetInstallScriptPath -UseBasicParsing\n    if ($IsMacOS -or $IsLinux) {\n        chmod +x $DotNetInstallScriptPath\n    }\n}\n\n# In case the script we invoke is in a directory with spaces, wrap it with single quotes.\n# In case the path includes single quotes, escape them.\n$DotNetInstallScriptPathExpression = $DotNetInstallScriptPath.Replace(\"'\", \"''\")\n$DotNetInstallScriptPathExpression = \"& '$DotNetInstallScriptPathExpression'\"\n\n$anythingInstalled = $false\n$global:LASTEXITCODE = 0\n\n$sdks |% {\n    if ($_.Version) { $parameters = '-Version', $_.Version } else { $parameters = '-Channel', $_.Channel }\n\n    if ($PSCmdlet.ShouldProcess(\".NET SDK $_ ($arch)\", \"Install\")) {\n        $anythingInstalled = $true\n        Invoke-Expression -Command \"$DotNetInstallScriptPathExpression $parameters -Architecture $arch -InstallDir $DotNetInstallDir $switches\"\n\n        if ($LASTEXITCODE -ne 0) {\n            Write-Error \".NET SDK installation failure: $LASTEXITCODE\"\n            exit $LASTEXITCODE\n        }\n    } else {\n        Invoke-Expression -Command \"$DotNetInstallScriptPathExpression $parameters -Architecture $arch -InstallDir $DotNetInstallDir $switches -DryRun\"\n    }\n\n    if ($IncludeX86) {\n        if ($PSCmdlet.ShouldProcess(\".NET x86 SDK $_\", \"Install\")) {\n            $anythingInstalled = $true\n            Invoke-Expression -Command \"$DotNetInstallScriptPathExpression $parameters -Architecture x86 -InstallDir $DotNetX86InstallDir $switches\"\n\n            if ($LASTEXITCODE -ne 0) {\n                Write-Error \".NET x86 SDK installation failure: $LASTEXITCODE\"\n                exit $LASTEXITCODE\n            }\n        } else {\n            Invoke-Expression -Command \"$DotNetInstallScriptPathExpression $parameters -Architecture x86 -InstallDir $DotNetX86InstallDir $switches -DryRun\"\n        }\n    }\n}\n\n$dotnetRuntimeSwitches = $switches + '-Runtime','dotnet'\n\n$runtimeVersions | Sort-Object -Unique |% {\n    if ($PSCmdlet.ShouldProcess(\".NET $Arch runtime $_\", \"Install\")) {\n        $anythingInstalled = $true\n        Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture $arch -InstallDir $DotNetInstallDir $dotnetRuntimeSwitches\"\n\n        if ($LASTEXITCODE -ne 0) {\n            Write-Error \".NET SDK installation failure: $LASTEXITCODE\"\n            exit $LASTEXITCODE\n        }\n    } else {\n        Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture $arch -InstallDir $DotNetInstallDir $dotnetRuntimeSwitches -DryRun\"\n    }\n\n    if ($IncludeX86) {\n        if ($PSCmdlet.ShouldProcess(\".NET x86 runtime $_\", \"Install\")) {\n            $anythingInstalled = $true\n            Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture x86 -InstallDir $DotNetX86InstallDir $dotnetRuntimeSwitches\"\n\n            if ($LASTEXITCODE -ne 0) {\n                Write-Error \".NET SDK installation failure: $LASTEXITCODE\"\n                exit $LASTEXITCODE\n            }\n        } else {\n            Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture x86 -InstallDir $DotNetX86InstallDir $dotnetRuntimeSwitches -DryRun\"\n        }\n    }\n}\n\n$windowsDesktopRuntimeSwitches = $switches + '-Runtime','windowsdesktop'\n\n$windowsDesktopRuntimeVersions | Sort-Object -Unique |% {\n    if ($PSCmdlet.ShouldProcess(\".NET WindowsDesktop $arch runtime $_\", \"Install\")) {\n        $anythingInstalled = $true\n        Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture $arch -InstallDir $DotNetInstallDir $windowsDesktopRuntimeSwitches\"\n\n        if ($LASTEXITCODE -ne 0) {\n            Write-Error \".NET SDK installation failure: $LASTEXITCODE\"\n            exit $LASTEXITCODE\n        }\n    } else {\n        Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture $arch -InstallDir $DotNetInstallDir $windowsDesktopRuntimeSwitches -DryRun\"\n    }\n\n    if ($IncludeX86) {\n        if ($PSCmdlet.ShouldProcess(\".NET WindowsDesktop x86 runtime $_\", \"Install\")) {\n            $anythingInstalled = $true\n            Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture x86 -InstallDir $DotNetX86InstallDir $windowsDesktopRuntimeSwitches\"\n\n            if ($LASTEXITCODE -ne 0) {\n                Write-Error \".NET SDK installation failure: $LASTEXITCODE\"\n                exit $LASTEXITCODE\n            }\n        } else {\n            Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture x86 -InstallDir $DotNetX86InstallDir $windowsDesktopRuntimeSwitches -DryRun\"\n        }\n    }\n}\n\n$aspnetRuntimeSwitches = $switches + '-Runtime','aspnetcore'\n\n$aspnetRuntimeVersions | Sort-Object -Unique |% {\n    if ($PSCmdlet.ShouldProcess(\".NET ASP.NET Core $arch runtime $_\", \"Install\")) {\n        $anythingInstalled = $true\n        Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture $arch -InstallDir $DotNetInstallDir $aspnetRuntimeSwitches\"\n\n        if ($LASTEXITCODE -ne 0) {\n            Write-Error \".NET SDK installation failure: $LASTEXITCODE\"\n            exit $LASTEXITCODE\n        }\n    } else {\n        Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture $arch -InstallDir $DotNetInstallDir $aspnetRuntimeSwitches -DryRun\"\n    }\n\n    if ($IncludeX86) {\n        if ($PSCmdlet.ShouldProcess(\".NET ASP.NET Core x86 runtime $_\", \"Install\")) {\n            $anythingInstalled = $true\n            Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture x86 -InstallDir $DotNetX86InstallDir $aspnetRuntimeSwitches\"\n\n            if ($LASTEXITCODE -ne 0) {\n                Write-Error \".NET SDK installation failure: $LASTEXITCODE\"\n                exit $LASTEXITCODE\n            }\n        } else {\n            Invoke-Expression -Command \"$DotNetInstallScriptPathExpression -Channel $_ -Architecture x86 -InstallDir $DotNetX86InstallDir $aspnetRuntimeSwitches -DryRun\"\n        }\n    }\n}\n\nif ($PSCmdlet.ShouldProcess(\"Set DOTNET environment variables to discover these installed runtimes?\")) {\n    & \"$PSScriptRoot/Set-EnvVars.ps1\" -Variables $envVars -PrependPath $DotNetInstallDir | Out-Null\n}\n\nif ($anythingInstalled -and ($InstallLocality -ne 'machine') -and !$env:TF_BUILD -and !$env:GITHUB_ACTIONS) {\n    Write-Warning \".NET runtimes or SDKs were installed to a non-machine location. Perform your builds or open Visual Studio from this same environment in order for tools to discover the location of these dependencies.\"\n}\n"
  },
  {
    "path": "tools/Install-NuGetCredProvider.ps1",
    "content": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n    Downloads and installs the Microsoft Artifacts Credential Provider\n    from https://github.com/microsoft/artifacts-credprovider\n    to assist in authenticating to Azure Artifact feeds in interactive development\n    or unattended build agents.\n.PARAMETER Force\n    Forces install of the CredProvider plugin even if one already exists. This is useful to upgrade an older version.\n.PARAMETER AccessToken\n    An optional access token for authenticating to Azure Artifacts authenticated feeds.\n#>\n[CmdletBinding()]\nParam (\n    [Parameter()]\n    [switch]$Force,\n    [Parameter()]\n    [string]$AccessToken\n)\n\n$envVars = @{}\n\n$toolsPath = & \"$PSScriptRoot\\Get-TempToolsPath.ps1\"\n\nif ($IsMacOS -or $IsLinux) {\n    $installerScript = \"installcredprovider.sh\"\n    $sourceUrl = \"https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.sh\"\n} else {\n    $installerScript = \"installcredprovider.ps1\"\n    $sourceUrl = \"https://raw.githubusercontent.com/microsoft/artifacts-credprovider/master/helpers/installcredprovider.ps1\"\n}\n\n$installerScript = Join-Path $toolsPath $installerScript\n\nif (!(Test-Path $installerScript) -or $Force) {\n    Invoke-WebRequest $sourceUrl -OutFile $installerScript\n}\n\n$installerScript = (Resolve-Path $installerScript).Path\n\nif ($IsMacOS -or $IsLinux) {\n    chmod u+x $installerScript\n}\n\n& $installerScript -Force:$Force -AddNetfx -InstallNet8\n\nif ($AccessToken) {\n    $endpoints = @()\n\n    $endpointURIs = @()\n    Get-ChildItem \"$PSScriptRoot\\..\\nuget.config\" -Recurse |% {\n        $nugetConfig = [xml](Get-Content -LiteralPath $_)\n\n        $nugetConfig.configuration.packageSources.add |? { ($_.value -match '^https://pkgs\\.dev\\.azure\\.com/') -or ($_.value -match '^https://[\\w\\-]+\\.pkgs\\.visualstudio\\.com/') } |% {\n            if ($endpointURIs -notcontains $_.Value) {\n                $endpointURIs += $_.Value\n                $endpoint = New-Object -TypeName PSObject\n                Add-Member -InputObject $endpoint -MemberType NoteProperty -Name endpoint -Value $_.value\n                Add-Member -InputObject $endpoint -MemberType NoteProperty -Name username -Value ado\n                Add-Member -InputObject $endpoint -MemberType NoteProperty -Name password -Value $AccessToken\n                $endpoints += $endpoint\n            }\n        }\n    }\n\n    $auth = New-Object -TypeName PSObject\n    Add-Member -InputObject $auth -MemberType NoteProperty -Name endpointCredentials -Value $endpoints\n\n    $authJson = ConvertTo-Json -InputObject $auth\n    $envVars += @{\n        'VSS_NUGET_EXTERNAL_FEED_ENDPOINTS'=$authJson;\n    }\n}\n\n& \"$PSScriptRoot/Set-EnvVars.ps1\" -Variables $envVars | Out-Null\n"
  },
  {
    "path": "tools/Install-NuGetPackage.ps1",
    "content": "<#\n.SYNOPSIS\n    Installs a NuGet package.\n.PARAMETER PackageID\n    The Package ID to install.\n.PARAMETER Version\n    The version of the package to install. If unspecified, the latest stable release is installed.\n.PARAMETER Source\n    The package source feed to find the package to install from.\n.PARAMETER Prerelease\n    Include prerelease packages when searching for the latest version.\n.PARAMETER ExcludeVersion\n    Installs the package without adding the version to the folder name.\n.PARAMETER DirectDownload\n    Bypass the local cache when downloading packages.\n.PARAMETER PackagesDir\n    The directory to install the package to. By default, it uses the Packages folder at the root of the repo.\n.PARAMETER ConfigFile\n    The nuget.config file to use. By default, it uses :/nuget.config.\n.OUTPUTS\n    System.String. The path to the installed package.\n#>\n[CmdletBinding(SupportsShouldProcess=$true,ConfirmImpact='Low')]\nParam(\n    [Parameter(Position=1,Mandatory=$true)]\n    [string]$PackageId,\n    [Parameter()]\n    [string]$Version,\n    [Parameter()]\n    [string]$Source,\n    [Parameter()]\n    [switch]$Prerelease,\n    [Parameter()]\n    [switch]$ExcludeVersion,\n    [Parameter()]\n    [switch]$DirectDownload,\n    [Parameter()]\n    [string]$PackagesDir=\"$PSScriptRoot\\..\\packages\",\n    [Parameter()]\n    [string]$ConfigFile=\"$PSScriptRoot\\..\\nuget.config\",\n    [Parameter()]\n    [ValidateSet('Quiet','Normal','Detailed')]\n    [string]$Verbosity='normal'\n)\n\n$nugetPath = & \"$PSScriptRoot\\Get-NuGetTool.ps1\"\n\nWrite-Verbose \"Installing $PackageId...\"\n$nugetArgs = \"Install\",$PackageId,\"-OutputDirectory\",$PackagesDir,'-ConfigFile',$ConfigFile\nif ($Version) { $nugetArgs += \"-Version\",$Version }\nif ($Source) { $nugetArgs += \"-FallbackSource\",$Source }\nif ($Prerelease) { $nugetArgs += \"-Prerelease\" }\nif ($ExcludeVersion) { $nugetArgs += '-ExcludeVersion' }\nif ($DirectDownload) { $nugetArgs += '-DirectDownload' }\n$nugetArgs += '-Verbosity',$Verbosity\n\nif ($PSCmdlet.ShouldProcess($PackageId, 'nuget install')) {\n    $p = Start-Process $nugetPath $nugetArgs -NoNewWindow -Wait -PassThru\n    if ($null -ne $p.ExitCode -and $p.ExitCode -ne 0) {\n        throw \"NuGet install failed for package '$PackageId' (version '$Version') with exit code $($p.ExitCode).\"\n    }\n}\n\n# Provide the path to the installed package directory to our caller.\nif ($ExcludeVersion) {\n    $packageDir = Get-ChildItem -Path $PackagesDir -Directory -ErrorAction SilentlyContinue |\n        Where-Object { $_.Name -ieq $PackageId } |\n        Select-Object -First 1\n} elseif ($Version) {\n    $expectedDirectoryName = \"$PackageId.$Version\"\n    $packageDir = Get-ChildItem -Path $PackagesDir -Directory -ErrorAction SilentlyContinue |\n        Where-Object { $_.Name -ieq $expectedDirectoryName } |\n        Select-Object -First 1\n} else {\n    $packageDir = Get-ChildItem -Path $PackagesDir -Directory -ErrorAction SilentlyContinue |\n        Where-Object { $_.Name -like \"$PackageId.*\" } |\n        Sort-Object -Property LastWriteTimeUtc -Descending |\n        Select-Object -First 1\n}\n\nif ($packageDir -and (Test-Path -Path $packageDir.FullName -PathType Container)) {\n    Write-Output $packageDir.FullName\n} else {\n    throw \"Installed package directory not found. PackageId='$PackageId'; Version='$Version'; ExcludeVersion='$ExcludeVersion'; PackagesDir='$PackagesDir'.\"\n}\n"
  },
  {
    "path": "tools/MergeFrom-Template.ps1",
    "content": "\n<#\n.SYNOPSIS\n    Merges the latest changes from Library.Template into HEAD of this repo.\n.PARAMETER LocalBranch\n    The name of the local branch to create at HEAD and use to merge into from Library.Template.\n#>\n[CmdletBinding(SupportsShouldProcess = $true)]\nParam(\n    [string]$LocalBranch = \"dev/$($env:USERNAME)/libtemplateUpdate\"\n)\n\nFunction Spawn-Tool($command, $commandArgs, $workingDirectory, $allowFailures) {\n    if ($workingDirectory) {\n        Push-Location $workingDirectory\n    }\n    try {\n        if ($env:TF_BUILD) {\n            Write-Host \"$pwd >\"\n            Write-Host \"##[command]$command $commandArgs\"\n        }\n        else {\n            Write-Host \"$command $commandArgs\" -ForegroundColor Yellow\n        }\n        if ($commandArgs) {\n            & $command @commandArgs\n        } else {\n            Invoke-Expression $command\n        }\n        if ((!$allowFailures) -and ($LASTEXITCODE -ne 0)) { exit $LASTEXITCODE }\n    }\n    finally {\n        if ($workingDirectory) {\n            Pop-Location\n        }\n    }\n}\n\n$remoteBranch = & $PSScriptRoot\\Get-LibTemplateBasis.ps1 -ErrorIfNotRelated\nif ($LASTEXITCODE -ne 0) {\n    exit $LASTEXITCODE\n}\n\n$LibTemplateUrl = 'https://github.com/aarnott/Library.Template'\nSpawn-Tool 'git' ('fetch', $LibTemplateUrl, $remoteBranch)\n$SourceCommit = Spawn-Tool 'git' ('rev-parse', 'FETCH_HEAD')\n$BaseBranch = Spawn-Tool 'git' ('branch', '--show-current')\n$SourceCommitUrl = \"$LibTemplateUrl/commit/$SourceCommit\"\n\n# To reduce the odds of merge conflicts at this stage, we always move HEAD to the last successful merge.\n$basis = Spawn-Tool 'git' ('rev-parse', 'HEAD') # TODO: consider improving this later\n\nWrite-Host \"Merging the $remoteBranch branch of Library.Template ($SourceCommit) into local repo $basis\" -ForegroundColor Green\n\nSpawn-Tool 'git' ('checkout', '-b', $LocalBranch, $basis) $null $true\nif ($LASTEXITCODE -eq 128) {\n    Spawn-Tool 'git' ('checkout', $LocalBranch)\n    Spawn-Tool 'git' ('merge', $basis)\n}\n\nSpawn-Tool 'git' ('merge', 'FETCH_HEAD', '--no-ff', '-m', \"Merge the $remoteBranch branch from $LibTemplateUrl`n`nSpecifically, this merges [$SourceCommit from that repo]($SourceCommitUrl).\")\nif ($LASTEXITCODE -eq 1) {\n    Write-Error \"Merge conflict detected. Manual resolution required.\"\n    exit 1\n}\nelseif ($LASTEXITCODE -ne 0) {\n    Write-Error \"Merge failed with exit code $LASTEXITCODE.\"\n    exit $LASTEXITCODE\n}\n\n$result = New-Object PSObject -Property @{\n    BaseBranch   = $BaseBranch   # The original branch that was checked out when the script ran.\n    LocalBranch  = $LocalBranch  # The name of the local branch that was created before the merge.\n    SourceCommit = $SourceCommit # The commit from Library.Template that was merged in.\n    SourceBranch = $remoteBranch # The branch from Library.Template that was merged in.\n}\n\nWrite-Host $result\nWrite-Output $result\n"
  },
  {
    "path": "tools/Prepare-Legacy-Symbols.ps1",
    "content": "Param(\n    [string]$Path\n)\n\n$ArtifactStagingFolder = & \"$PSScriptRoot/Get-ArtifactsStagingDirectory.ps1\"\n$ArtifactStagingFolder += '/symbols-legacy'\nrobocopy $Path $ArtifactStagingFolder /mir /njh /njs /ndl /nfl\n$WindowsPdbSubDirName = 'symstore'\n\nGet-ChildItem \"$ArtifactStagingFolder\\*.pdb\" -Recurse |% {\n    $dllPath = \"$($_.Directory)/$($_.BaseName).dll\"\n    $exePath = \"$($_.Directory)/$($_.BaseName).exe\"\n    if (Test-Path $dllPath) {\n        $BinaryImagePath = $dllPath\n    } elseif (Test-Path $exePath) {\n        $BinaryImagePath = $exePath\n    } else {\n        Write-Warning \"`\"$_`\" found with no matching binary file.\"\n        $BinaryImagePath = $null\n    }\n\n    if ($BinaryImagePath) {\n        # Native binaries can't have their PDBs converted to legacy (Windows) format so just skip them\n        try {\n            [System.Reflection.AssemblyName]::GetAssemblyName($BinaryImagePath) | Out-Null\n            $isManaged = $true\n        }\n        catch {\n            $isManaged = $false\n        }\n\n        if (-not $isManaged) {\n            Write-Host \"Skipping native binary PDB: $_\" -ForegroundColor DarkYellow\n            continue\n        }\n\n        # Convert the PDB to legacy Windows PDBs\n        Write-Host \"Converting PDB for $_\" -ForegroundColor DarkGray\n        $WindowsPdbDir = \"$($_.Directory.FullName)\\$WindowsPdbSubDirName\"\n        if (!(Test-Path $WindowsPdbDir)) { mkdir $WindowsPdbDir | Out-Null }\n        $legacyPdbPath = \"$WindowsPdbDir\\$($_.BaseName).pdb\"\n        & \"$PSScriptRoot\\Convert-PDB.ps1\" -DllPath $BinaryImagePath -PdbPath $_ -OutputPath $legacyPdbPath\n        if ($LASTEXITCODE -ne 0) {\n            Write-Warning \"PDB conversion of `\"$_`\" failed.\"\n        }\n\n        Move-Item $legacyPdbPath $_ -Force\n    }\n}\n"
  },
  {
    "path": "tools/Set-EnvVars.ps1",
    "content": "<#\n.SYNOPSIS\n    Set environment variables in the environment.\n    Azure Pipeline and CMD environments are considered.\n.PARAMETER Variables\n    A hashtable of variables to be set.\n.PARAMETER PrependPath\n    A set of paths to prepend to the PATH environment variable.\n.OUTPUTS\n    A boolean indicating whether the environment variables can be expected to propagate to the caller's environment.\n.DESCRIPTION\n    The CmdEnvScriptPath environment variable may be optionally set to a path to a cmd shell script to be created (or appended to if it already exists) that will set the environment variables in cmd.exe that are set within the PowerShell environment.\n    This is used by init.cmd in order to reapply any new environment variables to the parent cmd.exe process that were set in the powershell child process.\n#>\n[CmdletBinding(SupportsShouldProcess=$true)]\nParam(\n    [Parameter(Mandatory=$true, Position=1)]\n    $Variables,\n    [string[]]$PrependPath\n)\n\nif ($Variables.Count -eq 0) {\n    return $true\n}\n\n$cmdInstructions = !$env:TF_BUILD -and !$env:GITHUB_ACTIONS -and !$env:CmdEnvScriptPath -and ($env:PS1UnderCmd -eq '1')\nif ($cmdInstructions) {\n    Write-Warning \"Environment variables have been set that will be lost because you're running under cmd.exe\"\n    Write-Host \"Environment variables that must be set manually:\" -ForegroundColor Blue\n} else {\n    Write-Host \"Environment variables set:\" -ForegroundColor Blue\n    Write-Host ($Variables | Out-String)\n    if ($PrependPath) {\n        Write-Host \"Paths prepended to PATH: $PrependPath\"\n    }\n}\n\nif ($env:TF_BUILD) {\n    Write-Host \"Azure Pipelines detected. Logging commands will be used to propagate environment variables and prepend path.\"\n}\n\nif ($env:GITHUB_ACTIONS) {\n    Write-Host \"GitHub Actions detected. Logging commands will be used to propagate environment variables and prepend path.\"\n}\n\n$CmdEnvScript = ''\n$Variables.GetEnumerator() |% {\n    Set-Item -LiteralPath env:$($_.Key) -Value $_.Value\n\n    # If we're running in a cloud CI, set these environment variables so they propagate.\n    if ($env:TF_BUILD) {\n        Write-Host \"##vso[task.setvariable variable=$($_.Key);]$($_.Value)\"\n    }\n    if ($env:GITHUB_ACTIONS) {\n        Add-Content -LiteralPath $env:GITHUB_ENV -Value \"$($_.Key)=$($_.Value)\"\n    }\n\n    if ($cmdInstructions) {\n        Write-Host \"SET $($_.Key)=$($_.Value)\"\n    }\n\n    $CmdEnvScript += \"SET $($_.Key)=$($_.Value)`r`n\"\n}\n\n$pathDelimiter = ';'\nif ($IsMacOS -or $IsLinux) {\n    $pathDelimiter = ':'\n}\n\nif ($PrependPath) {\n    $PrependPath |% {\n        $newPathValue = \"$_$pathDelimiter$env:PATH\"\n        Set-Item -LiteralPath env:PATH -Value $newPathValue\n        if ($cmdInstructions) {\n            Write-Host \"SET PATH=$newPathValue\"\n        }\n\n        if ($env:TF_BUILD) {\n            Write-Host \"##vso[task.prependpath]$_\"\n        }\n        if ($env:GITHUB_ACTIONS) {\n            Add-Content -LiteralPath $env:GITHUB_PATH -Value $_\n        }\n\n        $CmdEnvScript += \"SET PATH=$_$pathDelimiter%PATH%\"\n    }\n}\n\nif ($env:CmdEnvScriptPath) {\n    if (Test-Path $env:CmdEnvScriptPath) {\n        $CmdEnvScript = (Get-Content -LiteralPath $env:CmdEnvScriptPath) + $CmdEnvScript\n    }\n\n    Set-Content -LiteralPath $env:CmdEnvScriptPath -Value $CmdEnvScript\n}\n\nreturn !$cmdInstructions\n"
  },
  {
    "path": "tools/artifacts/APIScanInputs.ps1",
    "content": "$inputs = & \"$PSScriptRoot/symbols.ps1\"\n\nif (!$inputs) { return }\n\n# Filter out specific files that target OS's that are not subject to APIScan.\n# Files that are subject but are not supported must be scanned and an SEL exception filed.\n$outputs = @{}\n$forbiddenSubPaths = @(\n    , 'linux-*'\n    , 'osx*'\n)\n\n$inputs.GetEnumerator() | % {\n    $list = $_.Value | ? {\n        $path = $_.Replace('\\', '/')\n        return !($forbiddenSubPaths | ? { $path -like \"*/$_/*\" })\n    }\n    $outputs[$_.Key] = $list\n}\n\n\n$outputs\n"
  },
  {
    "path": "tools/artifacts/LocBin.ps1",
    "content": "# Identify LCE files and the binary files they describe\n$BinRoot = [System.IO.Path]::GetFullPath(\"$PSScriptRoot\\..\\..\\bin\")\nif (!(Test-Path $BinRoot))  { return }\n\n$FilesToCopy = @()\n$FilesToCopy += Get-ChildItem -Recurse -File -Path $BinRoot |? { $_.FullName -match '\\\\Localize\\\\' }\n\nGet-ChildItem -rec \"$BinRoot\\*.lce\" -File | % {\n    $FilesToCopy += $_\n    $FilesToCopy += $_.FullName.SubString(0, $_.FullName.Length - 4)\n}\n\n$FilesToCopy += Get-ChildItem -rec \"$BinRoot\\*.lcg\" -File | % { [xml](Get-Content $_) } | % { $_.lcx.name }\n\n@{\n    \"$BinRoot\" = $FilesToCopy;\n}\n"
  },
  {
    "path": "tools/artifacts/VSInsertion.ps1",
    "content": "# This artifact captures everything needed to insert into VS (NuGet packages, insertion metadata, etc.)\n\n[CmdletBinding()]\nParam (\n)\n\nif ($IsMacOS -or $IsLinux) {\n    # We only package up for insertions on Windows agents since they are where optprof can happen.\n    Write-Verbose \"Skipping VSInsertion artifact since we're not on Windows.\"\n    return @{}\n}\n\n$RepoRoot = [System.IO.Path]::GetFullPath(\"$PSScriptRoot\\..\\..\")\n$BuildConfiguration = $env:BUILDCONFIGURATION\nif (!$BuildConfiguration) {\n    $BuildConfiguration = 'Debug'\n}\n\n$PackagesRoot = \"$RepoRoot/bin/Packages/$BuildConfiguration\"\n$NuGetPackages = \"$PackagesRoot/NuGet\"\n$VsixPackages = \"$PackagesRoot/Vsix\"\n$AzurePipelinesPath = \"$RepoRoot/azure-pipelines\"\nif ($env:BUILD_ARTIFACTSTAGINGDIRECTORY) {\n     $InsertionOutputs = Join-Path $env:BUILD_ARTIFACTSTAGINGDIRECTORY 'InsertionOutputs'\n}\n\nif (!(Test-Path $NuGetPackages) -and !(Test-Path $VsixPackages)) {\n    Write-Warning \"Skipping because NuGet and VSIX packages haven't been built yet.\"\n    return @{}\n}\n\n$result = @{\n    \"$AzurePipelinesPath\" = (Get-ChildItem \"$AzurePipelinesPath/vs-insertion-script.ps1\");\n    \"$NuGetPackages\" = (Get-ChildItem $NuGetPackages -Recurse);\n}\n\nif (Test-Path $VsixPackages) {\n    $result[\"$PackagesRoot\"] += Get-ChildItem $VsixPackages -Recurse\n}\n\nif ($InsertionOutputs -and $env:PROFILINGINPUTSPROPSNAME) {\n    $InsertionOutputsProfilingInputs = Join-Path $InsertionOutputs $env:PROFILINGINPUTSPROPSNAME\n    if (Test-Path -LiteralPath $InsertionOutputsProfilingInputs) {\n        $result[$InsertionOutputs] = Get-ChildItem -LiteralPath $InsertionOutputsProfilingInputs # OptProf ProfilingInputs\n    }\n}\n\n$result\n"
  },
  {
    "path": "tools/artifacts/Variables.ps1",
    "content": "# This artifact captures all variables defined in the ..\\variables folder.\n# It \"snaps\" the values of these variables where we can compute them during the build,\n# and otherwise captures the scripts to run later during an Azure Pipelines environment release.\n\n$RepoRoot = [System.IO.Path]::GetFullPath(\"$PSScriptRoot/../..\")\n$ArtifactBasePath = \"$RepoRoot/obj/_artifacts\"\n$VariablesArtifactPath = Join-Path $ArtifactBasePath variables\nif (-not (Test-Path $VariablesArtifactPath)) { New-Item -ItemType Directory -Path $VariablesArtifactPath | Out-Null }\n\n# Copy variables, either by value if the value is calculable now, or by script\nGet-ChildItem \"$PSScriptRoot/../variables\" |% {\n    $value = $null\n    if (-not $_.BaseName.StartsWith('_')) { # Skip trying to interpret special scripts\n        # First check the environment variables in case the variable was set in a queued build\n        # Always use all caps for env var access because Azure Pipelines converts variables to upper-case for env vars,\n        # and on non-Windows env vars are case sensitive.\n        $envVarName = $_.BaseName.ToUpper()\n        if (Test-Path env:$envVarName) {\n            $value = Get-Content \"env:$envVarName\"\n        }\n\n        # If that didn't give us anything, try executing the script right now from its original position\n        if (-not $value) {\n            $value = & $_.FullName\n        }\n\n        if ($value) {\n            # We got something, so wrap it with quotes so it's treated like a literal value.\n            $value = \"'\" + $value.Replace(\"'\", \"''\") + \"'\"\n        }\n    }\n\n    # If that didn't get us anything, just copy the script itself\n    if (-not $value) {\n        $value = Get-Content -LiteralPath $_.FullName\n    }\n\n    Set-Content -LiteralPath \"$VariablesArtifactPath/$($_.Name)\" -Value $value\n}\n\n@{\n    \"$VariablesArtifactPath\" = (Get-ChildItem $VariablesArtifactPath -Recurse);\n}\n"
  },
  {
    "path": "tools/artifacts/_all.ps1",
    "content": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n    This script returns all the artifacts that should be collected after a build.\n    Each powershell artifact is expressed as an object with these properties:\n      Source          - the full path to the source file\n      ArtifactName    - the name of the artifact to upload to\n      ContainerFolder - the relative path within the artifact in which the file should appear\n    Each artifact aggregating .ps1 script should return a hashtable:\n      Key = path to the directory from which relative paths within the artifact should be calculated\n      Value = an array of paths (absolute or relative to the BaseDirectory) to files to include in the artifact.\n              FileInfo objects are also allowed.\n.PARAMETER Force\n    Executes artifact scripts even if they have already been staged.\n#>\n\n[CmdletBinding(SupportsShouldProcess = $true)]\nparam (\n    [string]$ArtifactNameSuffix,\n    [switch]$Force\n)\n\nFunction EnsureTrailingSlash($path) {\n    if ($path.length -gt 0 -and !$path.EndsWith('\\') -and !$path.EndsWith('/')) {\n        $path = $path + [IO.Path]::DirectorySeparatorChar\n    }\n\n    $path.Replace('\\', [IO.Path]::DirectorySeparatorChar)\n}\n\nFunction Test-ArtifactStaged($artifactName) {\n    $varName = \"ARTIFACTSTAGED_$($artifactName.ToUpper())\"\n    Test-Path \"env:$varName\"\n}\n\nGet-ChildItem \"$PSScriptRoot\\*.ps1\" -Exclude \"_*\" -Recurse | % {\n    $ArtifactName = $_.BaseName\n    if ($Force -or !(Test-ArtifactStaged($ArtifactName + $ArtifactNameSuffix))) {\n        $totalFileCount = 0\n        Write-Verbose \"Collecting file list for artifact $($_.BaseName)\"\n        $fileGroups = & $_\n        if ($fileGroups) {\n            $fileGroups.GetEnumerator() | % {\n                $BaseDirectory = New-Object Uri ((EnsureTrailingSlash $_.Key.ToString()), [UriKind]::Absolute)\n                $_.Value | ? { $_ } | % {\n                    if ($_.GetType() -eq [IO.FileInfo] -or $_.GetType() -eq [IO.DirectoryInfo]) {\n                        $_ = $_.FullName\n                    }\n\n                    $artifact = New-Object -TypeName PSObject\n                    Add-Member -InputObject $artifact -MemberType NoteProperty -Name ArtifactName -Value $ArtifactName\n\n                    $SourceFullPath = New-Object Uri ($BaseDirectory, $_)\n                    Add-Member -InputObject $artifact -MemberType NoteProperty -Name Source -Value $SourceFullPath.LocalPath\n\n                    $RelativePath = [Uri]::UnescapeDataString($BaseDirectory.MakeRelative($SourceFullPath))\n                    Add-Member -InputObject $artifact -MemberType NoteProperty -Name ContainerFolder -Value (Split-Path $RelativePath)\n\n                    Write-Output $artifact\n                    $totalFileCount += 1\n                }\n            }\n        }\n\n        if ($totalFileCount -eq 0) {\n            Write-Warning \"No files found for the `\"$ArtifactName`\" artifact.\"\n        }\n    } else {\n        Write-Host \"Skipping $ArtifactName because it has already been staged.\" -ForegroundColor DarkGray\n    }\n}\n"
  },
  {
    "path": "tools/artifacts/_stage_all.ps1",
    "content": "<#\n.SYNOPSIS\n    This script links all the artifacts described by _all.ps1\n    into a staging directory, reading for uploading to a cloud build artifact store.\n    It returns a sequence of objects with Name and Path properties.\n#>\n\n[CmdletBinding()]\nparam (\n    [string]$ArtifactNameSuffix,\n    [switch]$AvoidSymbolicLinks\n)\n\n$ArtifactStagingFolder = & \"$PSScriptRoot/../Get-ArtifactsStagingDirectory.ps1\" -CleanIfLocal\n\nfunction Create-SymbolicLink {\n    param (\n        $Link,\n        $Target\n    )\n\n    if ($Link -eq $Target) {\n        return\n    }\n\n    if (Test-Path $Link) { Remove-Item $Link }\n    $LinkContainer = Split-Path $Link -Parent\n    if (!(Test-Path $LinkContainer)) { mkdir $LinkContainer }\n    if ($IsMacOS -or $IsLinux) {\n        ln $Target $Link | Out-Null\n    } else {\n        cmd /c \"mklink `\"$Link`\" `\"$Target`\"\" | Out-Null\n    }\n\n    if ($LASTEXITCODE -ne 0) {\n        # Windows requires admin privileges to create symbolic links\n        # unless Developer Mode has been enabled.\n        throw \"Failed to create symbolic link at $Link that points to $Target\"\n    }\n}\n\n# Stage all artifacts\n$Artifacts = & \"$PSScriptRoot\\_all.ps1\" -ArtifactNameSuffix $ArtifactNameSuffix\n$Artifacts |% {\n    $DestinationFolder = [System.IO.Path]::GetFullPath(\"$ArtifactStagingFolder/$($_.ArtifactName)$ArtifactNameSuffix/$($_.ContainerFolder)\").TrimEnd('\\')\n    $Name = \"$(Split-Path $_.Source -Leaf)\"\n\n    #Write-Host \"$($_.Source) -> $($_.ArtifactName)\\$($_.ContainerFolder)\" -ForegroundColor Yellow\n\n    if (-not (Test-Path $DestinationFolder)) { New-Item -ItemType Directory -Path $DestinationFolder | Out-Null }\n    if (Test-Path -PathType Leaf $_.Source) { # skip folders\n        $TargetPath = Join-Path $DestinationFolder $Name\n        if ($AvoidSymbolicLinks) {\n            Copy-Item -LiteralPath $_.Source -Destination $TargetPath\n        } else {\n            Create-SymbolicLink -Link $TargetPath -Target $_.Source\n        }\n    }\n}\n\n$ArtifactNames = $Artifacts |% { \"$($_.ArtifactName)$ArtifactNameSuffix\" }\n$ArtifactNames += Get-ChildItem env:ARTIFACTSTAGED_* |% {\n    # Return from ALLCAPS to the actual capitalization used for the artifact.\n    $artifactNameAllCaps = \"$($_.Name.Substring('ARTIFACTSTAGED_'.Length))\"\n    (Get-ChildItem $ArtifactStagingFolder\\$artifactNameAllCaps* -Filter $artifactNameAllCaps).Name\n}\n$ArtifactNames | Get-Unique |% {\n    $artifact = New-Object -TypeName PSObject\n    Add-Member -InputObject $artifact -MemberType NoteProperty -Name Name -Value $_\n    Add-Member -InputObject $artifact -MemberType NoteProperty -Name Path -Value (Join-Path $ArtifactStagingFolder $_)\n    Write-Output $artifact\n}\n"
  },
  {
    "path": "tools/artifacts/build_logs.ps1",
    "content": "$ArtifactStagingFolder = & \"$PSScriptRoot/../Get-ArtifactsStagingDirectory.ps1\"\n\nif (!(Test-Path $ArtifactStagingFolder/build_logs)) { return }\n\n@{\n    \"$ArtifactStagingFolder/build_logs\" = (Get-ChildItem -Recurse \"$ArtifactStagingFolder/build_logs\")\n}\n"
  },
  {
    "path": "tools/artifacts/coverageResults.ps1",
    "content": "$RepoRoot = Resolve-Path \"$PSScriptRoot\\..\\..\"\n\n$coverageFilesUnderRoot = @(Get-ChildItem \"$RepoRoot/*.cobertura.xml\" -Recurse | Where-Object {$_.FullName -notlike \"*/In/*\"  -and $_.FullName -notlike \"*\\In\\*\" })\n\n# Under MTP, coverage files are written directly to the artifacts output directory,\n# so we need to look there too.\n$ArtifactStagingFolder = & \"$PSScriptRoot/../Get-ArtifactsStagingDirectory.ps1\"\n$directTestLogs = Join-Path $ArtifactStagingFolder test_logs\n$coverageFilesUnderArtifacts = if (Test-Path $directTestLogs) { @(Get-ChildItem \"$directTestLogs/*.cobertura.xml\" -Recurse) } else { @() }\n\n# Prepare code coverage reports for merging on another machine\nWrite-Host \"Substituting $repoRoot with `\"{reporoot}`\"\"\n@($coverageFilesUnderRoot + $coverageFilesUnderArtifacts) |? { $_ }|% {\n    $content = Get-Content -LiteralPath $_ |% { $_ -Replace [regex]::Escape($repoRoot), \"{reporoot}\" }\n    Set-Content -LiteralPath $_ -Value $content -Encoding UTF8\n}\n\nif (!((Test-Path $RepoRoot\\bin) -and (Test-Path $RepoRoot\\obj))) { return }\n\n@{\n    $directTestLogs = $coverageFilesUnderArtifacts;\n    $RepoRoot = (\n        $coverageFilesUnderRoot +\n        (Get-ChildItem \"$RepoRoot\\obj\\*.cs\" -Recurse)\n    );\n}\n"
  },
  {
    "path": "tools/artifacts/deployables.ps1",
    "content": "$RepoRoot = [System.IO.Path]::GetFullPath(\"$PSScriptRoot\\..\\..\")\n$BuildConfiguration = $env:BUILDCONFIGURATION\nif (!$BuildConfiguration) {\n    $BuildConfiguration = 'Debug'\n}\n\n$PackagesRoot = \"$RepoRoot/bin/Packages/$BuildConfiguration\"\n\nif (!(Test-Path $PackagesRoot))  { return }\n\n@{\n    \"$PackagesRoot\" = (Get-ChildItem $PackagesRoot -Recurse)\n}\n"
  },
  {
    "path": "tools/artifacts/projectAssetsJson.ps1",
    "content": "$ObjRoot = [System.IO.Path]::GetFullPath(\"$PSScriptRoot\\..\\..\\obj\")\n\nif (!(Test-Path $ObjRoot)) { return }\n\n@{\n    \"$ObjRoot\" = (\n        (Get-ChildItem \"$ObjRoot\\project.assets.json\" -Recurse)\n    );\n}\n"
  },
  {
    "path": "tools/artifacts/symbols.ps1",
    "content": "$BinPath = [System.IO.Path]::GetFullPath(\"$PSScriptRoot/../../bin\")\n$ExternalPath = [System.IO.Path]::GetFullPath(\"$PSScriptRoot/../../obj/SymbolsPackages\")\nif (!(Test-Path $BinPath)) { return }\n$symbolfiles = & \"$PSScriptRoot/../Get-SymbolFiles.ps1\" -Path $BinPath | Get-Unique\n$ExternalFiles = & \"$PSScriptRoot/../Get-ExternalSymbolFiles.ps1\"\n\n@{\n    \"$BinPath\" = $SymbolFiles;\n    \"$ExternalPath\" = $ExternalFiles;\n}\n"
  },
  {
    "path": "tools/artifacts/testResults.ps1",
    "content": "[CmdletBinding()]\nParam(\n)\n\n$result = @{}\n\n$RepoRoot = Resolve-Path \"$PSScriptRoot\\..\\..\"\n$testRoot = Join-Path $RepoRoot test\n$result[$testRoot] = (Get-ChildItem \"$testRoot\\TestResults\" -Recurse -Directory | Get-ChildItem -Recurse -File)\n\n$artifactStaging = & \"$PSScriptRoot/../Get-ArtifactsStagingDirectory.ps1\"\n$testlogsPath = Join-Path $artifactStaging \"test_logs\"\nif (Test-Path $testlogsPath) {\n    $result[$testlogsPath] = Get-ChildItem $testlogsPath -Recurse;\n}\n\n$result\n"
  },
  {
    "path": "tools/artifacts/test_symbols.ps1",
    "content": "$BinPath = [System.IO.Path]::GetFullPath(\"$PSScriptRoot/../../bin\")\nif (!(Test-Path $BinPath)) { return }\n$symbolfiles = & \"$PSScriptRoot/../Get-SymbolFiles.ps1\" -Path $BinPath -Tests | Get-Unique\n\n@{\n    \"$BinPath\" = $SymbolFiles;\n}\n"
  },
  {
    "path": "tools/dotnet-test-cloud.ps1",
    "content": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n    Runs tests as they are run in cloud test runs.\n.PARAMETER Configuration\n    The configuration within which to run tests\n.PARAMETER Agent\n    The name of the agent. This is used in preparing test run titles.\n.PARAMETER PublishResults\n    A switch to publish results to Azure Pipelines.\n.PARAMETER x86\n    A switch to run the tests in an x86 process.\n.PARAMETER dotnet32\n    The path to a 32-bit dotnet executable to use.\n#>\n[CmdletBinding()]\nParam(\n  [string]$Configuration = 'Debug',\n  [string]$Agent = 'Local',\n  [switch]$PublishResults,\n  [switch]$x86,\n  [string]$dotnet32\n)\n\n$RepoRoot = (Resolve-Path \"$PSScriptRoot/..\").Path\n$ArtifactStagingFolder = & \"$PSScriptRoot/Get-ArtifactsStagingDirectory.ps1\"\n$OnCI = ($env:CI -or $env:TF_BUILD)\n\n$dotnet = 'dotnet'\nif ($x86) {\n  $x86RunTitleSuffix = \", x86\"\n  if ($dotnet32) {\n    $dotnet = $dotnet32\n  }\n  else {\n    $dotnet32Possibilities = \"$PSScriptRoot\\../obj/tools/x86/.dotnet/dotnet.exe\", \"$env:AGENT_TOOLSDIRECTORY/x86/dotnet/dotnet.exe\", \"${env:ProgramFiles(x86)}\\dotnet\\dotnet.exe\"\n    $dotnet32Matches = $dotnet32Possibilities | ? { Test-Path $_ }\n    if ($dotnet32Matches) {\n      $dotnet = Resolve-Path @($dotnet32Matches)[0]\n      Write-Host \"Running tests using `\"$dotnet`\"\" -ForegroundColor DarkGray\n    }\n    else {\n      Write-Error \"Unable to find 32-bit dotnet.exe\"\n      return 1\n    }\n  }\n}\n\n$testBinLog = Join-Path $ArtifactStagingFolder (Join-Path build_logs test.binlog)\n$testLogs = Join-Path $ArtifactStagingFolder test_logs\n\n$globalJson = Get-Content $PSScriptRoot/../global.json | ConvertFrom-Json\n$isMTP = $globalJson.test.runner -eq 'Microsoft.Testing.Platform'\n$extraArgs = @()\n$failedTests = 0\n\nif ($isMTP) {\n    if ($OnCI) { $extraArgs += '--no-progress' }\n\n    $dumpSwitches = @(\n        ,'--hangdump'\n        ,'--hangdump-timeout','120s'\n        ,'--crashdump'\n    )\n    $mtpArgs = @(\n        ,'--coverage'\n        ,'--coverage-output-format','cobertura'\n        ,'--diagnostic'\n        ,'--diagnostic-output-directory',$testLogs\n        ,'--diagnostic-verbosity','Information'\n        ,'--results-directory',$testLogs\n        ,'--report-trx'\n    )\n\n    & $dotnet test \"$RepoRoot\\test\" `\n        --no-build `\n        -c $Configuration `\n        -bl:\"$testBinLog\" `\n        --filter-not-trait 'TestCategory=FailsInCloudTest' `\n        --coverage-settings \"$PSScriptRoot/test.runsettings\" `\n        @mtpArgs `\n        @dumpSwitches `\n        @extraArgs\n    if ($LASTEXITCODE -ne 0) { $failedTests += 1 }\n\n    $trxFiles = Get-ChildItem -Recurse -Path $testLogs\\*.trx\n} else {\n    $testDiagLog = Join-Path $ArtifactStagingFolder (Join-Path test_logs diag.log)\n    & $dotnet test \"$RepoRoot\\test\" `\n        --no-build `\n        -c $Configuration `\n        --filter \"TestCategory!=FailsInCloudTest\" `\n        --collect \"Code Coverage;Format=cobertura\" `\n        --settings \"$PSScriptRoot/test.runsettings\" `\n        --blame-hang-timeout 60s `\n        --blame-crash `\n        -bl:\"$testBinLog\" `\n        --diag \"$testDiagLog;TraceLevel=info\" `\n        --logger trx `\n        @extraArgs\n    if ($LASTEXITCODE -ne 0) { $failedTests += 1 }\n\n    $trxFiles = Get-ChildItem -Recurse -Path $RepoRoot\\test\\*.trx\n}\n\n$unknownCounter = 0\n$trxFiles |% {\n  New-Item $testLogs -ItemType Directory -Force | Out-Null\n  if (!($_.FullName.StartsWith($testLogs, [StringComparison]::OrdinalIgnoreCase))) {\n    Copy-Item $_ -Destination $testLogs\n  }\n\n  if ($PublishResults) {\n    $x = [xml](Get-Content -LiteralPath $_)\n    $runTitle = $null\n    if ($x.TestRun.TestDefinitions -and $x.TestRun.TestDefinitions.GetElementsByTagName('UnitTest')) {\n      $storage = $x.TestRun.TestDefinitions.GetElementsByTagName('UnitTest')[0].storage -replace '\\\\','/'\n      if ($storage -match '/(?<tfm>net[^/]+)/(?:(?<rid>[^/]+)/)?(?<lib>[^/]+)\\.(dll|exe)$') {\n        if ($matches.rid) {\n          $runTitle = \"$($matches.lib) ($($matches.tfm), $($matches.rid), $Agent)\"\n        }\n        else {\n          $runTitle = \"$($matches.lib) ($($matches.tfm)$x86RunTitleSuffix, $Agent)\"\n        }\n      }\n    }\n    if (!$runTitle) {\n      $unknownCounter += 1;\n      $runTitle = \"unknown$unknownCounter ($Agent$x86RunTitleSuffix)\";\n    }\n\n    Write-Host \"##vso[results.publish type=VSTest;runTitle=$runTitle;publishRunAttachments=true;resultFiles=$_;failTaskOnFailedTests=true;testRunSystem=VSTS - PTR;]\"\n  }\n}\n\nif ($failedTests -ne 0) {\n    exit $failedTests\n}\n"
  },
  {
    "path": "tools/publish-CodeCov.ps1",
    "content": "<#\n.SYNOPSIS\n    Uploads code coverage to codecov.io\n.PARAMETER CodeCovToken\n    Code coverage token to use\n.PARAMETER PathToCodeCoverage\n    Path to root of code coverage files\n.PARAMETER Name\n    Name to upload with codecoverge\n.PARAMETER Flags\n    Flags to upload with codecoverge\n#>\n[CmdletBinding()]\nParam (\n    [Parameter(Mandatory=$true)]\n    [string]$CodeCovToken,\n    [Parameter(Mandatory=$true)]\n    [string]$PathToCodeCoverage,\n    [string]$Name,\n    [string]$Flags\n)\n\n$RepoRoot = (Resolve-Path \"$PSScriptRoot/..\").Path\n\nGet-ChildItem -Recurse -LiteralPath $PathToCodeCoverage -Filter \"*.cobertura.xml\" | % {\n    $relativeFilePath = Resolve-Path -relative $_.FullName\n\n    Write-Host \"Uploading: $relativeFilePath\" -ForegroundColor Yellow\n    & (& \"$PSScriptRoot/Get-CodeCovTool.ps1\") -t $CodeCovToken -f $relativeFilePath -R $RepoRoot -F $Flags -n $Name\n}\n"
  },
  {
    "path": "tools/test.runsettings",
    "content": "<RunSettings>\n  <DataCollectionRunSettings>\n    <DataCollectors>\n      <DataCollector friendlyName=\"Code Coverage\" uri=\"datacollector://Microsoft/CodeCoverage/2.0\" assemblyQualifiedName=\"Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a\">\n        <Configuration>\n          <CodeCoverage>\n            <ModulePaths>\n              <Include>\n                <ModulePath>\\.dll$</ModulePath>\n                <ModulePath>\\.exe$</ModulePath>\n              </Include>\n              <Exclude>\n                <ModulePath>xunit\\..*</ModulePath>\n              </Exclude>\n            </ModulePaths>\n            <Attributes>\n              <Exclude>\n                <Attribute>^System\\.Diagnostics\\.DebuggerHiddenAttribute$</Attribute>\n                <Attribute>^System\\.Diagnostics\\.DebuggerNonUserCodeAttribute$</Attribute>\n                <Attribute>^System\\.CodeDom\\.Compiler\\.GeneratedCodeAttribute$</Attribute>\n                <Attribute>^System\\.Diagnostics\\.CodeAnalysis\\.ExcludeFromCodeCoverageAttribute$</Attribute>\n              </Exclude>\n            </Attributes>\n            <!-- We recommend you do not change the following values: -->\n            <!-- Set this to True to collect coverage information for functions marked with the \"SecuritySafeCritical\" attribute. Instead of writing directly into a memory location from such functions, code coverage inserts a probe that redirects to another function, which in turns writes into memory. -->\n            <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>\n            <!-- When set to True, collects coverage information from child processes that are launched with low-level ACLs, for example, UWP apps. -->\n            <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>\n            <!-- When set to True, collects coverage information from child processes that are launched by test or production code. -->\n            <CollectFromChildProcesses>True</CollectFromChildProcesses>\n            <!-- When set to True, restarts the IIS process and collects coverage information from it. -->\n            <CollectAspDotNet>False</CollectAspDotNet>\n            <!-- When set to True, static native instrumentation will be enabled. -->\n            <EnableStaticNativeInstrumentation>False</EnableStaticNativeInstrumentation>\n            <!-- When set to True, dynamic native instrumentation will be enabled. -->\n            <EnableDynamicNativeInstrumentation>False</EnableDynamicNativeInstrumentation>\n            <!-- When set to True, instrumented binaries on disk are removed and original files are restored. -->\n            <EnableStaticNativeInstrumentationRestore>True</EnableStaticNativeInstrumentationRestore>\n          </CodeCoverage>\n        </Configuration>\n      </DataCollector>\n    </DataCollectors>\n  </DataCollectionRunSettings>\n</RunSettings>\n"
  },
  {
    "path": "tools/variables/BusinessGroupName.ps1",
    "content": "'Visual Studio - VS Core'\n"
  },
  {
    "path": "tools/variables/DotNetSdkVersion.ps1",
    "content": "$globalJson = Get-Content -LiteralPath \"$PSScriptRoot\\..\\..\\global.json\" | ConvertFrom-Json\n$globalJson.sdk.version\n"
  },
  {
    "path": "tools/variables/InsertJsonValues.ps1",
    "content": "$vstsDropNames = & \"$PSScriptRoot\\VstsDropNames.ps1\"\n$BuildConfiguration = $env:BUILDCONFIGURATION\nif (!$BuildConfiguration) {\n    $BuildConfiguration = 'Debug'\n}\n\n$BasePath = \"$PSScriptRoot\\..\\..\\bin\\Packages\\$BuildConfiguration\\Vsix\"\n\nif (Test-Path $BasePath) {\n    $vsmanFiles = @()\n    Get-ChildItem $BasePath *.vsman -Recurse -File | % {\n        $version = (Get-Content $_.FullName | ConvertFrom-Json).info.buildVersion\n        $fullPath = (Resolve-Path $_.FullName).Path\n        $basePath = (Resolve-Path $BasePath).Path\n        # Cannot use RelativePath or GetRelativePath due to Powershell Core v2.0 limitation\n        if ($fullPath.StartsWith($basePath, [StringComparison]::OrdinalIgnoreCase)) {\n            # Get the relative paths then make sure the directory separators match URL format.\n            $rfn = $fullPath.Substring($basePath.Length).TrimStart('\\', '/').Replace('\\', '/')\n        }\n        else {\n            $rfn = $fullPath  # fallback to full path if it doesn't start with base path\n        }\n\n        $fn = $_.Name\n\n        # The left side is filename followed by the version and the right side is the drop url and the relative filename\n        $thisVsManFile = \"$fn{$version}=https://vsdrop.corp.microsoft.com/file/v1/$vstsDropNames;$rfn\"\n        $vsmanFiles += $thisVsManFile\n    }\n\n    [string]::join(',', $vsmanFiles)\n}\n"
  },
  {
    "path": "tools/variables/InsertPropsValues.ps1",
    "content": "$InsertedPkgs = (& \"$PSScriptRoot\\..\\artifacts\\VSInsertion.ps1\")\n\n$icv=@()\nforeach ($kvp in $InsertedPkgs.GetEnumerator()) {\n    $kvp.Value |% {\n        if ($_.Name -match \"^(.*?)\\.(\\d+\\.\\d+\\.\\d+(?:\\.\\d+)?(?:-.*?)?)(?:\\.symbols)?\\.nupkg$\") {\n            $id = $Matches[1]\n            $version = $Matches[2]\n            $icv += \"$id=$version\"\n        }\n    }\n}\n\nWrite-Output ([string]::join(',',$icv))\n"
  },
  {
    "path": "tools/variables/InsertTargetBranch.ps1",
    "content": "# This is the default branch of the VS repo that we will use to insert into VS.\n'main'\n"
  },
  {
    "path": "tools/variables/InsertVersionsValues.ps1",
    "content": "# When you need binding redirects in the VS repo updated to match\n# assemblies that you build here, remove the \"return\" statement\n# and update the hashtable below with the T4 macro you'll use for\n# your libraries as defined in the src\\ProductData\\AssemblyVersions.tt file.\nreturn\n\n$MacroName = 'LibraryNoDotsVersion'\n$SampleProject = \"$PSScriptRoot\\..\\..\\src\\LibraryName\"\n[string]::join(',',(@{\n    ($MacroName) = & { (dotnet nbgv get-version --project $SampleProject --format json | ConvertFrom-Json).AssemblyVersion };\n}.GetEnumerator() |% { \"$($_.key)=$($_.value)\" }))\n"
  },
  {
    "path": "tools/variables/LocLanguages.ps1",
    "content": "## For faster PR/CI builds localize only for 2 languages, ENU and JPN provide good enough coverage\nif ($env:BUILD_REASON -eq 'PullRequest') {\n  'ENU,JPN'\n} else {\n  'VS'\n}\n"
  },
  {
    "path": "tools/variables/ProfilingInputsDropName.ps1",
    "content": "if ($env:SYSTEM_TEAMPROJECT) {\n    \"ProfilingInputs/$env:SYSTEM_TEAMPROJECT/$env:BUILD_REPOSITORY_NAME/$env:BUILD_SOURCEBRANCHNAME/$env:BUILD_BUILDID\"\n} else {\n    Write-Warning \"No Azure Pipelines build detected. No Azure Pipelines drop name will be computed.\"\n}\n"
  },
  {
    "path": "tools/variables/ProfilingInputsPropsName.ps1",
    "content": "if ($env:SYSTEM_TEAMPROJECT) {\n    $repoName = $env:BUILD_REPOSITORY_NAME.Replace('/', '.')\n    \"$env:SYSTEM_TEAMPROJECT.$repoName.props\"\n} else {\n    Write-Warning \"No Azure Pipelines build detected. No profiling inputs filename will be computed.\"\n}\n"
  },
  {
    "path": "tools/variables/SymbolsFeatureName.ps1",
    "content": "'slow-cheetah'\n"
  },
  {
    "path": "tools/variables/VstsDropNames.ps1",
    "content": "\"Products/$env:SYSTEM_TEAMPROJECT/$env:BUILD_REPOSITORY_NAME/$env:BUILD_SOURCEBRANCHNAME/$env:BUILD_BUILDID\"\n"
  },
  {
    "path": "tools/variables/_all.ps1",
    "content": "#!/usr/bin/env pwsh\n\n<#\n.SYNOPSIS\n    This script returns a hashtable of build variables that should be set\n    at the start of a build or release definition's execution.\n#>\n\n[CmdletBinding(SupportsShouldProcess = $true)]\nparam (\n)\n\n$vars = @{}\n\nGet-ChildItem \"$PSScriptRoot\\*.ps1\" -Exclude \"_*\" |% {\n    Write-Host \"Computing $($_.BaseName) variable\"\n    $vars[$_.BaseName] = & $_\n}\n\n$vars\n"
  },
  {
    "path": "tools/variables/_define.ps1",
    "content": "<#\n.SYNOPSIS\n    This script translates the variables returned by the _all.ps1 script\n    into commands that instruct Azure Pipelines to actually set those variables for other pipeline tasks to consume.\n\n    The build or release definition may have set these variables to override\n    what the build would do. So only set them if they have not already been set.\n#>\n\n[CmdletBinding()]\nparam (\n)\n\n(& \"$PSScriptRoot\\_all.ps1\").GetEnumerator() |% {\n    # Always use ALL CAPS for env var names since Azure Pipelines converts variable names to all caps and on non-Windows OS, env vars are case sensitive.\n    $keyCaps = $_.Key.ToUpper()\n    if ((Test-Path \"env:$keyCaps\") -and (Get-Content \"env:$keyCaps\")) {\n        Write-Host \"Skipping setting $keyCaps because variable is already set to '$(Get-Content env:$keyCaps)'.\" -ForegroundColor Cyan\n    } else {\n        Write-Host \"$keyCaps=$($_.Value)\" -ForegroundColor Yellow\n        if ($env:TF_BUILD) {\n            # Create two variables: the first that can be used by its simple name and accessible only within this job.\n            Write-Host \"##vso[task.setvariable variable=$keyCaps]$($_.Value)\"\n            # and the second that works across jobs and stages but must be fully qualified when referenced.\n            Write-Host \"##vso[task.setvariable variable=$keyCaps;isOutput=true]$($_.Value)\"\n        } elseif ($env:GITHUB_ACTIONS) {\n            Add-Content -LiteralPath $env:GITHUB_ENV -Value \"$keyCaps=$($_.Value)\"\n        }\n        Set-Item -LiteralPath \"env:$keyCaps\" -Value $_.Value\n    }\n}\n"
  },
  {
    "path": "version.json",
    "content": "{\n  \"$schema\": \"https://raw.githubusercontent.com/AArnott/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json\",\n  \"version\": \"4.0\",\n  \"publicReleaseRefSpec\": [\n    \"^refs/heads/master$\", // we release out of master\n  ],\n  \"cloudBuild\": {\n    \"buildNumber\": {\n      \"enabled\": true\n    }\n  }\n}\n"
  }
]