Skip to content

Commit

Permalink
Copying the runtime folder as part of post build step (#443)
Browse files Browse the repository at this point in the history
* Copying the missing dlls to the bin folder
* Adding End to End Tests and porting the projects to netcoreapp3.1. Tests cover the following scenarios
- Build and publish for a project targeting Netsdk latest version
- Build and publish for a project with SQl dependency
- Build and publish for a project with a HttpTrigger
* Upgrading the sdk to 3.1.301
* Running end to end tests as a part of ci build
* Auto-increment the assembly version for generator and msbuild dll
  • Loading branch information
vijayrkn authored Jul 10, 2020
1 parent 133a4fc commit 0992e21
Show file tree
Hide file tree
Showing 23 changed files with 519 additions and 114 deletions.
9 changes: 0 additions & 9 deletions Directory.Build.props

This file was deleted.

9 changes: 8 additions & 1 deletion FunctionsSdk.sln
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{14D6456E-2F9
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{9B6D0171-3FFD-4892-B407-B633CA4E6712}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.NET.Sdk.Functions.Generator.Tests", "test\Microsoft.NET.Sdk.Functions.Generator.Tests\Microsoft.NET.Sdk.Functions.Generator.Tests.csproj", "{9D59910B-B90E-4BBE-BD26-C2CBF85D37E1}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.NET.Sdk.Functions.Generator.Tests", "test\Microsoft.NET.Sdk.Functions.Generator.Tests\Microsoft.NET.Sdk.Functions.Generator.Tests.csproj", "{9D59910B-B90E-4BBE-BD26-C2CBF85D37E1}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pack", "pack", "{8D555953-A625-4C7F-93A7-C737644820AB}"
EndProject
Expand All @@ -25,6 +25,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.NET.Sdk.Functions
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.NET.Sdk.Functions.MSBuild", "src\Microsoft.NET.Sdk.Functions.MSBuild\Microsoft.NET.Sdk.Functions.MSBuild.csproj", "{1DB38EB5-DBA9-4678-BB99-2BCD1255DDBE}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.NET.Sdk.Functions.EndToEnd.Tests", "test\Microsoft.NET.Sdk.Functions.EndToEnd.Tests\Microsoft.NET.Sdk.Functions.EndToEnd.Tests.csproj", "{3F8DD976-ABCC-4B6B-B991-CEAAA4C03736}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand All @@ -51,6 +53,10 @@ Global
{1DB38EB5-DBA9-4678-BB99-2BCD1255DDBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1DB38EB5-DBA9-4678-BB99-2BCD1255DDBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1DB38EB5-DBA9-4678-BB99-2BCD1255DDBE}.Release|Any CPU.Build.0 = Release|Any CPU
{3F8DD976-ABCC-4B6B-B991-CEAAA4C03736}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3F8DD976-ABCC-4B6B-B991-CEAAA4C03736}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3F8DD976-ABCC-4B6B-B991-CEAAA4C03736}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F8DD976-ABCC-4B6B-B991-CEAAA4C03736}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand All @@ -61,6 +67,7 @@ Global
{6CEDE940-9F0A-4B2A-97D4-D1EEEE42AF35} = {14D6456E-2F9D-4483-A378-03701A6EB12D}
{B80DA350-8A69-4CD2-9E60-01C51B5A8633} = {9B6D0171-3FFD-4892-B407-B633CA4E6712}
{1DB38EB5-DBA9-4678-BB99-2BCD1255DDBE} = {14D6456E-2F9D-4483-A378-03701A6EB12D}
{3F8DD976-ABCC-4B6B-B991-CEAAA4C03736} = {9B6D0171-3FFD-4892-B407-B633CA4E6712}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DA731A15-774F-46C2-B8DF-298F828DCC2A}
Expand Down
2 changes: 1 addition & 1 deletion appveyor.cmd
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
powershell Invoke-WebRequest -Uri 'https://dot.net/v1/dotnet-install.ps1' -UseBasicParsing -OutFile '%TEMP%\dotnet-install.ps1'
powershell %TEMP%\dotnet-install.ps1 -Architecture x64 -Version '3.0.100' -InstallDir '%ProgramFiles%\dotnet'
powershell %TEMP%\dotnet-install.ps1 -Architecture x64 -Version '3.1.301' -InstallDir '%ProgramFiles%\dotnet'
.paket\paket.exe install
packages\FAKE\tools\fake .\build.fsx
23 changes: 15 additions & 8 deletions build.fsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ Target "Build" (fun _ ->
Configuration = "Release"})
)


