diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000000..cab8e6cebec
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.rc diff
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 00000000000..d88b900d042
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,37 @@
+---
+name: Bug report
+about: Report errors or unexpected behavior
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+
+
+# Environment
+
+```
+Windows build number: [run "ver" at a command prompt]
+PowerToys version:
+PowerToy module for which you are reporting the bug (if applicable):
+```
+
+# Steps to reproduce
+
+
+
+# Expected behavior
+
+
+
+# Actual behavior
+
+
+
+# Screenshots
+
+
diff --git a/.github/ISSUE_TEMPLATE/documentation-issue.md b/.github/ISSUE_TEMPLATE/documentation-issue.md
new file mode 100644
index 00000000000..39e6e5599c9
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/documentation-issue.md
@@ -0,0 +1,10 @@
+---
+name: Documentation Issue
+about: Report issues in our documentation
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 00000000000..66a856efe00
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,21 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+# Summary of the new feature/enhancement
+
+
+
+# Proposed technical implementation details (optional)
+
+
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 00000000000..e61d054d878
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,19 @@
+
+## Summary of the Pull Request
+
+
+## References
+
+
+## PR Checklist
+* [ ] Closes #xxx
+* [ ] CLA signed. If not, go over [here](https://cla.opensource.microsoft.com/microsoft/PowerToys) and sign the CLA
+* [ ] Tests added/passed
+* [ ] Requires documentation to be updated
+* [ ] I've discussed this with core contributors already. If not checked, I'm ready to accept this work might be rejected in favor of a different grand plan. Issue number where discussion took place: #xxx
+
+
+## Detailed Description of the Pull Request / Additional comments
+
+
+## Validation Steps Performed
diff --git a/.pipelines/build.cmd b/.pipelines/build.cmd
new file mode 100644
index 00000000000..632efb6e8db
--- /dev/null
+++ b/.pipelines/build.cmd
@@ -0,0 +1,2 @@
+cd /D "%~dp0"
+dotnet build --no-restore ..\PowerToys.sln || exit /b 1
diff --git a/.pipelines/pipeline.user.windows.yml b/.pipelines/pipeline.user.windows.yml
new file mode 100644
index 00000000000..d6c8a243594
--- /dev/null
+++ b/.pipelines/pipeline.user.windows.yml
@@ -0,0 +1,43 @@
+environment:
+ host:
+ os: 'windows'
+ flavor: 'server'
+ version: '2016'
+ runtime:
+ provider: 'appcontainer'
+ image: 'cdpxwinrs4test.azurecr.io/global/vse2017u7-external-azsdk-mobile-ext-win1803:latest-nodetools'
+ source_mode: 'link'
+
+signing_options:
+ profile: 'azure'
+
+package_sources:
+ nuget:
+ feeds:
+ 'Toolset': 'https://msazure.pkgs.visualstudio.com/_packaging/Toolset/nuget/v3/index.json'
+ 'CloudES-CDP': 'https://cloudes.pkgs.visualstudio.com/_packaging/CDP/nuget/v3/index.json'
+ 'CloudES-Internal': 'https://cloudes.pkgs.visualstudio.com/_packaging/Internal/nuget/v3/index.json'
+ 'MsNugetMirror': 'https://msazure.pkgs.visualstudio.com/_packaging/MsNugetMirror/nuget/v3/index.json'
+ 'NugetMirror': 'https://msazure.pkgs.visualstudio.com/_packaging/NugetMirror/nuget/v3/index.json'
+ 'CorextMirror': 'https://msazure.pkgs.visualstudio.com/_packaging/CorextMirror/nuget/v3/index.json'
+ 'Official': 'https://msazure.pkgs.visualstudio.com/_packaging/Official/nuget/v3/index.json'
+ 'Toolset': 'https://msazure.pkgs.visualstudio.com/_packaging/Toolset/nuget/v3/index.json'
+ 'AzureCXP': 'https://msazure.pkgs.visualstudio.com/_packaging/AzureCXP/nuget/v3/index.json'
+
+restore:
+ commands:
+ - !!defaultcommand
+ name: 'Restore CSharp'
+ command: '.pipelines\restore.cmd'
+
+build:
+ commands:
+ - !!buildcommand
+ name: 'Build CSharp'
+ command: '.pipelines\build.cmd'
+ artifacts:
+ - from: '**\bin'
+ to: 'Build_Output'
+ include:
+ - '**/*'
+
diff --git a/.pipelines/restore.cmd b/.pipelines/restore.cmd
new file mode 100644
index 00000000000..3a9d719a4eb
--- /dev/null
+++ b/.pipelines/restore.cmd
@@ -0,0 +1,3 @@
+cd /D "%~dp0"
+
+dotnet restore ..\PowerToys.sln || exit /b 1
diff --git a/License.rtf b/License.rtf
new file mode 100644
index 00000000000..204a30d029b
Binary files /dev/null and b/License.rtf differ
diff --git a/PowerToys.sln b/PowerToys.sln
new file mode 100644
index 00000000000..19190ff9ac5
--- /dev/null
+++ b/PowerToys.sln
@@ -0,0 +1,120 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.28803.452
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "runner", "src\runner\runner.vcxproj", "{9412D5C6-2CF2-4FC2-A601-B55508EA9B27}"
+ ProjectSection(ProjectDependencies) = postProject
+ {48804216-2A0E-4168-A6D8-9CD068D14227} = {48804216-2A0E-4168-A6D8-9CD068D14227}
+ {74485049-C722-400F-ABE5-86AC52D929B3} = {74485049-C722-400F-ABE5-86AC52D929B3}
+ {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA} = {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}
+ {07C389E3-6BC8-41CF-923E-307B1265FA2D} = {07C389E3-6BC8-41CF-923E-307B1265FA2D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "common", "src\common\common.vcxproj", "{74485049-C722-400F-ABE5-86AC52D929B3}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "shortcut_guide", "src\modules\shortcut_guide\shortcut_guide.vcxproj", "{A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example_powertoy", "src\modules\example_powertoy\example_powertoy.vcxproj", "{44CC9375-3E6E-4D99-8913-7FB748807EBD}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "modules", "modules", "{4574FDD0-F61D-4376-98BF-E5A1262C11EC}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "interface", "interface", "{3BB8493E-D18E-4485-A320-CB40F90F55AE}"
+ ProjectSection(SolutionItems) = preProject
+ src\modules\interface\lowlevel_keyboard_event_data.h = src\modules\interface\lowlevel_keyboard_event_data.h
+ src\modules\interface\powertoy_module_interface.h = src\modules\interface\powertoy_module_interface.h
+ src\modules\interface\win_hook_event_data.h = src\modules\interface\win_hook_event_data.h
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "settings", "src\editor\settings.vcxproj", "{07C389E3-6BC8-41CF-923E-307B1265FA2D}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fancyzones", "fancyzones", "{D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FancyZonesLib", "src\modules\fancyzones\lib\FancyZonesLib.vcxproj", "{F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fancyzones", "src\modules\fancyzones\dll\FancyZonesModule.vcxproj", "{48804216-2A0E-4168-A6D8-9CD068D14227}"
+ ProjectSection(ProjectDependencies) = postProject
+ {5CCC8468-DEC8-4D36-99D4-5C891BEBD481} = {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests-FancyZones", "src\modules\fancyzones\tests\UnitTests\UnitTests.vcxproj", "{9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cpprestsdk", "deps\cpprestsdk\cpprestsdk.vcxproj", "{4E577735-DFAB-41AF-8A6E-B6E8872A2928}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "deps", "deps", "{1FAF749F-0D6F-4BF5-A563-31A4B5279D27}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{1AFB6476-670D-4E80-A464-657E01DFF482}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UnitTests-CommonLib", "src\common\UnitTests-CommonLib\UnitTests-CommonLib.vcxproj", "{1A066C63-64B3-45F8-92FE-664E1CCE8077}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FancyZonesEditor", "src\modules\fancyzones\editor\FancyZonesEditor\FancyZonesEditor.csproj", "{5CCC8468-DEC8-4D36-99D4-5C891BEBD481}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|x64 = Debug|x64
+ Release|x64 = Release|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|x64.ActiveCfg = Debug|x64
+ {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|x64.Build.0 = Debug|x64
+ {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|x64.ActiveCfg = Release|x64
+ {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|x64.Build.0 = Release|x64
+ {74485049-C722-400F-ABE5-86AC52D929B3}.Debug|x64.ActiveCfg = Debug|x64
+ {74485049-C722-400F-ABE5-86AC52D929B3}.Debug|x64.Build.0 = Debug|x64
+ {74485049-C722-400F-ABE5-86AC52D929B3}.Release|x64.ActiveCfg = Release|x64
+ {74485049-C722-400F-ABE5-86AC52D929B3}.Release|x64.Build.0 = Release|x64
+ {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Debug|x64.ActiveCfg = Debug|x64
+ {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Debug|x64.Build.0 = Debug|x64
+ {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Release|x64.ActiveCfg = Release|x64
+ {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA}.Release|x64.Build.0 = Release|x64
+ {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Debug|x64.ActiveCfg = Debug|x64
+ {44CC9375-3E6E-4D99-8913-7FB748807EBD}.Release|x64.ActiveCfg = Release|x64
+ {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Debug|x64.ActiveCfg = Debug|x64
+ {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Debug|x64.Build.0 = Debug|x64
+ {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Release|x64.ActiveCfg = Release|x64
+ {07C389E3-6BC8-41CF-923E-307B1265FA2D}.Release|x64.Build.0 = Release|x64
+ {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|x64.ActiveCfg = Debug|x64
+ {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|x64.Build.0 = Debug|x64
+ {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|x64.ActiveCfg = Release|x64
+ {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|x64.Build.0 = Release|x64
+ {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|x64.ActiveCfg = Debug|x64
+ {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|x64.Build.0 = Debug|x64
+ {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|x64.ActiveCfg = Release|x64
+ {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|x64.Build.0 = Release|x64
+ {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|x64.ActiveCfg = Debug|x64
+ {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|x64.Build.0 = Debug|x64
+ {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x64.ActiveCfg = Release|x64
+ {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x64.Build.0 = Release|x64
+ {4E577735-DFAB-41AF-8A6E-B6E8872A2928}.Debug|x64.ActiveCfg = Debug|x64
+ {4E577735-DFAB-41AF-8A6E-B6E8872A2928}.Debug|x64.Build.0 = Debug|x64
+ {4E577735-DFAB-41AF-8A6E-B6E8872A2928}.Release|x64.ActiveCfg = Release|x64
+ {4E577735-DFAB-41AF-8A6E-B6E8872A2928}.Release|x64.Build.0 = Release|x64
+ {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x64.ActiveCfg = Debug|x64
+ {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x64.Build.0 = Debug|x64
+ {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|x64.ActiveCfg = Release|x64
+ {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|x64.Build.0 = Release|x64
+ {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|x64.ActiveCfg = Debug|x64
+ {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|x64.Build.0 = Debug|x64
+ {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|x64.ActiveCfg = Release|x64
+ {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|x64.Build.0 = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(NestedProjects) = preSolution
+ {74485049-C722-400F-ABE5-86AC52D929B3} = {1AFB6476-670D-4E80-A464-657E01DFF482}
+ {A46629C4-1A6C-40FA-A8B6-10E5102BB0BA} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
+ {44CC9375-3E6E-4D99-8913-7FB748807EBD} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
+ {3BB8493E-D18E-4485-A320-CB40F90F55AE} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
+ {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC}
+ {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}
+ {48804216-2A0E-4168-A6D8-9CD068D14227} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}
+ {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}
+ {4E577735-DFAB-41AF-8A6E-B6E8872A2928} = {1FAF749F-0D6F-4BF5-A563-31A4B5279D27}
+ {1A066C63-64B3-45F8-92FE-664E1CCE8077} = {1AFB6476-670D-4E80-A464-657E01DFF482}
+ {5CCC8468-DEC8-4D36-99D4-5C891BEBD481} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD}
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0}
+ EndGlobalSection
+EndGlobal
diff --git a/README.md b/README.md
index e61df461949..adeaa3b0e81 100644
--- a/README.md
+++ b/README.md
@@ -1,62 +1,107 @@
-
-# Overview
-
-PowerToys is a set of utilities for power users to tune and streamline their Windows experience for greater productivity.
-
-Inspired by the [Windows 95 era PowerToys project](https://en.wikipedia.org/wiki/Microsoft_PowerToys), this reboot provides power users with ways to squeeze more efficiency out of the Windows 10 shell and customize it for individual workflows. A great overview of the Windows 95 PowerToys can be found [here](https://socket3.wordpress.com/2016/10/22/using-windows-95-powertoys/).
-
-The first preview of these utilities and corresponding source code will be released Summer 2019.
-
-![logo](Logo.jpg)
-
-# What's Happening
-
-## June Update
-Since the announcement of the PowerToys reboot at BUILD, the interest in the project has been incredible to see. Due to the excitement we are optimizing the first preview to make it easy to integrate new utilities into the repo. We also have two interns working on additional PowerToys. The specs for these are:
-
-* [Process terminate tool](https://github.com/indierawk2k2/PowerToys-1/blob/master/specs/Terminate%20Spec.md)
-* [Batch file renamer](https://github.com/indierawk2k2/PowerToys-1/blob/master/specs/File%20Classification%20Spec.md)
-* [Animated gif screen recorder](https://github.com/indierawk2k2/PowerToys-1/blob/master/specs/GIF%20Maker%20Spec.md)
-
-Finally, we are organizing a team to productize an internal window manager into the PowerToys project for the 2019 [One Week Hackathon](https://www.onmsft.com/news/take-a-peek-inside-microsofts-recent-one-week-hackathon).
-
-We are still targeting to release the preview and code during Summer 2019.
-
-## The first two utilities we're working on are:
-
-1. Maximize to new desktop widget - The MTND widget shows a pop-up button when a user hovers over the maximize / restore button on any window. Clicking it creates a new desktop, sends the app to that desktop and maximizes the app on the new desktop.
-
-![Maximize to new desktop widget](MTNDWidget.jpg)
-
-2. Windows key shortcut guide - The shortcut guide appears when a user holds the Windows key down for more than one second and shows the available shortcuts for the current state of the desktop.
-
-![Windows key shortcut guide](WindowsKeyShortcutGuide.jpg)
-
-# Backlog
-
-Here's the current set of utilities we're considering. Please use issues and +1's to guide the project to suggest new ideas and help us prioritize the list below.
-
-1. [Full window manager including specific layouts for docking and undocking laptops](https://github.com/microsoft/PowerToys/issues/4)
-2. [Keyboard shortcut manager](https://github.com/microsoft/PowerToys/issues/6)
-3. [Win+R replacement](https://github.com/microsoft/PowerToys/issues/44)
-4. Better Alt+Tab including browser tab integration and search for running apps
-5. [Battery tracker](https://github.com/microsoft/PowerToys/issues/7)
-6. [Batch file re-namer](https://github.com/microsoft/PowerToys/issues/101)
-7. [Quick resolution swaps in taskbar](https://github.com/microsoft/PowerToys/issues/27)
-8. Mouse events without focus
-9. Cmd (or PS or Bash) from here
-10. Contents menu file browsing
-
-# Contributing
-
-This project welcomes contributions and suggestions. Most contributions require you to agree to a
-Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us
-the rights to use your contribution. For details, visit https://cla.microsoft.com.
-
-When you submit a pull request, a CLA-bot will automatically determine whether you need to provide
-a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
-provided by the bot. You will only need to do this once across all repos using our CLA.
-
-This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/).
-For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or
-contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
+# Overview
+
+PowerToys is a set of utilities for power users to tune and streamline their Windows experience for greater productivity.
+
+Inspired by the [Windows 95 era PowerToys project](https://en.wikipedia.org/wiki/Microsoft_PowerToys), this reboot provides power users with ways to squeeze more efficiency out of the Windows 10 shell and customize it for individual workflows. A great overview of the Windows 95 PowerToys can be found [here](https://socket3.wordpress.com/2016/10/22/using-windows-95-powertoys/).
+
+The first preview of these utilities can be installed from [here](https://github.com/Microsoft/powertoys/releases).
+
+![logo](doc/images/Logo.jpg)
+
+# What's Happening
+
+## September Update
+The first preview release of the PowerToys utilities and source code is now live! This release includes two preview quality utilities as well as the tools and docs to make it easy to create new PowerToys utilities.
+
+1. [FancyZones](/src/modules/fancyzones/) - FancyZones is a window manager that makes it easy to create copmlex window layouts and quickly position windows into those layouts. The FancyZones backlog can be found [here](https://github.com/Microsoft/PowerToys/tree/master/doc/planning/FancyZonesBacklog.md)
+
+![FancyZones](src/modules/fancyzones/FancyZones.png)
+
+FanzyZones Video Tutorial
+[![FancyZones Video Tutorial](doc/images/FZTutorial.jpg)](https://www.youtube.com/watch?v=rTtGzZYAXgY)
+
+2. [Windows key shortcut guide](/src/modules/shortcut_guide) - The shortcut guide appears when a user holds the Windows key down for more than one second and shows the available shortcuts for the current state of the desktop. The shortcut guide backlog can be found [here](https://github.com/Microsoft/PowerToys/tree/master/doc/planning/ShortcutGuideBacklog.md)
+
+![Windows key shortcut guide](doc/images/WindowsKeyShortcutGuide.jpg)
+
+Additional utilities in the pipeline are:
+
+* Maximize to new desktop widget - The MTND widget shows a pop-up button when a user hovers over the maximize / restore button on any window. Clicking it creates a new desktop, sends the app to that desktop and maximizes the app on the new desktop.
+* [Process terminate tool](https://github.com/indierawk2k2/PowerToys-1/blob/master/specs/Terminate%20Spec.md)
+* [Batch file renamer](https://github.com/indierawk2k2/PowerToys-1/blob/master/specs/File%20Classification%20Spec.md)
+* [Animated gif screen recorder](https://github.com/indierawk2k2/PowerToys-1/blob/master/specs/GIF%20Maker%20Spec.md)
+
+# Backlog
+
+The full backlog of utilities can be found [here](https://github.com/Microsoft/PowerToys/tree/master/doc/planning/PowerToysBacklog.md)
+
+# Where to download PowerToys
+
+ The latest release of PowerToys can be downloaded from https://github.com/microsoft/PowerToys/releases
+ Click on `Assets` to show the files available in the release and then click on `PowerToysSetup.msi` to download the PowerToys installer.
+ PDB symbols for the release are available in a separate zip file `PDB symbols.zip`.
+
+# Developer Guidance
+
+## Build Prerequisites
+ * Windows 10 1803 (build 10.0.17134.0) or above in order to build and run PowerToys.
+ * Visual Studio 2019 Community edition or higher, with the 'Desktop Development with C++' component and the Windows 10 SDK version 10.0.18362.0 or higher.
+
+## Building the Code
+ * Open `powertoys.sln` in Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` or `Debug`, from the `Build` menu choose `Build Solution`.
+ * The PowerToys binaries will be located in your repo under `x64\Release`.
+ * If you want to copy the `PowerToys.exe` binary to a different location, you'll also need to copy the `modules` and the `svgs` folders.
+
+## Prerequisites to Build the Installer
+ * Install the [WiX Toolset Visual Studio 2019 Extension](https://marketplace.visualstudio.com/items?itemName=RobMensching.WiXToolset).
+ * Install the [WiX Toolset build tools](https://wixtoolset.org/releases/).
+
+## Building the .msi Installer
+ * From the `installer` folder open `PowerToysSetup.sln` in Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` or `Debug`, from the `Build` menu choose `Build Solution`.
+ * The resulting `PowerToysSetup.msi` installer will be available in the `installer\PowerToysSetup\x64\Release\` folder.
+
+## Debugging
+ The following configuration issue only applies if the user is a member of the Administrators group.
+
+ Some PowerToys modules require to run with the highest permission level if the current user is a member of the Administrators group. The highest permission level is required in order to be able to perform some actions when an elevated application (e.g. Task Manager) is in the foreground or is the target of an action. Without elevated privileges some PowerToys modules will still work but with some limitations:
+ - the `FancyZones` module will be not be able to move an elevated window to a zone.
+ - the `Shortcut Guide` module will not appear if the foreground window belongs to an elevated application.
+
+ In order to run and debug PowerToys from Visual Studio when the user is a member of the Administrators group, Visual Studio has to be started with elevated privileges. If you want to avoid running Visual Studio with elevated privileges and don't mind the limitations described above, you can do the following: open the `runner` project properties and navigate to the `Linker -> Manifest File` settings, edit the `UAC Execution Level` property and change it from `highestAvailable (/level='highestAvailable')` to `asInvoker (/level='asInvoker')`, save the changes.
+
+## How to create new PowerToys
+
+See the instructions on [how to install the PowerToys Module project template](tools/project_template).
+Specifications for the [PowerToys settings API](doc/specs/PowerToys-settings.md).
+
+## Coding Guidance
+
+Please review these brief docs below relating to our coding standards etc.
+
+> 👉 If you find something missing from these docs, feel free to contribute to any of our documentation files anywhere in the repository (or make some new ones\!)
+
+This is a work in progress as we learn what we'll need to provide people in order to be effective contributors to our project.
+- [Coding Style](doc/coding/style.md)
+- [Code Organization](doc/coding/organization.md)
+
+# Contributing
+This project welcomes contributions and suggestions and we are excited to work with the power user community to build a set of tools for helping you get the most our of Windows.
+
+We ask that **before you start work on a feature that you would like to contribute**, please read our [Contributor's Guide](contributing.md). We will be happy to work with you to figure out the best approach, provide guidance and mentorship throughout feature development, and help avoid any wasted or duplicate effort.
+
+> ⚠ **Note**: PowerToys is still a nascent project and the team is actively working out of this repository. We will be periodically re-structuring the code to make it easier to comprehend, navigate, build, test, and contribute to, so **DO expect significant changes to code layout on a regular basis**.
+
+> ⚠ **License Info**: Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. For details, visit https://cla.microsoft.com.
+
+When you submit a pull request, a CLA-bot will automatically determine whether you need to provide
+a CLA and decorate the PR appropriately (e.g., label, comment). Simply follow the instructions
+provided by the bot. You will only need to do this once across all repos using our CLA.
+
+# Code of Conduct
+
+This project has adopted the [Microsoft Open Source Code of Conduct][conduct-code].
+For more information see the [Code of Conduct FAQ][conduct-FAQ] or contact [opencode@microsoft.com][conduct-email] with any additional questions or comments.
+
+[conduct-code]: https://opensource.microsoft.com/codeofconduct/
+[conduct-FAQ]: https://opensource.microsoft.com/codeofconduct/faq/
+[conduct-email]: mailto:opencode@microsoft.com
diff --git a/build/pipelines/ci.yml b/build/pipelines/ci.yml
new file mode 100644
index 00000000000..85b915c48ca
--- /dev/null
+++ b/build/pipelines/ci.yml
@@ -0,0 +1,24 @@
+trigger:
+ batch: true
+ branches:
+ include:
+ - master
+ paths:
+ exclude:
+ - doc/*
+ - temp/*
+ - tools/*
+
+pr:
+ branches:
+ include:
+ - master
+
+# 0.0.yyMM.dd##
+# 0.0.1904.0900
+name: 0.0.$(Date:yyMM).$(Date:dd)$(Rev:rr)
+
+jobs:
+ - template: ./templates/build-powertoys-ci.yml
+ parameters:
+ platform: x64
diff --git a/build/pipelines/templates/build-powertoys-ci.yml b/build/pipelines/templates/build-powertoys-ci.yml
new file mode 100644
index 00000000000..bfffbea6f86
--- /dev/null
+++ b/build/pipelines/templates/build-powertoys-ci.yml
@@ -0,0 +1,17 @@
+parameters:
+ configuration: 'Release'
+ platform: ''
+ additionalBuildArguments: ''
+
+jobs:
+- job: Build${{ parameters.platform }}${{ parameters.configuration }}
+ displayName: Build ${{ parameters.platform }} ${{ parameters.configuration }}
+ variables:
+ BuildConfiguration: ${{ parameters.configuration }}
+ BuildPlatform: ${{ parameters.platform }}
+ pool: { vmImage: windows-2019 }
+
+ steps:
+ - template: build-powertoys-steps.yml
+ parameters:
+ additionalBuildArguments: ${{ parameters.additionalBuildArguments }}
\ No newline at end of file
diff --git a/build/pipelines/templates/build-powertoys-steps.yml b/build/pipelines/templates/build-powertoys-steps.yml
new file mode 100644
index 00000000000..f13df444dcd
--- /dev/null
+++ b/build/pipelines/templates/build-powertoys-steps.yml
@@ -0,0 +1,35 @@
+parameters:
+ additionalBuildArguments: ''
+
+steps:
+- checkout: self
+ submodules: true
+ clean: true
+
+- task: NuGetToolInstaller@0
+ displayName: Ensure NuGet 4.8.1
+ inputs:
+ versionSpec: 4.8.1
+
+- task: VisualStudioTestPlatformInstaller@1
+ displayName: Ensure VSTest Platform
+
+- task: NuGetCommand@2
+ displayName: Restore NuGet packages
+ inputs:
+ command: restore
+ feedsToUse: config
+ configPath: NuGet.config
+ restoreSolution: PowerToys.sln
+ restoreDirectory: '$(Build.SourcesDirectory)\packages'
+
+- task: VSBuild@1
+ displayName: 'Build solution **\PowerToys.sln'
+ inputs:
+ solution: '**\PowerToys.sln'
+ vsVersion: 15.0
+ platform: '$(BuildPlatform)'
+ configuration: '$(BuildConfiguration)'
+ msbuildArgs: ${{ parameters.additionalBuildArguments }}
+ clean: true
+ maximumCpuCount: true
diff --git a/contributing.md b/contributing.md
new file mode 100644
index 00000000000..948c823af03
--- /dev/null
+++ b/contributing.md
@@ -0,0 +1,128 @@
+# Power Toys Contributor's Guide
+
+Below is our guidance for how to report issues, propose new features, and submit contributions via Pull Requests (PRs).
+
+## Before you start, file an issue
+
+Please follow this simple rule to help us eliminate any unnecessary wasted effort & frustration, and ensure an efficient and effective use of everyone's time - yours, ours, and other community members':
+
+> 👉 If you have a question, think you've discovered an issue, would like to propose a new feature, etc., then find/file an issue **BEFORE** starting work to fix/implement it.
+
+### Search existing issues first
+
+Before filing a new issue, search existing open and closed issues first: It is likely someone else has found the problem you're seeing, and someone may be working on or have already contributed a fix!
+
+If no existing item describes your issue/feature, great - please file a new issue:
+
+### File a new Issue
+
+* Don't know whether you're reporting an issue or requesting a feature? File an issue
+* Have a question that you don't see answered in docs, videos, etc.? File an issue
+* Want to know if we're planning on building a particular feature? File an issue
+* Got a great idea for a new utility or feature? File an issue/request/idea
+* Don't understand how to do something? File an issue/Community Guidance Request
+* Found an existing issue that describes yours? Great - upvote and add additional commentary / info / repro-steps / etc.
+
+### Complete the template
+
+**Please include as much information as possible in your issue**. The more information you provide, the more likely your issue/ask will be understood and implemented. Helpful information includes:
+
+* What device you're running (inc. CPU type, memory, disk, etc.)
+* What build of Windows your device is running
+
+ 👉 Tip: Run the following in PowerShell Core
+
+ ```powershell
+ C:\> $PSVersionTable.OS
+ Microsoft Windows 10.0.18909
+ ```
+
+ ... or in Windows PowerShell
+
+ ```powershell
+ C:\> $PSVersionTable.BuildVersion
+
+ Major Minor Build Revision
+ ----- ----- ----- --------
+ 10 0 18912 1001
+ ```
+
+ ... or Cmd:
+
+ ```cmd
+ C:\> ver
+
+ Microsoft Windows [Version 10.0.18900.1001]
+ ```
+
+* What tools and apps you're using (e.g. VS 2019, VSCode, etc.)
+* Don't assume we're experts in setting up YOUR environment and don't assume we are experts in YOUR workflow. Teach us to help you!
+* **We LOVE detailed repro steps!** What steps do we need to take to reproduce the issue? Assume we love to read repro steps. As much detail as you can stand is probably _barely_ enough detail for us!
+* Prefer error message text where possible or screenshots of errors if text cannot be captured
+* **If you intend to implement the fix/feature yourself then say so!** If you do not indicate otherwise we will assume that the issue is our to solve, or may label the issue as `Help-Wanted`.
+
+### DO NOT post "+1" comments
+
+> ⚠ DO NOT post "+1", "me too", or similar comments - they just add noise to an issue.
+
+If you don't have any additional info/context to add but would like to indicate that you're affected by the issue, upvote the original issue by clicking its [+😊] button and hitting 👍 (+1) icon. This way we can actually measure how impactful an issue is.
+
+---
+
+## Contributing fixes / features
+
+For those able & willing to help fix issues and/or implement features ...
+
+### To Spec or not to Spec
+
+Some issues/features may be quick and simple to describe and understand. For such scenarios, once a team member has agreed with your approach, skip ahead to the section headed "Fork, Branch, and Create your PR", below.
+
+Small issues that do not require a spec will be labelled Issue-Bug or Issue-Task.
+
+However, some issues/features will require careful thought & formal design before implementation. For these scenarios, we'll request that a spec is written and the associated issue will be labeled Issue-Feature.
+
+Specs help collaborators discuss different approaches to solve a problem, describe how the feature will behave, how the feature will impact the user, what happens if something goes wrong, etc. Driving towards agreement in a spec, before any code is written, often results in simpler code, and less wasted effort in the long run.
+
+Specs will be managed in a very similar manner as code contributions so please follow the "Fork, Branch and Create your PR" below.
+
+### Writing / Contributing-to a Spec
+
+To write/contribute to a spec: fork, branch and commit via PRs, as you would with any code changes.
+
+Specs are written in markdown, stored under the `doc/specs` folder and named `[issue id] - [spec description].md`.
+
+👉 **It is important to follow the spec templates and complete the requested information**. The available spec templates will help ensure that specs contain the minimum information & decisions necessary to permit development to begin. In particular, specs require you to confirm that you've already discussed the issue/idea with the team in an issue and that you provide the issue ID for reference.
+
+Team members will be happy to help review specs and guide them to completion.
+
+### Help Wanted
+
+Once the team have approved an issue/spec, development can proceed. If no developers are immediately available, the spec can be parked ready for a developer to get started. Parked specs' issues will be labeled "Help Wanted". To find a list of development opportunities waiting for developer involvement, visit the Issues and filter on [the Help-Wanted label](https://github.com/microsoft/PowerToys/labels/Help-Wanted).
+
+---
+
+## Development
+
+### Fork, Clone, Branch and Create your PR
+
+Once you've discussed your proposed feature/fix/etc. with a team member, and you've agreed an approach or a spec has been written and approved, it's time to start development:
+
+1. Fork the repo if you haven't already
+1. Clone your fork locally
+1. Create & push a feature branch
+1. Create a [Draft Pull Request (PR)](https://github.blog/2019-02-14-introducing-draft-pull-requests/)
+1. Work on your changes
+
+### Code Review
+
+When you'd like the team to take a look, (even if the work is not yet fully-complete), mark the PR as 'Ready For Review' so that the team can review your work and provide comments, suggestions, and request changes. It may take several cycles, but the end result will be solid, testable, conformant code that is safe for us to merge.
+
+### Merge
+
+Once your code has been reviewed and approved by the requisite number of team members, it will be merged into the master branch. Once merged, your PR will be automatically closed.
+
+---
+
+## Thank you
+
+Thank you in advance for your contribution!
diff --git a/deps/cpprestsdk/README.md b/deps/cpprestsdk/README.md
new file mode 100644
index 00000000000..e7eed0124e7
--- /dev/null
+++ b/deps/cpprestsdk/README.md
@@ -0,0 +1,12 @@
+# C++ Rest SDK - JSON library
+
+This JSON library is taken from the C++ REST SDK in https://github.com/microsoft/cpprestsdk
+
+Based in the [v2.10.13 release](https://github.com/microsoft/cpprestsdk/tree/v2.10.13/Release), it consists of the needed files to build and use the JSON classes described in `include/cpprest/json.h`.
+
+Changes made to the files in order to build in the PowerToys project:
+- Removal of `#include` references to files that are not needed.
+- `#include "pch.h"` instead of `#include "stdafx.h"` to use the PowerToys pre-compiled header.
+- `#define _NO_ASYNCRTIMP` in [`include/cpprest/details/cpprest_compat.h`](./include/cpprest/details/cpprest_compat.h) since this class will be statically linked.
+
+The contents of the C++ Rest SDK license are included in [license.txt](./license.txt).
diff --git a/deps/cpprestsdk/cpprestsdk.vcxproj b/deps/cpprestsdk/cpprestsdk.vcxproj
new file mode 100644
index 00000000000..26444752a8d
--- /dev/null
+++ b/deps/cpprestsdk/cpprestsdk.vcxproj
@@ -0,0 +1,121 @@
+
+
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 15.0
+ {4E577735-DFAB-41AF-8A6E-B6E8872A2928}
+ Win32Proj
+ common
+ 10.0
+ cpprestsdk
+
+
+
+ StaticLibrary
+ true
+ v142
+ Unicode
+
+
+ StaticLibrary
+ false
+ v142
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ false
+
+
+
+ Use
+ Level3
+ Disabled
+ true
+ _DEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ pch.h
+ stdcpplatest
+ MultiThreadedDebug
+ include;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+
+
+
+
+ Use
+ Level3
+ MaxSpeed
+ true
+ true
+ true
+ NDEBUG;_LIB;%(PreprocessorDefinitions)
+ true
+ stdcpplatest
+ pch.h
+ MultiThreaded
+ include;%(AdditionalIncludeDirectories)
+
+
+ Windows
+ true
+ true
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Create
+ Create
+
+
+
+
+
+
\ No newline at end of file
diff --git a/deps/cpprestsdk/include/cpprest/asyncrt_utils.h b/deps/cpprestsdk/include/cpprest/asyncrt_utils.h
new file mode 100644
index 00000000000..19880fa47c2
--- /dev/null
+++ b/deps/cpprestsdk/include/cpprest/asyncrt_utils.h
@@ -0,0 +1,697 @@
+/***
+ * Copyright (C) Microsoft. All rights reserved.
+ * Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
+ *
+ * =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
+ *
+ * Various common utilities.
+ *
+ * For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
+ *
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+ ****/
+
+#pragma once
+
+#include "cpprest/details/basic_types.h"
+//#include "pplx/pplxtasks.h"
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#ifndef _WIN32
+#include
+#if !defined(ANDROID) && !defined(__ANDROID__) && defined(HAVE_XLOCALE_H) // CodePlex 269
+/* Systems using glibc: xlocale.h has been removed from glibc 2.26
+ The above include of locale.h is sufficient
+ Further details: https://sourceware.org/git/?p=glibc.git;a=commit;h=f0be25b6336db7492e47d2e8e72eb8af53b5506d */
+#include
+#endif
+#endif
+
+/// Various utilities for string conversions and date and time manipulation.
+namespace utility
+{
+// Left over from VS2010 support, remains to avoid breaking.
+typedef std::chrono::seconds seconds;
+
+/// Functions for converting to/from std::chrono::seconds to xml string.
+namespace timespan
+{
+///
+/// Converts a timespan/interval in seconds to xml duration string as specified by
+/// http://www.w3.org/TR/xmlschema-2/#duration
+///
+_ASYNCRTIMP utility::string_t __cdecl seconds_to_xml_duration(utility::seconds numSecs);
+
+///
+/// Converts an xml duration to timespan/interval in seconds
+/// http://www.w3.org/TR/xmlschema-2/#duration
+///
+_ASYNCRTIMP utility::seconds __cdecl xml_duration_to_seconds(const utility::string_t& timespanString);
+} // namespace timespan
+
+/// Functions for Unicode string conversions.
+namespace conversions
+{
+///
+/// Converts a UTF-16 string to a UTF-8 string.
+///
+/// A two byte character UTF-16 string.
+/// A single byte character UTF-8 string.
+_ASYNCRTIMP std::string __cdecl utf16_to_utf8(const utf16string& w);
+
+///
+/// Converts a UTF-8 string to a UTF-16
+///
+/// A single byte character UTF-8 string.
+/// A two byte character UTF-16 string.
+_ASYNCRTIMP utf16string __cdecl utf8_to_utf16(const std::string& s);
+
+///
+/// Converts a ASCII (us-ascii) string to a UTF-16 string.
+///
+/// A single byte character us-ascii string.
+/// A two byte character UTF-16 string.
+_ASYNCRTIMP utf16string __cdecl usascii_to_utf16(const std::string& s);
+
+///
+/// Converts a Latin1 (iso-8859-1) string to a UTF-16 string.
+///
+/// A single byte character UTF-8 string.
+/// A two byte character UTF-16 string.
+_ASYNCRTIMP utf16string __cdecl latin1_to_utf16(const std::string& s);
+
+///
+/// Converts a Latin1 (iso-8859-1) string to a UTF-8 string.
+///
+/// A single byte character UTF-8 string.
+/// A single byte character UTF-8 string.
+_ASYNCRTIMP utf8string __cdecl latin1_to_utf8(const std::string& s);
+
+///
+/// Converts to a platform dependent Unicode string type.
+///
+/// A single byte character UTF-8 string.
+/// A platform dependent string type.
+#ifdef _UTF16_STRINGS
+_ASYNCRTIMP utility::string_t __cdecl to_string_t(std::string&& s);
+#else
+inline utility::string_t&& to_string_t(std::string&& s) { return std::move(s); }
+#endif
+
+///
+/// Converts to a platform dependent Unicode string type.
+///
+/// A two byte character UTF-16 string.
+/// A platform dependent string type.
+#ifdef _UTF16_STRINGS
+inline utility::string_t&& to_string_t(utf16string&& s) { return std::move(s); }
+#else
+_ASYNCRTIMP utility::string_t __cdecl to_string_t(utf16string&& s);
+#endif
+///
+/// Converts to a platform dependent Unicode string type.
+///
+/// A single byte character UTF-8 string.
+/// A platform dependent string type.
+#ifdef _UTF16_STRINGS
+_ASYNCRTIMP utility::string_t __cdecl to_string_t(const std::string& s);
+#else
+inline const utility::string_t& to_string_t(const std::string& s) { return s; }
+#endif
+
+///
+/// Converts to a platform dependent Unicode string type.
+///
+/// A two byte character UTF-16 string.
+/// A platform dependent string type.
+#ifdef _UTF16_STRINGS
+inline const utility::string_t& to_string_t(const utf16string& s) { return s; }
+#else
+_ASYNCRTIMP utility::string_t __cdecl to_string_t(const utf16string& s);
+#endif
+
+///
+/// Converts to a UTF-16 from string.
+///
+/// A single byte character UTF-8 string.
+/// A two byte character UTF-16 string.
+_ASYNCRTIMP utf16string __cdecl to_utf16string(const std::string& value);
+
+///
+/// Converts to a UTF-16 from string.
+///
+/// A two byte character UTF-16 string.
+/// A two byte character UTF-16 string.
+inline const utf16string& to_utf16string(const utf16string& value) { return value; }
+///
+/// Converts to a UTF-16 from string.
+///
+/// A two byte character UTF-16 string.
+/// A two byte character UTF-16 string.
+inline utf16string&& to_utf16string(utf16string&& value) { return std::move(value); }
+
+///
+/// Converts to a UTF-8 string.
+///
+/// A single byte character UTF-8 string.
+/// A single byte character UTF-8 string.
+inline std::string&& to_utf8string(std::string&& value) { return std::move(value); }
+
+///
+/// Converts to a UTF-8 string.
+///
+/// A single byte character UTF-8 string.
+/// A single byte character UTF-8 string.
+inline const std::string& to_utf8string(const std::string& value) { return value; }
+
+///
+/// Converts to a UTF-8 string.
+///
+/// A two byte character UTF-16 string.
+/// A single byte character UTF-8 string.
+_ASYNCRTIMP std::string __cdecl to_utf8string(const utf16string& value);
+
+///
+/// Encode the given byte array into a base64 string
+///
+_ASYNCRTIMP utility::string_t __cdecl to_base64(const std::vector& data);
+
+///
+/// Encode the given 8-byte integer into a base64 string
+///
+_ASYNCRTIMP utility::string_t __cdecl to_base64(uint64_t data);
+
+///
+/// Decode the given base64 string to a byte array
+///
+_ASYNCRTIMP std::vector __cdecl from_base64(const utility::string_t& str);
+
+template
+CASABLANCA_DEPRECATED("All locale-sensitive APIs will be removed in a future update. Use stringstreams directly if "
+ "locale support is required.")
+utility::string_t print_string(const Source& val, const std::locale& loc = std::locale())
+{
+ utility::ostringstream_t oss;
+ oss.imbue(loc);
+ oss << val;
+ if (oss.bad())
+ {
+ throw std::bad_cast();
+ }
+ return oss.str();
+}
+
+CASABLANCA_DEPRECATED("All locale-sensitive APIs will be removed in a future update. Use stringstreams directly if "
+ "locale support is required.")
+inline utility::string_t print_string(const utility::string_t& val) { return val; }
+
+namespace details
+{
+#if defined(__ANDROID__)
+template
+inline std::string to_string(const T t)
+{
+ std::ostringstream os;
+ os.imbue(std::locale::classic());
+ os << t;
+ return os.str();
+}
+#endif
+
+template
+inline utility::string_t to_string_t(const T t)
+{
+#ifdef _UTF16_STRINGS
+ using std::to_wstring;
+ return to_wstring(t);
+#else
+#if !defined(__ANDROID__)
+ using std::to_string;
+#endif
+ return to_string(t);
+#endif
+}
+
+template
+utility::string_t print_string(const Source& val)
+{
+ utility::ostringstream_t oss;
+ oss.imbue(std::locale::classic());
+ oss << val;
+ if (oss.bad())
+ {
+ throw std::bad_cast();
+ }
+ return oss.str();
+}
+
+inline const utility::string_t& print_string(const utility::string_t& val) { return val; }
+
+template
+utf8string print_utf8string(const Source& val)
+{
+ return conversions::to_utf8string(print_string(val));
+}
+inline const utf8string& print_utf8string(const utf8string& val) { return val; }
+
+template
+Target scan_string(const utility::string_t& str)
+{
+ Target t;
+ utility::istringstream_t iss(str);
+ iss.imbue(std::locale::classic());
+ iss >> t;
+ if (iss.bad())
+ {
+ throw std::bad_cast();
+ }
+ return t;
+}
+
+inline const utility::string_t& scan_string(const utility::string_t& str) { return str; }
+} // namespace details
+
+template
+CASABLANCA_DEPRECATED("All locale-sensitive APIs will be removed in a future update. Use stringstreams directly if "
+ "locale support is required.")
+Target scan_string(const utility::string_t& str, const std::locale& loc = std::locale())
+{
+ Target t;
+ utility::istringstream_t iss(str);
+ iss.imbue(loc);
+ iss >> t;
+ if (iss.bad())
+ {
+ throw std::bad_cast();
+ }
+ return t;
+}
+
+CASABLANCA_DEPRECATED("All locale-sensitive APIs will be removed in a future update. Use stringstreams directly if "
+ "locale support is required.")
+inline utility::string_t scan_string(const utility::string_t& str) { return str; }
+} // namespace conversions
+
+namespace details
+{
+///
+/// Cross platform RAII container for setting thread local locale.
+///
+class scoped_c_thread_locale
+{
+public:
+ _ASYNCRTIMP scoped_c_thread_locale();
+ _ASYNCRTIMP ~scoped_c_thread_locale();
+
+#if !defined(ANDROID) && !defined(__ANDROID__) // CodePlex 269
+#ifdef _WIN32
+ typedef _locale_t xplat_locale;
+#else
+ typedef locale_t xplat_locale;
+#endif
+
+ static _ASYNCRTIMP xplat_locale __cdecl c_locale();
+#endif
+private:
+#ifdef _WIN32
+ std::string m_prevLocale;
+ int m_prevThreadSetting;
+#elif !(defined(ANDROID) || defined(__ANDROID__))
+ locale_t m_prevLocale;
+#endif
+ scoped_c_thread_locale(const scoped_c_thread_locale&);
+ scoped_c_thread_locale& operator=(const scoped_c_thread_locale&);
+};
+
+///
+/// Our own implementation of alpha numeric instead of std::isalnum to avoid
+/// taking global lock for performance reasons.
+///
+inline bool __cdecl is_alnum(const unsigned char uch) CPPREST_NOEXCEPT
+{ // test if uch is an alnum character
+ // special casing char to avoid branches
+ // clang-format off
+ static CPPREST_CONSTEXPR bool is_alnum_table[UCHAR_MAX + 1] = {
+ /* X0 X1 X2 X3 X4 X5 X6 X7 X8 X9 XA XB XC XD XE XF */
+ /* 0X */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 1X */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 2X */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /* 3X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0-9 */
+ /* 4X */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* A-Z */
+ /* 5X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
+ /* 6X */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* a-z */
+ /* 7X */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0
+ /* non-ASCII values initialized to 0 */
+ };
+ // clang-format on
+ return (is_alnum_table[uch]);
+}
+
+///
+/// Our own implementation of alpha numeric instead of std::isalnum to avoid
+/// taking global lock for performance reasons.
+///
+inline bool __cdecl is_alnum(const char ch) CPPREST_NOEXCEPT { return (is_alnum(static_cast(ch))); }
+
+///
+/// Our own implementation of alpha numeric instead of std::isalnum to avoid
+/// taking global lock for performance reasons.
+///
+template
+inline bool __cdecl is_alnum(Elem ch) CPPREST_NOEXCEPT
+{
+ // assumes 'x' == L'x' for the ASCII range
+ typedef typename std::make_unsigned::type UElem;
+ const auto uch = static_cast(ch);
+ return (uch <= static_cast('z') && is_alnum(static_cast(uch)));
+}
+
+///
+/// Simplistic implementation of make_unique. A better implementation would be based on variadic templates
+/// and therefore not be compatible with Dev10.
+///
+template
+std::unique_ptr<_Type> make_unique()
+{
+ return std::unique_ptr<_Type>(new _Type());
+}
+
+template
+std::unique_ptr<_Type> make_unique(_Arg1&& arg1)
+{
+ return std::unique_ptr<_Type>(new _Type(std::forward<_Arg1>(arg1)));
+}
+
+template
+std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2)
+{
+ return std::unique_ptr<_Type>(new _Type(std::forward<_Arg1>(arg1), std::forward<_Arg2>(arg2)));
+}
+
+template
+std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2, _Arg3&& arg3)
+{
+ return std::unique_ptr<_Type>(
+ new _Type(std::forward<_Arg1>(arg1), std::forward<_Arg2>(arg2), std::forward<_Arg3>(arg3)));
+}
+
+template
+std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2, _Arg3&& arg3, _Arg4&& arg4)
+{
+ return std::unique_ptr<_Type>(new _Type(
+ std::forward<_Arg1>(arg1), std::forward<_Arg2>(arg2), std::forward<_Arg3>(arg3), std::forward<_Arg4>(arg4)));
+}
+
+template
+std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2, _Arg3&& arg3, _Arg4&& arg4, _Arg5&& arg5)
+{
+ return std::unique_ptr<_Type>(new _Type(std::forward<_Arg1>(arg1),
+ std::forward<_Arg2>(arg2),
+ std::forward<_Arg3>(arg3),
+ std::forward<_Arg4>(arg4),
+ std::forward<_Arg5>(arg5)));
+}
+
+template
+std::unique_ptr<_Type> make_unique(_Arg1&& arg1, _Arg2&& arg2, _Arg3&& arg3, _Arg4&& arg4, _Arg5&& arg5, _Arg6&& arg6)
+{
+ return std::unique_ptr<_Type>(new _Type(std::forward<_Arg1>(arg1),
+ std::forward<_Arg2>(arg2),
+ std::forward<_Arg3>(arg3),
+ std::forward<_Arg4>(arg4),
+ std::forward<_Arg5>(arg5),
+ std::forward<_Arg6>(arg6)));
+}
+
+///
+/// Cross platform utility function for performing case insensitive string equality comparison.
+///
+/// First string to compare.
+/// Second strong to compare.
+/// true if the strings are equivalent, false otherwise
+_ASYNCRTIMP bool __cdecl str_iequal(const std::string& left, const std::string& right) CPPREST_NOEXCEPT;
+
+///
+/// Cross platform utility function for performing case insensitive string equality comparison.
+///
+/// First string to compare.
+/// Second strong to compare.
+/// true if the strings are equivalent, false otherwise
+_ASYNCRTIMP bool __cdecl str_iequal(const std::wstring& left, const std::wstring& right) CPPREST_NOEXCEPT;
+
+///
+/// Cross platform utility function for performing case insensitive string less-than comparison.
+///
+/// First string to compare.
+/// Second strong to compare.
+/// true if a lowercase view of left is lexicographically less than a lowercase view of right; otherwise,
+/// false.
+_ASYNCRTIMP bool __cdecl str_iless(const std::string& left, const std::string& right) CPPREST_NOEXCEPT;
+
+///
+/// Cross platform utility function for performing case insensitive string less-than comparison.
+///
+/// First string to compare.
+/// Second strong to compare.
+/// true if a lowercase view of left is lexicographically less than a lowercase view of right; otherwise,
+/// false.
+_ASYNCRTIMP bool __cdecl str_iless(const std::wstring& left, const std::wstring& right) CPPREST_NOEXCEPT;
+
+///
+/// Convert a string to lowercase in place.
+///
+/// The string to convert to lowercase.
+_ASYNCRTIMP void __cdecl inplace_tolower(std::string& target) CPPREST_NOEXCEPT;
+
+///
+/// Convert a string to lowercase in place.
+///
+/// The string to convert to lowercase.
+_ASYNCRTIMP void __cdecl inplace_tolower(std::wstring& target) CPPREST_NOEXCEPT;
+
+#ifdef _WIN32
+
+///
+/// Category error type for Windows OS errors.
+///
+class windows_category_impl : public std::error_category
+{
+public:
+ virtual const char* name() const CPPREST_NOEXCEPT { return "windows"; }
+
+ virtual std::string message(int errorCode) const CPPREST_NOEXCEPT;
+
+ virtual std::error_condition default_error_condition(int errorCode) const CPPREST_NOEXCEPT;
+};
+
+///
+/// Gets the one global instance of the windows error category.
+///
+/// An error category instance.
+_ASYNCRTIMP const std::error_category& __cdecl windows_category();
+
+#else
+
+///
+/// Gets the one global instance of the linux error category.
+///
+/// An error category instance.
+_ASYNCRTIMP const std::error_category& __cdecl linux_category();
+
+#endif
+
+///
+/// Gets the one global instance of the current platform's error category.
+///
+_ASYNCRTIMP const std::error_category& __cdecl platform_category();
+
+///
+/// Creates an instance of std::system_error from a OS error code.
+///
+inline std::system_error __cdecl create_system_error(unsigned long errorCode)
+{
+ std::error_code code((int)errorCode, platform_category());
+ return std::system_error(code, code.message());
+}
+
+///
+/// Creates a std::error_code from a OS error code.
+///
+inline std::error_code __cdecl create_error_code(unsigned long errorCode)
+{
+ return std::error_code((int)errorCode, platform_category());
+}
+
+///
+/// Creates the corresponding error message from a OS error code.
+///
+inline utility::string_t __cdecl create_error_message(unsigned long errorCode)
+{
+ return utility::conversions::to_string_t(create_error_code(errorCode).message());
+}
+
+} // namespace details
+
+class datetime
+{
+public:
+ typedef uint64_t interval_type;
+
+ ///
+ /// Defines the supported date and time string formats.
+ ///
+ enum date_format
+ {
+ RFC_1123,
+ ISO_8601
+ };
+
+ ///
+ /// Returns the current UTC time.
+ ///
+ static _ASYNCRTIMP datetime __cdecl utc_now();
+
+ ///
+ /// An invalid UTC timestamp value.
+ ///
+ enum : interval_type
+ {
+ utc_timestamp_invalid = static_cast(-1)
+ };
+
+ ///
+ /// Returns seconds since Unix/POSIX time epoch at 01-01-1970 00:00:00.
+ /// If time is before epoch, utc_timestamp_invalid is returned.
+ ///
+ static interval_type utc_timestamp()
+ {
+ const auto seconds = utc_now().to_interval() / _secondTicks;
+ if (seconds >= 11644473600LL)
+ {
+ return seconds - 11644473600LL;
+ }
+ else
+ {
+ return utc_timestamp_invalid;
+ }
+ }
+
+ datetime() : m_interval(0) {}
+
+ ///
+ /// Creates datetime from a string representing time in UTC in RFC 1123 format.
+ ///
+ /// Returns a datetime of zero if not successful.
+ static _ASYNCRTIMP datetime __cdecl from_string(const utility::string_t& timestring, date_format format = RFC_1123);
+
+ ///
+ /// Returns a string representation of the datetime.
+ ///
+ _ASYNCRTIMP utility::string_t to_string(date_format format = RFC_1123) const;
+
+ ///
+ /// Returns the integral time value.
+ ///
+ interval_type to_interval() const { return m_interval; }
+
+ datetime operator-(interval_type value) const { return datetime(m_interval - value); }
+
+ datetime operator+(interval_type value) const { return datetime(m_interval + value); }
+
+ bool operator==(datetime dt) const { return m_interval == dt.m_interval; }
+
+ bool operator!=(const datetime& dt) const { return !(*this == dt); }
+
+ static interval_type from_milliseconds(unsigned int milliseconds) { return milliseconds * _msTicks; }
+
+ static interval_type from_seconds(unsigned int seconds) { return seconds * _secondTicks; }
+
+ static interval_type from_minutes(unsigned int minutes) { return minutes * _minuteTicks; }
+
+ static interval_type from_hours(unsigned int hours) { return hours * _hourTicks; }
+
+ static interval_type from_days(unsigned int days) { return days * _dayTicks; }
+
+ bool is_initialized() const { return m_interval != 0; }
+
+private:
+ friend int operator-(datetime t1, datetime t2);
+
+ static const interval_type _msTicks = static_cast(10000);
+ static const interval_type _secondTicks = 1000 * _msTicks;
+ static const interval_type _minuteTicks = 60 * _secondTicks;
+ static const interval_type _hourTicks = 60 * 60 * _secondTicks;
+ static const interval_type _dayTicks = 24 * 60 * 60 * _secondTicks;
+
+ // Private constructor. Use static methods to create an instance.
+ datetime(interval_type interval) : m_interval(interval) {}
+
+ // Storing as hundreds of nanoseconds 10e-7, i.e. 1 here equals 100ns.
+ interval_type m_interval;
+};
+
+inline int operator-(datetime t1, datetime t2)
+{
+ auto diff = (t1.m_interval - t2.m_interval);
+
+ // Round it down to seconds
+ diff /= 10 * 1000 * 1000;
+
+ return static_cast(diff);
+}
+
+///
+/// Nonce string generator class.
+///
+class nonce_generator
+{
+public:
+ ///
+ /// Define default nonce length.
+ ///
+ enum
+ {
+ default_length = 32
+ };
+
+ ///
+ /// Nonce generator constructor.
+ ///
+ /// Length of the generated nonce string.
+ nonce_generator(int length = default_length)
+ : m_random(static_cast(utility::datetime::utc_timestamp())), m_length(length)
+ {
+ }
+
+ ///
+ /// Generate a nonce string containing random alphanumeric characters (A-Za-z0-9).
+ /// Length of the generated string is set by length().
+ ///
+ /// The generated nonce string.
+ _ASYNCRTIMP utility::string_t generate();
+
+ ///
+ /// Get length of generated nonce string.
+ ///
+ /// Nonce string length.
+ int length() const { return m_length; }
+
+ ///
+ /// Set length of the generated nonce string.
+ ///
+ /// Lenght of nonce string.
+ void set_length(int length) { m_length = length; }
+
+private:
+ std::mt19937 m_random;
+ int m_length;
+};
+
+} // namespace utility
diff --git a/deps/cpprestsdk/include/cpprest/base_uri.h b/deps/cpprestsdk/include/cpprest/base_uri.h
new file mode 100644
index 00000000000..7c6943119c0
--- /dev/null
+++ b/deps/cpprestsdk/include/cpprest/base_uri.h
@@ -0,0 +1,391 @@
+/***
+ * Copyright (C) Microsoft. All rights reserved.
+ * Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
+ *
+ * =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
+ *
+ * Protocol independent support for URIs.
+ *
+ * For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
+ *
+ * =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+ ****/
+
+#pragma once
+
+#include "cpprest/asyncrt_utils.h"
+#include "cpprest/details/basic_types.h"
+#include