Requirements
------------

Contributions to NLSR must be licensed under GPL 3.0 or compatible license.  If you are
choosing GPL 3.0, please use the following license boilerplate in all `.hpp` and `.cpp`
files:

Include the following header in all `.hpp` and `.cpp` files:

    /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
    /**
     * Copyright (c) [Year(s)],  [Copyright Holder(s)].
     *
     * This file is part of NLSR (Named-data Link State Routing).
     * See AUTHORS.md for complete list of NLSR authors and contributors.
     *
     * NLSR is free software: you can redistribute it and/or modify it under the terms
     * of the GNU General Public License as published by the Free Software Foundation,
     * either version 3 of the License, or (at your option) any later version.
     *
     * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
     * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     * PURPOSE.  See the GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License along with
     * NLSR, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
     **/

If you are affiliated with an NSF-supported NDN project institution,
please use the [NDN Team License Boilerplate]
(http://redmine.named-data.net/projects/nlsr/wiki/NDN_Team_License_Boilerplate_(NLSR)).

Recommendations
---------------

NSLR code is subject to the code style, defined here:
http://redmine.named-data.net/projects/nfd/wiki/CodeStyle
