<Project>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->
  <PropertyGroup>
    <Version>0.16.0</Version>
    <Authors>Apache Software Foundation</Authors>
    <Owners>The Apache REEF project</Owners>
    <Product>Apache REEF</Product>
    <ProductId>$(AssemblyName)</ProductId>
    <AssemblyVersion>$(Version)</AssemblyVersion>
    <FileVersion>$(Version)</FileVersion>
    <NeutralLanguage>en</NeutralLanguage>
    <Copyright>The Apache Software Foundation</Copyright>
    <PackageLicenseUrl>https://www.apache.org/licenses/LICENSE-2.0</PackageLicenseUrl>
    <PackageProjectUrl>https://reef.apache.org</PackageProjectUrl>
    <PackageIconUrl>https://reef.apache.org/ApacheREEF_logo_no_margin_small.png</PackageIconUrl>
    <RepositoryUrl>https://github.com/apache/reef.git</RepositoryUrl>
    <PackageReleaseNotes>Contact the Apache REEF development alias dev@reef.apache.org for questions or issues.</PackageReleaseNotes>
    <DefaultItemExcludes>$(DefaultItemExcludes);**/AssemblyInfo.cs;packages.config;*.nuspec</DefaultItemExcludes>
  </PropertyGroup>

  <PropertyGroup>
    <OutputPath>..\bin\$(AssemblyName)</OutputPath>
    <AvroVersion>1.5.6</AvroVersion>
    <NewtonsoftJsonVersion>10.0.1</NewtonsoftJsonVersion>
    <ProtobufVersion>2.0.0.668</ProtobufVersion>
    <RxVersion>2.2.5</RxVersion>
    <StyleCopVersion>4.7.49.1</StyleCopVersion>
    <NSubstituteVersion>1.8.2.0</NSubstituteVersion>
  </PropertyGroup>

</Project>