Target "UnitTest" (fun _ ->
DotNetCli.Test (fun p ->
{p with
Expand All @@ -67,16 +68,22 @@ Target "UnitTest" (fun _ ->
{p with
Project = "test\\Microsoft.NET.Sdk.Functions.MSBuild.Tests"
Configuration = "Debug"})

DotNetCli.Test (fun p ->
{p with
Project = "test\\Microsoft.NET.Sdk.Functions.EndToEnd.Tests"
Configuration = "Debug"
AdditionalArgs=["--logger"; "console;verbosity=detailed"]})
)

Target "GenerateZipToSign" (fun _ ->
!! (packOutputPath @@ "netcoreapp3.0\\Microsoft.NET.Sdk.Functions.dll")
!! (packOutputPath @@ "netcoreapp3.1\\Microsoft.NET.Sdk.Functions.dll")
++ (buildTaskOutputPath @@ "netstandard2.0\\Microsoft.NET.Sdk.Functions.MSBuild.dll")
++ (generatorOutputPath @@ "netcoreapp3.0\\Microsoft.NET.Sdk.Functions.Generator.dll")
++ (generatorOutputPath @@ "netcoreapp3.1\\Microsoft.NET.Sdk.Functions.Generator.dll")
|> CreateZip "." (version + "netstandard2.zip") "" 7 true

!! (generatorOutputPath @@ "netcoreapp3.0\\Newtonsoft.Json.dll")
++ (generatorOutputPath @@ "netcoreapp3.0\\Mono.Cecil.dll")
!! (generatorOutputPath @@ "netcoreapp3.1\\Newtonsoft.Json.dll")
++ (generatorOutputPath @@ "netcoreapp3.1\\Mono.Cecil.dll")
|> CreateZip "." (version + "netstandard2thirdparty.zip") "" 7 true
)

Expand Down Expand Up @@ -126,9 +133,9 @@ Target "WaitForSigning" (fun _ ->
match signed with
| Success file ->
Unzip "tmpBuild" file
MoveFileTo ("tmpBuild" @@ "Microsoft.NET.Sdk.Functions.dll", packOutputPath @@ "netcoreapp3.0\\Microsoft.NET.Sdk.Functions.dll")
MoveFileTo ("tmpBuild" @@ "Microsoft.NET.Sdk.Functions.dll", packOutputPath @@ "netcoreapp3.1\\Microsoft.NET.Sdk.Functions.dll")
MoveFileTo ("tmpBuild" @@ "Microsoft.NET.Sdk.Functions.MSBuild.dll", buildTaskOutputPath @@ "netstandard2.0\\Microsoft.NET.Sdk.Functions.MSBuild.dll")
MoveFileTo ("tmpBuild" @@ "Microsoft.NET.Sdk.Functions.Generator.dll", generatorOutputPath @@ "netcoreapp3.0\\Microsoft.NET.Sdk.Functions.Generator.dll")
MoveFileTo ("tmpBuild" @@ "Microsoft.NET.Sdk.Functions.Generator.dll", generatorOutputPath @@ "netcoreapp3.1\\Microsoft.NET.Sdk.Functions.Generator.dll")
| Failure e -> targetError e null |> ignore

CleanDir "tmpBuild"
Expand All @@ -137,8 +144,8 @@ Target "WaitForSigning" (fun _ ->
match signed with
| Success file ->
Unzip "tmpBuild" file
MoveFileTo ("tmpBuild" @@ "Newtonsoft.Json.dll", generatorOutputPath @@ "netcoreapp3.0\\Newtonsoft.Json.dll")
MoveFileTo ("tmpBuild" @@ "Mono.Cecil.dll", generatorOutputPath @@ "netcoreapp3.0\\Mono.Cecil.dll")
MoveFileTo ("tmpBuild" @@ "Newtonsoft.Json.dll", generatorOutputPath @@ "netcoreapp3.1\\Newtonsoft.Json.dll")
MoveFileTo ("tmpBuild" @@ "Mono.Cecil.dll", generatorOutputPath @@ "netcoreapp3.1\\Mono.Cecil.dll")
| Failure e -> targetError e null |> ignore
)

Expand Down
31 changes: 15 additions & 16 deletions pack/Microsoft.NET.Sdk.Functions/Microsoft.NET.Sdk.Functions.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,13 @@
<Import Project="..\..\src\Microsoft.NET.Sdk.Functions.MSBuild\Targets\Microsoft.NET.Sdk.Functions.Version.props" />

<PropertyGroup>
<TargetFrameworks>netcoreapp3.0</TargetFrameworks>
<TargetFrameworks>netcoreapp3.1</TargetFrameworks>
<PackageName>Microsoft.NET.Sdk.Functions</PackageName>
<Version>$(FunctionsSdkVersion)</Version>
<Authors>Microsoft</Authors>
<ProjectUrl>https://github.com/Azure/azure-functions-vs-build-sdk</ProjectUrl>
<PackageProjectUrl>https://github.com/Azure/azure-functions-vs-build-sdk</PackageProjectUrl>
<LicenseUrl>https://github.com/Azure/azure-functions-vs-build-sdk/blob/master/LICENSE</LicenseUrl>
<PackageLicenseUrl>https://github.com/Azure/azure-functions-vs-build-sdk/blob/master/LICENSE</PackageLicenseUrl>
<PackageLicenseExpression>MIT</PackageLicenseExpression>
<RepositoryUrl>https://github.com/Azure/azure-functions-vs-build-sdk</RepositoryUrl>
<RepositoryType>git</RepositoryType>
<PackageTags>azurefunctions</PackageTags>
Expand All @@ -20,8 +19,8 @@
<PackageDescription>Build SDK for Azure Functions</PackageDescription>
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
<BuildOutputTargetFolder>tools</BuildOutputTargetFolder>
<FunctionsBuildTaskOutputPath>..\..\src\Microsoft.NET.Sdk.Functions.MSBuild\bin\Release</FunctionsBuildTaskOutputPath>
<FunctionsGeneratorOutputPath>..\..\src\Microsoft.NET.Sdk.Functions.Generator\bin\Release</FunctionsGeneratorOutputPath>
<FunctionsBuildTaskOutputPath>..\..\src\Microsoft.NET.Sdk.Functions.MSBuild\bin\$(Configuration)</FunctionsBuildTaskOutputPath>
<FunctionsGeneratorOutputPath>..\..\src\Microsoft.NET.Sdk.Functions.Generator\bin\$(Configuration)</FunctionsGeneratorOutputPath>
<IncludeBuildOutput>false</IncludeBuildOutput>
</PropertyGroup>

Expand All @@ -44,29 +43,29 @@
<!-- MSBuild task assemblies -->
<None Include="$(FunctionsBuildTaskOutputPath)\netstandard2.0\Microsoft.NET.Sdk.Functions.MSBuild.dll">
<Pack>true</Pack>
<PackagePath>tools\netcoreapp3.0\</PackagePath>
<PackagePath>tools\netcoreapp3.1\</PackagePath>
</None>

<!-- Generator and dependent assemblies-->
<None Include="$(FunctionsGeneratorOutputPath)\netcoreapp3.0\Newtonsoft.Json.dll">
<None Include="$(FunctionsGeneratorOutputPath)\netcoreapp3.1\Newtonsoft.Json.dll">
<Pack>true</Pack>
<PackagePath>tools\netcoreapp3.0\</PackagePath>
<PackagePath>tools\netcoreapp3.1\</PackagePath>
</None>
<None Include="$(FunctionsGeneratorOutputPath)\netcoreapp3.0\Mono.Cecil.dll">
<None Include="$(FunctionsGeneratorOutputPath)\netcoreapp3.1\Mono.Cecil.dll">
<Pack>true</Pack>
<PackagePath>tools\netcoreapp3.0\</PackagePath>
<PackagePath>tools\netcoreapp3.1\</PackagePath>
</None>
<None Include="$(FunctionsGeneratorOutputPath)\netcoreapp3.0\Microsoft.NET.Sdk.Functions.Generator.dll">
<None Include="$(FunctionsGeneratorOutputPath)\netcoreapp3.1\Microsoft.NET.Sdk.Functions.Generator.dll">
<Pack>true</Pack>
<PackagePath>tools\netcoreapp3.0\</PackagePath>
<PackagePath>tools\netcoreapp3.1\</PackagePath>
</None>
<None Include="$(FunctionsGeneratorOutputPath)\netcoreapp3.0\Microsoft.NET.Sdk.Functions.Generator.runtimeconfig.json">
<None Include="$(FunctionsGeneratorOutputPath)\netcoreapp3.1\Microsoft.NET.Sdk.Functions.Generator.runtimeconfig.json">
<Pack>true</Pack>
<PackagePath>tools\netcoreapp3.0\</PackagePath>
<PackagePath>tools\netcoreapp3.1\</PackagePath>
</None>
<None Include="$(OutputPath)\netcoreapp3.0\Microsoft.NET.Sdk.Functions.dll">
<None Include="$(OutputPath)\netcoreapp3.1\Microsoft.NET.Sdk.Functions.dll">
<Pack>true</Pack>
<PackagePath>tools\netcoreapp3.0\</PackagePath>
<PackagePath>tools\netcoreapp3.1\</PackagePath>
</None>
</ItemGroup>

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">

<Import Project="..\..\src\Microsoft.NET.Sdk.Functions.MSBuild\Targets\Microsoft.NET.Sdk.Functions.Version.props" />

<PropertyGroup>
<Version>3.0.0</Version>
<Version>$(FunctionsSdkVersion)</Version>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.0</TargetFramework>
<TargetFramework>netcoreapp3.1</TargetFramework>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
</PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\src\Microsoft.NET.Sdk.Functions.MSBuild\Targets\Microsoft.NET.Sdk.Functions.Version.props" />

<PropertyGroup>
<Version>3.0.0</Version>
<Version>$(FunctionsSdkVersion)</Version>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
</PropertyGroup>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,8 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and
============================================================
-->
<Target Name="_GenerateFunctionsPostBuild"
AfterTargets="Build">
<PropertyGroup>
<UseNETCoreGenerator Condition="$(UseNETCoreGenerator)=='' AND !$(AzureFunctionsVersion.StartsWith('v1'))">true</UseNETCoreGenerator>
</PropertyGroup>

<ItemGroup>
<FunctionsBuildAssemblies Include="$(TargetDir)*.dll;
$(TargetDir)*.pdb" />
</ItemGroup>

<!-- Copy the additional assemblies to the bin folder-->
<Copy SourceFiles="@(FunctionsBuildAssemblies)"
DestinationFiles="$(TargetDir)bin\%(Filename)%(Extension)"
OverwriteReadOnlyFiles="true" />
AfterTargets="Build"
DependsOnTargets="_FunctionsPostBuildCollectFiles;_FunctionsPostBuildCopyFiles">

<ItemGroup>
<UserProvidedFunctionJsonFiles Include="@(None);@(Content)" Condition="Exists(%(Identity))
Expand All @@ -44,22 +32,61 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and
<GenerateFunctions
TargetPath="$(TargetDir)bin\$(TargetFileName)"
OutputPath="$(TargetDir)"
UseNETCoreGenerator="$(UseNETCoreGenerator)"
UseNETFrameworkGenerator="$(UseNETFrameworkGenerator)"
UserProvidedFunctionJsonFiles="@(UserProvidedFunctionJsonFiles)"
FunctionsInDependencies="$(FunctionsInDependencies)"
TaskAssemblyDirectory="$(_FunctionsTasksDir)"/>
</Target>


<!--
============================================================
_FunctionsPostBuildCollectFiles
Initializes the Files to copy.
============================================================
-->
<Target Name="_FunctionsPostBuildCollectFiles">

<ItemGroup>
<FunctionsBuildAssemblies Include="$(TargetDir)**\*.dll;
$(TargetDir)**\*.pdb"
Exclude="$(TargetDir)bin\**"/>
</ItemGroup>

</Target>

<!--
<!--
============================================================
_FunctionsPostBuildCopyFiles
Copies the dlls from build output to the bin folder.
============================================================
-->
<Target Name="_FunctionsPostBuildCopyFiles"
Inputs="@(FunctionsBuildAssemblies)"
Outputs="$(TargetDir)bin\%(RecursiveDir)%(Filename)%(Extension)">

<!-- Copy the assemblies to the bin folder-->
<Copy SourceFiles="@(FunctionsBuildAssemblies)"
DestinationFiles="$(TargetDir)bin\%(RecursiveDir)%(Filename)%(Extension)"
OverwriteReadOnlyFiles="true" />

</Target>

<!--
============================================================
_FunctionsPostBuildDepsCopy
Copies the deps file to the Functions bin folder
============================================================
-->
<Target Name="_FunctionsPostBuildDepsCopy" AfterTargets="PostBuildEvent" Condition="'$(SkipFunctionsDepsCopy)' != 'true'">
<Copy SourceFiles="$(OutDir)$(AssemblyName).deps.json" DestinationFiles="$(OutDir)bin\function.deps.json" Condition="Exists('$(OutDir)$(AssemblyName).deps.json')"/>
<Target Name="_FunctionsPostBuildDepsCopy"
AfterTargets="PostBuildEvent"
Condition="'$(SkipFunctionsDepsCopy)' != 'true'">

<Copy SourceFiles="$(OutDir)$(AssemblyName).deps.json"
DestinationFiles="$(OutDir)bin\function.deps.json"
Condition="Exists('$(OutDir)$(AssemblyName).deps.json')"/>
</Target>


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,22 +17,6 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and
<Import Project="$(MSBuildThisFileDirectory)Microsoft.NET.Sdk.Functions.Publish.$(PublishProtocol).targets"
Condition="Exists('$(MSBuildThisFileDirectory)Microsoft.NET.Sdk.Functions.Publish.$(PublishProtocol).targets')"/>

<!--
============================================================
_OverrideFunctionsPack
This target gets called during folder publish from VS since
Function project is a class library project rather than
a console project. IsPackable property for the functions projects
is set to false, so, pack target wont pack the project. This target
invokes the publish target to do the actual publish.
============================================================
-->
<Target Name="_OverrideFunctionsPack"
AfterTargets="Pack"
Condition="'$(DisablePublishDuringPack)' != 'true'"
DependsOnTargets="Publish" />

<!--
============================================================
_InitializeDotNetPublishProperties
Expand Down Expand Up @@ -150,20 +134,20 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and
<Target Name="_GenerateFunctionsAndCopyContentFiles">

<ItemGroup>
<FunctionsPublishAssemblies Include="$(PublishDir)*.dll;
$(PublishDir)*.pdb" />
<FunctionsPublishAssemblies Include="$(PublishDir)**\*.dll;

This comment has been minimized.

Copy link
@davec643

davec643 Oct 29, 2020

This was a breaking change for us. Maybe we are doing a bad thing, but we had a directory with a 3rd party piece of software that had been getting copied across fine until this broke it.

$(PublishDir)**\*.pdb"
Exclude="$(PublishDir)bin\**"/>
</ItemGroup>

<!-- Copy the additional assemblies to the bin folder-->
<!-- Move the additional assemblies to the bin folder.
we move the assemblies rather than copy because we want to reduce the publish payload -->
<Move SourceFiles="@(FunctionsPublishAssemblies)"
DestinationFiles="$(PublishDir)bin\%(Filename)%(Extension)"
DestinationFiles="$(PublishDir)bin\%(RecursiveDir)%(Filename)%(Extension)"
OverwriteReadOnlyFiles="true" />

<GenerateFunctions
TargetPath="$(FunctionsTargetPath)"
OutputPath="$(FunctionsOutputPath)"
UseNETCoreGenerator="$(UseNETCoreGenerator)"
UseNETFrameworkGenerator="$(UseNETFrameworkGenerator)"
UserProvidedFunctionJsonFiles="@(UserProvidedFunctionJsonFiles)"
FunctionsInDependencies="$(FunctionsInDependencies)"
TaskAssemblyDirectory="$(_FunctionsTasksDir)"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<PropertyGroup>
<_FunctionsTaskFramework>netcoreapp3.0</_FunctionsTaskFramework>
<_FunctionsTaskFramework>netcoreapp3.1</_FunctionsTaskFramework>
<_FunctionsTasksDir Condition=" '$(_FunctionsTasksDir)'=='' ">$(MSBuildThisFileDirectory)..\tools\$(_FunctionsTaskFramework)\</_FunctionsTasksDir>
<_FunctionsTaskAssemblyFullPath Condition=" '$(_FunctionsTaskAssemblyFullPath)'=='' ">$(_FunctionsTasksDir)\Microsoft.NET.Sdk.Functions.MSBuild.dll</_FunctionsTaskAssemblyFullPath>
<DebugSymbols Condition="'$(DebugSymbols)' == ''">true</DebugSymbols>
<DebugType Condition="'$(DebugType)' == ''">pdbonly</DebugType>
<IsPackable>false</IsPackable>
<IsPackable Condition="'$(IsPackable)' == ''">false</IsPackable>
<WarnOnPackingNonPackableProject Condition="'$(WarnOnPackingNonPackableProject)' == '' and '$(IsPackable)' == 'false'">true</WarnOnPackingNonPackableProject>
<IsZipDeploySupported>true</IsZipDeploySupported>
</PropertyGroup>

Expand Down
Loading

0 comments on commit 0992e21

Please sign in to comment.