    <footer class="footer">
      <div class="container">
        <div class="row">
          <div class="col-lg-12">
            <p class="text-muted">&copy; 2015 Google</p>
          </div>
        </div>
      </div>
    </footer>

    <!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
    <!-- Include all compiled plugins (below), or include individual files as needed -->
    <script src="/assets/js/bootstrap.min.js"></script>

    <!-- Anchor JS -->
    <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.2.0/anchor.min.js"></script>
    <script>
      // Automatically add anchors and links to all header elements that don't already have them.
      anchors.add();
    </script>

    <script>
      var shiftWindow = function() {
        if (location.hash.length !== 0) {
          window.scrollBy(0, -50);
        }
      };
      window.addEventListener("hashchange", shiftWindow);

      var highlightCurrentSidebarNav = function() {
        var href = location.pathname;
        var item = $('#sidebar-nav [href$="' + href + '"]');
        if (item) {
          var li = item.parent();
          li.addClass("active");

          if (li.parent() && li.parent().is("ul")) {
            do {
              var ul = li.parent();
              if (ul.hasClass("collapse")) {
                ul.collapse("show");
              }
              li = ul.parent();
            } while (li && li.is("li"));
          }
        }
      };

      $(document).ready(function() {
        // Scroll to anchor of location hash, adjusted for fixed navbar.
        window.setTimeout(function() {
          shiftWindow();
        }, 1);

        // Flip the caret when submenu toggles are clicked.
        $(".sidebar-submenu").on("show.bs.collapse", function() {
          var toggle = $('[href$="#' + $(this).attr('id') + '"]');
          if (toggle) {
            toggle.addClass("dropup");
          }
        });
        $(".sidebar-submenu").on("hide.bs.collapse", function() {
          var toggle = $('[href$="#' + $(this).attr('id') + '"]');
          if (toggle) {
            toggle.removeClass("dropup");
          }
        });

        // Highlight the current page on the sidebar nav.
        highlightCurrentSidebarNav();
      });
    </script>

    <!-- Google Analytics tracking code -->
    <script>
      (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
      (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
      m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
      })(window,document,'script','//www.google-analytics.com/analytics.js','ga');

      ga('create', 'UA-61082125-1', 'auto');
      ga('send', 'pageview');
    </script>
