Full Code of tatsuhiro-t/spdylay for AI

master ce6426b04672 cached
202 files
1.6 MB
456.2k tokens
1077 symbols
1 requests
Download .txt
Showing preview only (1,701K chars total). Download the full file or copy to clipboard to get everything.
Repository: tatsuhiro-t/spdylay
Branch: master
Commit: ce6426b04672
Files: 202
Total size: 1.6 MB

Directory structure:
gitextract_ldhk4ot2/

├── .gitignore
├── AUTHORS
├── COPYING
├── ChangeLog
├── Makefile.am
├── NEWS
├── README
├── README.rst
├── android-config
├── android-make
├── configure.ac
├── doc/
│   ├── .gitignore
│   ├── Makefile.am
│   ├── README.rst
│   ├── _themes/
│   │   └── sphinx_rtd_theme/
│   │       ├── __init__.py
│   │       ├── breadcrumbs.html
│   │       ├── footer.html
│   │       ├── layout.html
│   │       ├── layout_old.html
│   │       ├── search.html
│   │       ├── searchbox.html
│   │       ├── static/
│   │       │   ├── css/
│   │       │   │   ├── badge_only.css
│   │       │   │   └── theme.css
│   │       │   ├── fonts/
│   │       │   │   └── FontAwesome.otf
│   │       │   └── js/
│   │       │       └── theme.js
│   │       ├── theme.conf
│   │       └── versions.html
│   ├── android-spdy-proxy.rst
│   ├── apiref-header.rst
│   ├── conf.py.in
│   ├── index.rst
│   ├── make.bat
│   ├── mkapiref.py
│   ├── package_README.rst
│   └── python.rst
├── examples/
│   ├── .gitignore
│   ├── Makefile.am
│   ├── README.rst
│   ├── spdy.h
│   ├── spdycli.c
│   └── spdynative.cc
├── fedora/
│   └── spdylay.spec
├── lib/
│   ├── Makefile.am
│   ├── includes/
│   │   ├── Makefile.am
│   │   └── spdylay/
│   │       ├── spdylay.h
│   │       └── spdylayver.h.in
│   ├── libspdylay.pc.in
│   ├── spdylay_buffer.c
│   ├── spdylay_buffer.h
│   ├── spdylay_frame.c
│   ├── spdylay_frame.h
│   ├── spdylay_gzip.c
│   ├── spdylay_gzip.h
│   ├── spdylay_helper.c
│   ├── spdylay_helper.h
│   ├── spdylay_int.h
│   ├── spdylay_map.c
│   ├── spdylay_map.h
│   ├── spdylay_net.h
│   ├── spdylay_npn.c
│   ├── spdylay_npn.h
│   ├── spdylay_outbound_item.c
│   ├── spdylay_outbound_item.h
│   ├── spdylay_pq.c
│   ├── spdylay_pq.h
│   ├── spdylay_queue.c
│   ├── spdylay_queue.h
│   ├── spdylay_session.c
│   ├── spdylay_session.h
│   ├── spdylay_stream.c
│   ├── spdylay_stream.h
│   ├── spdylay_submit.c
│   ├── spdylay_submit.h
│   ├── spdylay_zlib.c
│   └── spdylay_zlib.h
├── m4/
│   └── README
├── makerelease.sh
├── proxy.pac.sample
├── python/
│   ├── MANIFEST.in
│   ├── Makefile.am
│   ├── README.rst
│   ├── cspdylay.pxd
│   ├── setup.py
│   ├── spdyclient.py
│   ├── spdylay.pyx
│   ├── spdylay_tests.py
│   └── spdyserv.py
├── shrpx.conf.sample
├── src/
│   ├── .gitignore
│   ├── EventPoll.h
│   ├── EventPollEvent.h
│   ├── EventPoll_epoll.cc
│   ├── EventPoll_epoll.h
│   ├── EventPoll_kqueue.cc
│   ├── EventPoll_kqueue.h
│   ├── HtmlParser.cc
│   ├── HtmlParser.h
│   ├── Makefile.am
│   ├── SpdyServer.cc
│   ├── SpdyServer.h
│   ├── base64.h
│   ├── http-parser/
│   │   ├── 0001-Support-custom-HTTP-version-string-e.g.-ICY.patch
│   │   ├── 0002-Allow-chars-in-32-126-except-for-58-for-TOKEN.patch
│   │   ├── 0003-Use-http_parser-for-tunneling-connection-transparent.patch
│   │   ├── AUTHORS
│   │   ├── CONTRIBUTIONS
│   │   ├── LICENSE-MIT
│   │   ├── README.md
│   │   ├── bench.c
│   │   ├── contrib/
│   │   │   ├── parsertrace.c
│   │   │   └── url_parser.c
│   │   ├── http_parser.c
│   │   ├── http_parser.gyp
│   │   ├── http_parser.h
│   │   └── test.c
│   ├── shrpx-unittest.cc
│   ├── shrpx.cc
│   ├── shrpx.h
│   ├── shrpx_accesslog.cc
│   ├── shrpx_accesslog.h
│   ├── shrpx_client_handler.cc
│   ├── shrpx_client_handler.h
│   ├── shrpx_config.cc
│   ├── shrpx_config.h
│   ├── shrpx_downstream.cc
│   ├── shrpx_downstream.h
│   ├── shrpx_downstream_connection.cc
│   ├── shrpx_downstream_connection.h
│   ├── shrpx_downstream_queue.cc
│   ├── shrpx_downstream_queue.h
│   ├── shrpx_error.h
│   ├── shrpx_http.cc
│   ├── shrpx_http.h
│   ├── shrpx_http_downstream_connection.cc
│   ├── shrpx_http_downstream_connection.h
│   ├── shrpx_https_upstream.cc
│   ├── shrpx_https_upstream.h
│   ├── shrpx_io_control.cc
│   ├── shrpx_io_control.h
│   ├── shrpx_listen_handler.cc
│   ├── shrpx_listen_handler.h
│   ├── shrpx_log.cc
│   ├── shrpx_log.h
│   ├── shrpx_spdy_downstream_connection.cc
│   ├── shrpx_spdy_downstream_connection.h
│   ├── shrpx_spdy_session.cc
│   ├── shrpx_spdy_session.h
│   ├── shrpx_spdy_upstream.cc
│   ├── shrpx_spdy_upstream.h
│   ├── shrpx_ssl.cc
│   ├── shrpx_ssl.h
│   ├── shrpx_ssl_test.cc
│   ├── shrpx_ssl_test.h
│   ├── shrpx_thread_event_receiver.cc
│   ├── shrpx_thread_event_receiver.h
│   ├── shrpx_upstream.h
│   ├── shrpx_worker.cc
│   ├── shrpx_worker.h
│   ├── spdycat.cc
│   ├── spdyd.cc
│   ├── spdylay_config.h
│   ├── spdylay_ssl.cc
│   ├── spdylay_ssl.h
│   ├── timegm.c
│   ├── timegm.h
│   ├── util.cc
│   └── util.h
└── tests/
    ├── .gitignore
    ├── Makefile.am
    ├── end_to_end.py
    ├── failmalloc.c
    ├── failmalloc_test.c
    ├── failmalloc_test.h
    ├── main.c
    ├── malloc_wrapper.c
    ├── malloc_wrapper.h
    ├── spdylay_buffer_test.c
    ├── spdylay_buffer_test.h
    ├── spdylay_frame_test.c
    ├── spdylay_frame_test.h
    ├── spdylay_gzip_test.c
    ├── spdylay_gzip_test.h
    ├── spdylay_map_test.c
    ├── spdylay_map_test.h
    ├── spdylay_npn_test.c
    ├── spdylay_npn_test.h
    ├── spdylay_pq_test.c
    ├── spdylay_pq_test.h
    ├── spdylay_queue_test.c
    ├── spdylay_queue_test.h
    ├── spdylay_session_test.c
    ├── spdylay_session_test.h
    ├── spdylay_stream_test.c
    ├── spdylay_stream_test.h
    ├── spdylay_test_helper.c
    ├── spdylay_test_helper.h
    ├── spdylay_zlib_test.c
    ├── spdylay_zlib_test.h
    └── testdata/
        ├── Makefile.am
        ├── cacert.pem
        ├── index.html
        └── privkey.pem

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*~
*.o
*.lo
*.la
depcomp
*.m4
Makefile
Makefile.in
libtool
missing
autom4te.cache/
config.guess
config.h
config.h.in
config.log
config.status
config.sub
configure
install-sh
.deps/
.libs
lib/includes/spdylay/spdylayver.h
lib/libspdylay.pc
ltmain.sh
stamp-h1
.deps/
INSTALL
.DS_STORE
tests/main
tests/failmalloc
compile
test-driver


================================================
FILE: AUTHORS
================================================
Tatsuhiro Tsujikawa <t-tujikawa at users dot sourceforge dot net>


================================================
FILE: COPYING
================================================
The MIT License

Copyright (c) 2012, 2014 Tatsuhiro Tsujikawa

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: ChangeLog
================================================


================================================
FILE: Makefile.am
================================================
# Spdylay - SPDY Library

# Copyright (c) 2012 Tatsuhiro Tsujikawa

# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:

# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
SUBDIRS = lib src tests examples doc python

ACLOCAL_AMFLAGS = -I m4

dist_doc_DATA = README.rst

EXTRA_DIST = shrpx.conf.sample proxy.pac.sample android-config android-make


================================================
FILE: NEWS
================================================
spdylay 1.4.0
=============

Release Note
------------

This release removes CREDENTIAL frame support.  The API functions are
still there, but they are now noop.

Changes
-------

* Renew test key pair

* Fix OpenSSL 1.1.0 deprecation warnings

* spdylay: compile against openssl-1.1.0

  It fails to compile against openssl 1.1.0 due to things like
  |shrpx_client_handler.cc:90:30: error: 'strerror' was not declared in this scope
  |shrpx_listen_handler.cc:112:32: error: 'memset' was not declared in this scope
  |shrpx_listen_handler.cc:114:43: error: 'memcpy' was not declared in this scope

  This resolves it.

  Signed-off-by: Sebastian Andrzej Siewior <sebastian@breakpoint.cc>

  Patch from Sebastian Andrzej Siewior

* spdycat: Fix leak in SpdySession.reqvec

* Compile with IRIX 6.5.22 using GCC-4.7.4

  Based on the patch from Klaus Ziegler

* Remove CREDENTIAL frame processing completely

  We just left API as is, but related functions just do nothing now.

* Allocate stream ID when spdylay_submit_{syn_stream,request} is called

  This commit allocates stream ID when spdylay_submit_syn_stream and
  spdylay_submit_request is called.  Also create stream when
  spdylay_session_predicate_syn_stream_send is failed, to provide
  stream to user callback (e.g., on_ctrl_not_send_callback).
  Allocating stream ID early ensures that we can create stream because
  we can catch stream ID exhaustion early and fail fast.  Since stream
  ID is allocated serially, we have to send SYN_STREAM in the order
  they queued.  So now all queued syn_stream have the same priority
  (lowest).  The DATA frame has given priority by application.  This
  does not work well with CREDENTIAL frame, since SYN_STREAM may wait
  for CREDENTIAL, which results in out of order transmission.  Since
  CREDENTIAL frame was deprecated in SPDY/3.1, and no one use it, we
  remove its functionality in the later commit.

* spdycat: --proxy-port, not --proxyport

  Fixes GH-132

* spdycat: Check :host header field for SNI, since Host header is not allowed

* spdycat: Update spdycat --help output for --header

  Patch from Chris Adams

* spdycat: Fix resource leak found by coverity scan


================================================
FILE: README
================================================
See README.rst


================================================
FILE: README.rst
================================================
Spdylay - SPDY C Library
========================

This is an experimental implementation of Google's SPDY protocol in C.

This library provides SPDY version 2, 3 and 3.1 framing layer
implementation.  It does not perform any I/O operations.  When the
library needs them, it calls the callback functions provided by the
application. It also does not include any event polling mechanism, so
the application can freely choose the way of handling events. This
library code does not depend on any particular SSL library (except for
example programs which depend on OpenSSL 1.0.1 or later).

This project also develops SPDY client, server and proxy on top of
Spdylay library. See `SPDY Client and Server Programs`_ section.

Development Status
------------------

Most of the SPDY/2, SPDY/3 and SPDY/3.1 functionality has been
implemented.  In both versions, the direct support of server-push has
not been available yet.  The application can achieve server-push using
primitive APIs though.

As described below, we can create SPDY client and server with the
current Spdylay API.

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

The following packages are needed to build the library:

* pkg-config >= 0.20
* zlib >= 1.2.3

To build and run the unit test programs, the following packages are
needed:

* cunit >= 2.1

To build and run the example programs, the following packages are
needed:

* OpenSSL >= 1.0.1

To enable ``-a`` option (getting linked assets from the downloaded
resource) in ``spdycat`` (one of the example program), the following
packages are needed:

* libxml2 >= 2.7.7

To build SPDY/HTTPS to HTTP reverse proxy ``shrpx`` (one of the
example program), the following packages are needed:

* libevent-openssl >= 2.0.8

If you are using Ubuntu 12.04, you need the following packages
installed::

    $ apt-get install autoconf automake autotools-dev libtool pkg-config zlib1g-dev libcunit1-dev libssl-dev libxml2-dev libevent-dev

Build from git
--------------

Building from git is easy, but please be sure that at least autoconf 2.68 is
used::

    $ autoreconf -i
    $ automake
    $ autoconf
    $ ./configure
    $ make

Building documentation
----------------------

To build documentation, run::

    $ make html

The documents will be generated under ``doc/manual/html/``.

The generated documents will not be installed with ``make install``.

Building Android binary
------------------------

In this section, we briefly describe how to build Android binary using
`Android NDK <http://developer.android.com/tools/sdk/ndk/index.html>`_
cross-compiler on Debian Linux.

We offer ``android-config`` and ``android-make`` scripts to make the
build easier. To make these script work, NDK toolchain must be
installed in the following way. First, let introduce ``ANDROID_HOME``
environment variable. We need to install toolchain under
``$ANDROID_HOME/toolchain``. An user can freely choose the path for
``ANDROID_HOME``.  For example, to install toolchain under
``$ANDROID_HOME/toolchain``, do this in the the directory where NDK is
unpacked::

    $ build/tools/make-standalone-toolchain.sh --platform=android-9 --install-dir=$ANDROID_HOME/toolchain

The platform level is not important here because we don't use Android
specific C/C++ API.

The dependent libraries, such as OpenSSL and libevent should be built
with the toolchain and installed under ``$ANDROID_HOME/usr/local``.
We recommend to build these libraries as static library to make the
deployment easier. libxml2 support is currently disabled.

We use zlib which comes with Android NDK, so we don't have to build it
by ourselves.

Before running ``android-config`` and ``android-make``,
``ANDOIRD_HOME`` environment variable must be set to point to the
correct path.

After ``android-config``, run ``android-make`` to compile sources.
``android-make`` is just include path to cross compiler in ``PATH``
and run make. So if you include path to corss compiler by yourself,
you can just run make to build spdylay and tools as usual.

API
---

The public API reference is available on online. Visit
http://tatsuhiro-t.github.io/spdylay/.  All public APIs are in
*spdylay/spdylay.h*. All public API functions as well as the callback
function typedefs are documented.

SPDY Client and Server Programs
-------------------------------

The *src* directory contains SPDY client and server implementations
using Spdylay library. These programs are intended to make sure that
Spdylay API is acutally usable for real implementation and also for
debugging purposes. Please note that OpenSSL with `NPN
<http://technotes.googlecode.com/git/nextprotoneg.html>`_ support is
required in order to build and run these programs.  At the time of
this writing, the OpenSSL 1.0.1 supports NPN.

Spdycat - SPDY client
+++++++++++++++++++++

The SPDY client is called ``spdycat``. It is a dead simple downloader
like wget/curl. It connects to SPDY server and gets resources given in
the command-line::

    $ src/spdycat -h
    Usage: spdycat [-Oansv23] [-t <SECONDS>] [-w <WINDOW_BITS>] [--cert=<CERT>]
                   [--key=<KEY>] [--no-tls] [-d <FILE>] [-m <N>] [-p <PROXY_HOST>]
                   [-P <PROXY_PORT>] <URI>...

    OPTIONS:
        -v, --verbose      Print debug information such as reception/
                           transmission of frames and name/value pairs.
        -n, --null-out     Discard downloaded data.
        -O, --remote-name  Save download data in the current directory.
                           The filename is dereived from URI. If URI
                           ends with '/', 'index.html' is used as a
                           filename. Not implemented yet.
        -2, --spdy2        Only use SPDY/2.
        -3, --spdy3        Only use SPDY/3.
        --spdy3-1          Only use SPDY/3.1.
        -t, --timeout=<N>  Timeout each request after <N> seconds.
        -w, --window-bits=<N>
                           Sets the initial window size to 2**<N>.
        -a, --get-assets   Download assets such as stylesheets, images
                           and script files linked from the downloaded
                           resource. Only links whose origins are the
                           same with the linking resource will be
                           downloaded.
        -s, --stat         Print statistics.
        -H, --header       Add a header to the requests.
        --cert=<CERT>      Use the specified client certificate file.
                           The file must be in PEM format.
        --key=<KEY>        Use the client private key file. The file
                           must be in PEM format.
        --no-tls           Disable SSL/TLS. Use -2, -3 or --spdy3-1 to
                           specify SPDY protocol version to use.
        -d, --data=<FILE>  Post FILE to server. If - is given, data
                           will be read from stdin.
        -m, --multiply=<N> Request each URI <N> times. By default, same
                           URI is not requested twice. This option
                           disables it too.
        -p, --proxy=<HOST> Use this host as a SPDY proxy
        -P, --proxy-port=<PORT>
                           Use this as the port of the SPDY proxy if
                           one is set
        --color            Force colored log output.

    $ src/spdycat -nv https://www.google.com/
    [  0.021] NPN select next protocol: the remote server offers:
              * spdy/4a4
              * spdy/3.1
              * spdy/3
              * http/1.1
              NPN selected the protocol: spdy/3.1
    [  0.029] Handshake complete
    [  0.029] recv SETTINGS frame <version=3, flags=0, length=20>
              (niv=2)
              [4(1):100]
              [7(0):1048576]
    [  0.029] recv WINDOW_UPDATE frame <version=3, flags=0, length=8>
              (stream_id=0, delta_window_size=983040)
    [  0.029] send SYN_STREAM frame <version=3, flags=1, length=221>
              (stream_id=1, assoc_stream_id=0, pri=3)
              :host: www.google.com
              :method: GET
              :path: /
              :scheme: https
              :version: HTTP/1.1
              accept: */*
              accept-encoding: gzip, deflate
              user-agent: spdylay/1.2.0-DEV
    [  0.080] recv SYN_REPLY frame <version=3, flags=0, length=619>
              (stream_id=1)
              :status: 302 Found
              :version: HTTP/1.1
              alternate-protocol: 443:quic
              cache-control: private
              content-length: 262
              content-type: text/html; charset=UTF-8
              date: Tue, 19 Nov 2013 13:47:18 GMT
              location: https://www.google.co.jp/
              server: gws
              x-frame-options: SAMEORIGIN
              x-xss-protection: 1; mode=block
    [  0.080] recv DATA frame (stream_id=1, flags=1, length=262)
    [  0.080] send GOAWAY frame <version=3, flags=0, length=8>
              (last_good_stream_id=0)

Spdyd - SPDY server
+++++++++++++++++++

SPDY server is called ``spdyd`` and serves static files. It is single
threaded and multiplexes connections using non-blocking socket. The
static files are read using blocking I/O system call, ``read(2)``. It
speaks SPDY/2 and SPDY/3::

    $ src/spdyd --htdocs=/your/htdocs/ -v 3000 server.key server.crt
    IPv4: listen on port 3000
    IPv6: listen on port 3000
    The negotiated next protocol: spdy/3.1
    [id=1] [  1.296] send SETTINGS frame <version=3, flags=0, length=12>
              (niv=1)
              [4(0):100]
    [id=1] [  1.297] recv SYN_STREAM frame <version=3, flags=1, length=228>
              (stream_id=1, assoc_stream_id=0, pri=3)
              :host: localhost:3000
              :method: GET
              :path: /README
              :scheme: https
              :version: HTTP/1.1
              accept: */*
              accept-encoding: gzip, deflate
              user-agent: spdylay/1.2.0-DEV
    [id=1] [  1.297] send SYN_REPLY frame <version=3, flags=0, length=116>
              (stream_id=1)
              :status: 200 OK
              :version: HTTP/1.1
              cache-control: max-age=3600
              content-length: 66
              date: Tue, 19 Nov 2013 14:35:24 GMT
              last-modified: Tue, 17 Jan 2012 15:39:01 GMT
              server: spdyd spdylay/1.2.0-DEV
    [id=1] [  1.297] send DATA frame (stream_id=1, flags=0, length=66)
    [id=1] [  1.297] send DATA frame (stream_id=1, flags=1, length=0)
    [id=1] [  1.297] stream_id=1 closed
    [id=1] [  1.297] recv GOAWAY frame <version=3, flags=0, length=8>
              (last_good_stream_id=0)
    [id=1] [  1.297] closed

Currently, ``spdyd`` needs ``epoll`` or ``kqueue``.

Shrpx - A reverse proxy for SPDY/HTTPS
++++++++++++++++++++++++++++++++++++++

For shrpx users who uses shrpx as SPDY proxy: Please consider
migrating to nghttpx developed at `nghttp2 project
<https://nghttp2.org>`_.  nghttpx supports SPDY proxy too.

The ``shrpx`` is a multi-threaded reverse proxy for SPDY/HTTPS.  It
converts SPDY/HTTPS traffic to plain HTTP.  It is initially developed
as a reverse proxy, but now it has other operation modes such as a
frontend forward proxy.  For example, with ``--spdy-proxy`` (``-s`` in
shorthand) option, it can be used as secure SPDY proxy with a proxy
(e.g., Squid) in the backend.  With ``--cliet-proxy`` (``-p``) option,
it acts like an ordinaly forward proxy but expects secure SPDY proxy
in the backend. Thus it becomes an adapter to secure SPDY proxy for
clients which does not support secure SPDY proxy. The another notable
operation mode is ``--spdy-relay``, which just relays SPDY/HTTPS
traffic to the backend in SPDY. The following table summarizes the
operation modes.

================== ========== ======= =============
Mode option        Frontend   Backend Note
================== ========== ======= =============
default            SPDY/HTTPS HTTP    Reverse proxy
``--spdy``         SPDY/HTTPS HTTP    SPDY proxy
``--spdy-relay``   SPDY/HTTPS SPDY
``--client``       HTTP       SPDY
``--client-proxy`` HTTP       SPDY    Forward proxy
================== ========== ======= =============

The ``shrpx`` supports configuration file. See ``--conf`` option and
sample configuration file ``shrpx.conf.sample``.

We briefly describe the architecture of ``shrpx`` here.  It has a
dedicated thread which listens on server sockets.  When it accepted
the incoming connection, it passes the file descriptor of the incoming
connection to one of the worker thread.  Each worker thread has its
own event loop and can handle many connections using non-blocking I/O.
The number of worker thread can be specified using the command-line
option. The `libevent <http://libevent.org/>`_ is used to handle
low-level network I/O.

Here is the command-line options::

    $ src/shrpx -h
    Usage: shrpx [-Dh] [-s|--client|-p] [-b <HOST,PORT>]
                 [-f <HOST,PORT>] [-n <CORES>] [-c <NUM>] [-L <LEVEL>]
                 [OPTIONS...] [<PRIVATE_KEY> <CERT>]

    A reverse proxy for SPDY/HTTPS.

    Positional arguments:
        <PRIVATE_KEY>      Set path to server's private key. Required
                           unless either -p or --client is specified.
        <CERT>             Set path to server's certificate. Required
                           unless either -p or --client is specified.

    OPTIONS:

      Connections:
        -b, --backend=<HOST,PORT>
                           Set backend host and port.
                           Default: '127.0.0.1,80'
        -f, --frontend=<HOST,PORT>
                           Set frontend host and port.
                           Default: '0.0.0.0,3000'
        --backlog=<NUM>    Set listen backlog size.
                           Default: 256
        --backend-ipv4     Resolve backend hostname to IPv4 address
                           only.
        --backend-ipv6     Resolve backend hostname to IPv6 address
                           only.

      Performance:
        -n, --workers=<CORES>
                           Set the number of worker threads.
                           Default: 1
        --read-rate=<RATE> Set maximum average read rate on frontend
                           connection. Setting 0 to this option means
                           read rate is unlimited.
                           Default: 1048576
        --read-burst=<SIZE>
                           Set maximum read burst size on frontend
                           connection. Setting 0 to this option means
                           read burst size is unlimited.
                           Default: 4194304
        --write-rate=<RATE>
                           Set maximum average write rate on frontend
                           connection. Setting 0 to this option means
                           write rate is unlimited.
                           Default: 0
        --write-burst=<SIZE>
                           Set maximum write burst size on frontend
                           connection. Setting 0 to this option means
                           write burst size is unlimited.
                           Default: 0

      Timeout:
        --frontend-spdy-read-timeout=<SEC>
                           Specify read timeout for SPDY frontend
                           connection. Default: 180
        --frontend-read-timeout=<SEC>
                           Specify read timeout for non-SPDY frontend
                           connection. Default: 180
        --frontend-write-timeout=<SEC>
                           Specify write timeout for both SPDY and
                           non-SPDY frontends.
                           connection. Default: 60
        --backend-read-timeout=<SEC>
                           Specify read timeout for backend connection.
                           Default: 900
        --backend-write-timeout=<SEC>
                           Specify write timeout for backend
                           connection. Default: 60
        --backend-keep-alive-timeout=<SEC>
                           Specify keep-alive timeout for backend
                           connection. Default: 60
        --backend-http-proxy-uri=<URI>
                           Specify proxy URI in the form
                           http://[<USER>:<PASS>@]<PROXY>:<PORT>. If
                           a proxy requires authentication, specify
                           <USER> and <PASS>. Note that they must be
                           properly percent-encoded. This proxy is used
                           when the backend connection is SPDY. First,
                           make a CONNECT request to the proxy and
                           it connects to the backend on behalf of
                           shrpx. This forms tunnel. After that, shrpx
                           performs SSL/TLS handshake with the
                           downstream through the tunnel. The timeouts
                           when connecting and making CONNECT request
                           can be specified by --backend-read-timeout
                           and --backend-write-timeout options.

      SSL/TLS:
        --ciphers=<SUITE>  Set allowed cipher list. The format of the
                           string is described in OpenSSL ciphers(1).
                           If this option is used, --honor-cipher-order
                           is implicitly enabled.
        --honor-cipher-order
                           Honor server cipher order, giving the
                           ability to mitigate BEAST attacks.
        -k, --insecure     When used with -p or --client, don't verify
                           backend server's certificate.
        --cacert=<PATH>    When used with -p or --client, set path to
                           trusted CA certificate file.
                           The file must be in PEM format. It can
                           contain multiple certificates. If the
                           linked OpenSSL is configured to load system
                           wide certificates, they are loaded
                           at startup regardless of this option.
        --private-key-passwd-file=<FILEPATH>
                           Path to file that contains password for the
                           server's private key. If none is given and
                           the private key is password protected it'll
                           be requested interactively.
        --subcert=<KEYPATH>:<CERTPATH>
                           Specify additional certificate and private
                           key file. Shrpx will choose certificates
                           based on the hostname indicated by client
                           using TLS SNI extension. This option can be
                           used multiple times.
        --backend-tls-sni-field=<HOST>
                           Explicitly set the content of the TLS SNI
                           extension.  This will default to the backend
                           HOST name.
        --dh-param-file=<PATH>
                           Path to file that contains DH parameters in
                           PEM format. Without this option, DHE cipher
                           suites are not available.
        --verify-client    Require and verify client certificate.
        --verify-client-cacert=<PATH>
                           Path to file that contains CA certificates
                           to verify client certificate.
                           The file must be in PEM format. It can
                           contain multiple certificates.
        --client-private-key-file=<PATH>
                           Path to file that contains client private
                           key used in backend client authentication.
        --client-cert-file=<PATH>
                           Path to file that contains client
                           certificate used in backend client
                           authentication.
        --tls-proto-list=<LIST>
                           Comma delimited list of SSL/TLS protocol to
                           be enabled.
                           The following protocols are available:
                           TLSv1.2, TLSv1.1, TLSv1.0, SSLv3
                           The name matching is done in case-insensitive
                           manner.
                           The parameter must be delimited by a single
                           comma only and any white spaces are treated
                           as a part of protocol string.
                           Default: TLSv1.2,TLSv1.1,TLSv1.0

      SPDY:
        -c, --spdy-max-concurrent-streams=<NUM>
                           Set the maximum number of the concurrent
                           streams in one SPDY session.
                           Default: 100
        --frontend-spdy-window-bits=<N>
                           Sets the per-stream initial window size of
                           SPDY frontend connection to 2**<N>.
                           Default: 16
        --frontend-spdy-connection-window-bits=<N>
                           Sets the per-connection window size of SPDY
                           frontend connection to 2**<N>.
                           Default: 16
        --frontend-spdy-no-tls
                           Disable SSL/TLS on frontend SPDY
                           connections. SPDY protocol must be specified
                           using --frontend-spdy-proto. This option
                           also disables frontend HTTP/1.1.
        --frontend-spdy-proto
                           Specify SPDY protocol used in frontend
                           connection if --frontend-spdy-no-tls is
                           used. Default: spdy/3.1
        --backend-spdy-window-bits=<N>
                           Sets the per-stream initial window size of
                           SPDY backend connection to 2**<N>.
                           Default: 16
        --backend-spdy-connection-window-bits=<N>
                           Sets the per-connection window size of SPDY
                           backend connection to 2**<N>.
                           Default: 16
        --backend-spdy-no-tls
                           Disable SSL/TLS on backend SPDY connections.
                           SPDY protocol must be specified using
                           --backend-spdy-proto
        --backend-spdy-proto
                           Specify SPDY protocol used in backend
                           connection if --backend-spdy-no-tls is used.
                           Default: spdy/3.1

      Mode:
        -s, --spdy-proxy   Enable secure SPDY proxy mode.
        --spdy-bridge      Communicate with the backend in SPDY. Thus
                           the incoming SPDY/HTTPS connections are
                           converted to SPDY connection and relayed to
                           the backend. See --backend-http-proxy-uri
                           option if you are behind the proxy and want
                           to connect to the outside SPDY proxy.
        --client           Instead of accepting SPDY/HTTPS connection,
                           accept HTTP connection and communicate with
                           backend server in SPDY. To use shrpx as
                           a forward proxy, use -p option instead.
        -p, --client-proxy Like --client option, but it also requires
                           the request path from frontend must be
                           an absolute URI, suitable for use as a
                           forward proxy.

      Logging:
        -L, --log-level=<LEVEL>
                           Set the severity level of log output.
                           INFO, WARNING, ERROR and FATAL.
                           Default: WARNING
        --accesslog        Print simple accesslog to stderr.
        --syslog           Send log messages to syslog.
        --syslog-facility=<FACILITY>
                           Set syslog facility.
                           Default: daemon

      Misc:
        --add-x-forwarded-for
                           Append X-Forwarded-For header field to the
                           downstream request.
        --no-via           Don't append to Via header field. If Via
                           header field is received, it is left
                           unaltered.
        -D, --daemon       Run in a background. If -D is used, the
                           current working directory is changed to '/'.
        --pid-file=<PATH>  Set path to save PID of this program.
        --user=<USER>      Run this program as USER. This option is
                           intended to be used to drop root privileges.
        --conf=<PATH>      Load configuration from PATH.
                           Default: /etc/shrpx/shrpx.conf
        -v, --version      Print version and exit.
        -h, --help         Print this help and exit.

For those of you who are curious, ``shrpx`` is an abbreviation of
"Spdy/https to Http Reverse ProXy".

Without any of ``-s``, ``--spdy-bridge``, ``-p`` and ``--client``
options, ``shrpx`` works as reverse proxy to the backend server::

    Client <-- (SPDY, HTTPS) --> Shrpx <-- (HTTP) --> Web Server
                            [reverse proxy]

With ``-s`` option, it works as secure SPDY proxy::

    Client <-- (SPDY, HTTPS) --> Shrpx <-- (HTTP) --> Proxy
                              [SPDY proxy]            (e.g., Squid)

The ``Client`` in the above is needs to be configured to use shrpx as
secure SPDY proxy.

At the time of this writing, Chrome is the only browser which supports
secure SPDY proxy. The one way to configure Chrome to use secure SPDY
proxy is create proxy.pac script like this::

    function FindProxyForURL(url, host) {
        return "HTTPS SERVERADDR:PORT";
    }

``SERVERADDR`` and ``PORT`` is the hostname/address and port of the
machine shrpx is running.  Please note that Chrome requires valid
certificate for secure SPDY proxy.

Then run chrome with the following arguments::

    $ google-chrome --proxy-pac-url=file:///path/to/proxy.pac --use-npn

.. note::

   At the time of this writing, Chrome 24 limits the maximum
   concurrent connections to the proxy to 32. And due to the
   limitation of socket pool handling in Chrome, it is quickly filled
   up if SPDY proxy is used and many SPDY sessions are established. If
   it reaches the limit, the new connections are simply blocked until
   existing connections are timed out. (See `Chrome Issue 92244
   <https://code.google.com/p/chromium/issues/detail?id=92244>`_). The
   workaround is make the number of maximum connections high, say, 99,
   which is the highest. To do this, you need to change so called
   Policy setup.  See `Policy Templates
   <http://dev.chromium.org/administrators/policy-templates>`_ for
   details how to change Policy setup on the platform you use.  The
   Policy name we are looking for is `MaxConnectionsPerProxy
   <http://dev.chromium.org/administrators/policy-list-3#MaxConnectionsPerProxy>`_
   For example, if you are using Linux, follow the instruction
   described in `Linux Quick Start
   <http://dev.chromium.org/administrators/linux-quick-start>`_ and
   create ``/etc/opt/chrome/policies/managed/test_policy.json`` file
   with the following content and restart Chrome::

       {
           "MaxConnectionsPerProxy" :99
       }

With ``--spdy-bridge``, it accepts SPDY/HTTPS connections and
communicates with backend in SPDY::

    Client <-- (SPDY, HTTPS) --> Shrpx <-- (SPDY) --> Web or SPDY Proxy etc
                              [SPDY bridge]           (e.g., shrpx -s)

With ``-p`` option, it works as forward proxy and expects that the
backend is secure SPDY proxy::

    Client <-- (HTTP) --> Shrpx <-- (SPDY) --> Secure SPDY Proxy
                     [forward proxy]         (e.g., shrpx -s or node-spdyproxy)

The ``Client`` is needs to be configured to use shrpx as forward proxy.

In this configuration, clients which do not support secure SPDY proxy
can use secure SPDY proxy through ``shrpx``. Putting ``shrpx`` in the
same box or same network with the clients, this configuration can
bring the benefits of secure SPDY proxy to those clients. Since the
maximum number of connections per server still applies in proxy
connection, the performance gain is not obvious. For example, if the
maximum number of connections per server is 6, after sending 6
requests to the proxy, client blocks further requests, which kills
performance which might be gained in SPDY connection.  For clients
which can tweak these values (e.g.,
``network.http.max-connections-per-server`` in Firefox), increasing
them may improve the performance.

With ``--client`` option, it works as reverse proxy and expects that
the backend is SPDY-enabled Web server::

    Client <-- (HTTP) --> Shrpx <-- (SPDY) --> Web Server
                     [reverse proxy]

For the operation modes which talk to the backend in SPDY, the backend
connections can be tunneled though HTTP proxy. The proxy is specified
using ``--backend-http-proxy-uri`` option. The following figure
illustrates the example of ``--spdy-bridge`` and
``--backend-http-proxy-uri`` option to talk to the outside SPDY proxy
through HTTP proxy::

    Client <-- (SPDY, HTTPS) --> Shrpx <-- (SPDY) --
                             [SPDY bridge]

            --===================---> SPDY Proxy
              (HTTP proxy tunnel)     (e.g., shrpx -s)

Examples
--------

The *examples* directory contains a simple SPDY client implementation
in C.

Python-Spdylay - Python Wrapper
-------------------------------

The library comes with Python wrapper ``python-spdylay``. See
``python`` directory.


================================================
FILE: android-config
================================================
#!/bin/sh
#
# Spdylay - SPDY Library
#
# Copyright (c) 2013 Tatsuhiro Tsujikawa
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

if [ -z "$ANDROID_HOME" ]; then
    echo 'No $ANDROID_HOME specified.'
    exit 1
fi
PREFIX=$ANDROID_HOME/usr/local
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH

./configure \
    --disable-shared \
    --host=arm-linux-androideabi \
    --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
    --without-libxml2 \
    CPPFLAGS="-I$PREFIX/include" \
    PKG_CONFIG_LIBDIR="$PREFIX/lib/pkgconfig" \
    LDFLAGS="-L$PREFIX/lib"


================================================
FILE: android-make
================================================
#!/bin/sh
#
# Spdylay - SPDY Library
#
# Copyright (c) 2013 Tatsuhiro Tsujikawa
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

if [ -z "$ANDROID_HOME" ]; then
    echo 'No $ANDROID_HOME specified.'
    exit 1
fi
TOOLCHAIN=$ANDROID_HOME/toolchain
PATH=$TOOLCHAIN/bin:$PATH

make "$@"


================================================
FILE: configure.ac
================================================
dnl Spdylay - SPDY Library

dnl Copyright (c) 2012 Tatsuhiro Tsujikawa

dnl Permission is hereby granted, free of charge, to any person obtaining
dnl a copy of this software and associated documentation files (the
dnl "Software"), to deal in the Software without restriction, including
dnl without limitation the rights to use, copy, modify, merge, publish,
dnl distribute, sublicense, and/or sell copies of the Software, and to
dnl permit persons to whom the Software is furnished to do so, subject to
dnl the following conditions:

dnl The above copyright notice and this permission notice shall be
dnl included in all copies or substantial portions of the Software.

dnl THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
dnl EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
dnl MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
dnl NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
dnl LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
dnl OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
dnl WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
AC_PREREQ(2.61)
AC_INIT([spdylay], [1.4.1-DEV], [t-tujikawa@users.sourceforge.net])
LT_PREREQ([2.2.6])
LT_INIT()
dnl See versioning rule:
dnl  http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
AC_SUBST(LT_CURRENT, 9)
AC_SUBST(LT_REVISION, 1)
AC_SUBST(LT_AGE, 2)

AC_CANONICAL_BUILD
AC_CANONICAL_HOST
AC_CANONICAL_TARGET

AC_CONFIG_MACRO_DIR([m4])

AM_INIT_AUTOMAKE([subdir-objects])
AC_CONFIG_HEADERS([config.h])

dnl Checks for command-line options
AC_ARG_ENABLE([maintainer-mode],
    [AS_HELP_STRING([--enable-maintainer-mode],
                    [Turn on compile time warnings])],
    [maintainer_mode=$enableval], [maintainer_mode=no])

AC_ARG_ENABLE([src],
    [AS_HELP_STRING([--enable-src],
                    [Build installable SPDY client/server programs in src])],
    [request_src=$enableval], [request_src=yes])

AC_ARG_ENABLE([examples],
    [AS_HELP_STRING([--enable-examples],
                    [Build example programs])],
    [request_examples=$enableval], [request_examples=yes])

AC_ARG_WITH([libxml2],
    [AS_HELP_STRING([--without-libxml2],
                    [disable support for libxml2])],
    [], [with_libxml2=yes])

dnl Checks for programs
AC_PROG_CC
AC_PROG_CXX
AC_PROG_INSTALL
AC_PROG_LN_S
AC_PROG_MAKE_SET
AM_PROG_CC_C_O
PKG_PROG_PKG_CONFIG([0.20])

#
# If we're running GCC or clang define _U_ to be "__attribute__((unused))"
# so we can use _U_ to flag unused function parameters and not get warnings
# about them. Otherwise, define _U_ to be an empty string so that _U_ used
# to flag an unused function parameters will compile with other compilers.
#
# XXX - similar hints for other compilers?
#
if test "x$GCC" = "xyes" -o "x$CC" = "xclang" ; then
  AC_DEFINE([_U_], [__attribute__((unused))], [Hint to the compiler that a function parameters is not used])
else
  AC_DEFINE([_U_], , [Hint to the compiler that a function parameters is not used])
fi

AC_COMPILE_STDCXX_11
AM_CONDITIONAL([HAVE_STDCXX_11],
               [ test "x$ac_cv_cxx_compile_cxx11_cxx" = "xyes" ])

# Checks for libraries.

# Additional libraries required for tests.
TESTS_LIBS=

# Additional libraries required for programs under src directory.
SRC_LIBS=

LIBS_OLD=$LIBS
# Search for dlsym function, which is used in tests. Linux needs -ldl,
# but netbsd does not need it.
AC_SEARCH_LIBS([dlsym], [dl])
TESTS_LIBS="$LIBS $TESTS_LIBS"
LIBS=$LIBS_OLD

LIBS_OLD=$LIBS
AC_SEARCH_LIBS([clock_gettime], [rt],
               [AC_DEFINE([HAVE_CLOCK_GETTIME], [1],
                          [Define to 1 if you have the `clock_gettime`.])])
SRC_LIBS="$LIBS $SRC_LIBS"
LIBS=$LIBS_OLD

case "$host" in
  *android*)
    android_build=yes
    # android does not need -pthread, but needs followng 2 libs for C++
    SRC_LIBS="$SRC_LIBS -lstdc++ -lsupc++"
    ;;
  *)
    SRC_LIBS="$SRC_LIBS -pthread"
    ;;
esac

# zlib
if test "x$android_build" = "xyes"; then
  # Use zlib provided by NDK
  LIBS="-lz $LIBS"
else
  PKG_CHECK_MODULES([ZLIB], [zlib >= 1.2.3])
  LIBS="$ZLIB_LIBS $LIBS"
  CFLAGS="$CFLAGS $ZLIB_CFLAGS"
fi

# cunit
PKG_CHECK_MODULES([CUNIT], [cunit >= 2.1], [have_cunit=yes], [have_cunit=no])
# If pkg-config does not find cunit, check it using AC_CHECK_LIB.  We
# do this because Debian (Ubuntu) lacks pkg-config file for cunit.
if test "x${have_cunit}" = "xno"; then
  AC_MSG_WARN([${CUNIT_PKG_ERRORS}])
  AC_CHECK_LIB([cunit], [CU_initialize_registry],
               [have_cunit=yes], [have_cunit=no])
  if test "x${have_cunit}" = "xyes"; then
    CUNIT_LIBS="-lcunit"
    CUNIT_CFLAGS=""
    AC_SUBST([CUNIT_LIBS])
    AC_SUBST([CUNIT_CFLAGS])
  fi
fi
if test "x${have_cunit}" = "xyes"; then
  # cunit in Mac OS X requires ncurses. Note that in Mac OS X, test
  # program can be built without -lncurses, but it emits runtime
  # error.
  case "${build}" in
    *-apple-darwin*)
      CUNIT_LIBS="$CUNIT_LIBS -lncurses"
      AC_SUBST([CUNIT_LIBS])
      ;;
  esac
fi

AM_CONDITIONAL([HAVE_CUNIT], [ test "x${have_cunit}" = "xyes" ])

# openssl (for examples)
PKG_CHECK_MODULES([OPENSSL], [openssl >= 1.0.1],
                  [have_openssl=yes], [have_openssl=no])
if test "x${have_openssl}" = "xno"; then
  AC_MSG_NOTICE($OPENSSL_PKG_ERRORS)
  AC_MSG_NOTICE([The example programs will not be built.])
fi

# libevent_openssl
# 2.0.8 is required because we use evconnlistener_set_error_cb()
PKG_CHECK_MODULES([LIBEVENT_OPENSSL], [libevent_openssl >= 2.0.8],
                  [have_libevent_openssl=yes], [have_libevent_openssl=no])
if test "x${have_libevent_openssl}" = "xno"; then
  AC_MSG_NOTICE($LIBEVENT_OPENSSL_PKG_ERRORS)
  AC_MSG_NOTICE([Shrpx example program will not be built.])
fi
AM_CONDITIONAL([HAVE_LIBEVENT_OPENSSL],
               [ test "x${have_libevent_openssl}" = "xyes" ])

# libxml2 (for examples/spdycat)
have_libxml2=no
if test "x$with_libxml2" != "xno"; then
  AM_PATH_XML2(2.7.7, [have_libxml2=yes], [have_libxml2=no])
  if test "x${have_libxml2}" = "xyes"; then
    AC_DEFINE([HAVE_LIBXML2], [1], [Define to 1 if you have `libxml2` library.])
  fi
fi
AM_CONDITIONAL([HAVE_LIBXML2], [ test "x${have_libxml2}" = "xyes" ])

# The src programs depend on OpenSSL
enable_src=no
if test "x${request_src}" = "xyes" &&
   test "x${have_openssl}" = "xyes"; then
    enable_src=yes
fi

AM_CONDITIONAL([ENABLE_SRC], [ test "x${enable_src}" = "xyes" ])

# The example programs depend on OpenSSL
enable_examples=no
if test "x${request_examples}" = "xyes" &&
   test "x${have_openssl}" = "xyes"; then
    enable_examples=yes
fi

AM_CONDITIONAL([ENABLE_EXAMPLES], [ test "x${enable_examples}" = "xyes" ])

# Checks for header files.
AC_CHECK_HEADERS([ \
  arpa/inet.h \
  netinet/in.h \
  pwd.h \
  stddef.h \
  stdint.h \
  stdlib.h \
  string.h \
  time.h \
  unistd.h \
])

case "${host}" in
  *mingw*)
    # For ntohl, ntohs in Windows
    AC_CHECK_HEADERS([winsock2.h])
    ;;
esac

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_SIZE_T
AC_TYPE_SSIZE_T
AC_TYPE_UINT8_T
AC_TYPE_UINT16_T
AC_TYPE_UINT32_T
AC_TYPE_UINT64_T
AC_CHECK_TYPES([ptrdiff_t])
AC_C_BIGENDIAN
AC_SYS_LARGEFILE

# Checks for library functions.
if test "x$cross_compiling" != "xyes"; then
  AC_FUNC_MALLOC
fi
AC_CHECK_FUNCS([ \
  getpwnam \
  memmove \
  memset \
  timegm \
])

AX_HAVE_EPOLL([have_epoll=yes], [have_epoll=no])
if test "x${have_epoll}" = "xyes"; then
  AC_DEFINE([HAVE_EPOLL], [1], [Define to 1 if you have the `epoll`.])
fi
AM_CONDITIONAL([HAVE_EPOLL], [ test "x${have_epoll}" = "xyes" ])

AC_CHECK_FUNCS([kqueue], [have_kqueue=yes])
AM_CONDITIONAL([HAVE_KQUEUE], [ test "x${have_kqueue}" = "xyes" ])

AM_CONDITIONAL([ENABLE_SPDYD],
         [ test "x${have_epoll}" = "xyes" || test "x${have_kqueue}" = "xyes" ])

AC_LANG_PUSH(C++)
AC_MSG_CHECKING([whether struct kevent.udata is intptr_t])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <sys/types.h>
#include <sys/event.h>
#include <sys/time.h>
]],
[[
struct kevent event;
event.udata = (intptr_t)(&event);
]])],
[kevent_udata_intptr_t=yes], [kevent_udata_intptr_t=no])
AC_MSG_RESULT([$kevent_udata_intptr_t])
if test "x$kevent_udata_intptr_t" = "xyes"; then
  AC_DEFINE([KEVENT_UDATA_INTPTR_T], [1],
            [Define to 1 if struct kevent.udata is intptr_t])
fi
AC_LANG_POP()

dnl Windows library for winsock2
case "${host}" in
  *mingw*)
    LIBS="$LIBS -lws2_32"
    ;;
esac

if test "x$maintainer_mode" != "xno"; then
    AX_CHECK_COMPILE_FLAG([-Wall], [CFLAGS="$CFLAGS -Wall"])
    AX_CHECK_COMPILE_FLAG([-Wextra], [CFLAGS="$CFLAGS -Wextra"])
    AX_CHECK_COMPILE_FLAG([-Werror], [CFLAGS="$CFLAGS -Werror"])
    AX_CHECK_COMPILE_FLAG([-Wmissing-prototypes], [CFLAGS="$CFLAGS -Wmissing-prototypes"])
    AX_CHECK_COMPILE_FLAG([-Wstrict-prototypes], [CFLAGS="$CFLAGS -Wstrict-prototypes"])
    AX_CHECK_COMPILE_FLAG([-Wmissing-declarations], [CFLAGS="$CFLAGS -Wmissing-declarations"])
    AX_CHECK_COMPILE_FLAG([-Wpointer-arith], [CFLAGS="$CFLAGS -Wpointer-arith"])
    AX_CHECK_COMPILE_FLAG([-Wdeclaration-after-statement], [CFLAGS="$CFLAGS -Wdeclaration-after-statement"])
    AX_CHECK_COMPILE_FLAG([-Wformat-security], [CFLAGS="$CFLAGS -Wformat-security"])
    AX_CHECK_COMPILE_FLAG([-Wwrite-strings], [CFLAGS="$CFLAGS -Wwrite-strings"])
    AX_CHECK_COMPILE_FLAG([-Wshadow], [CFLAGS="$CFLAGS -Wshadow"])
    AX_CHECK_COMPILE_FLAG([-Winline], [CFLAGS="$CFLAGS -Winline"])
    AX_CHECK_COMPILE_FLAG([-Wnested-externs], [CFLAGS="$CFLAGS -Wnested-externs"])
    AX_CHECK_COMPILE_FLAG([-Wfloat-equal], [CFLAGS="$CFLAGS -Wfloat-equal"])
    AX_CHECK_COMPILE_FLAG([-Wundef], [CFLAGS="$CFLAGS -Wundef"])
    AX_CHECK_COMPILE_FLAG([-Wendif-labels], [CFLAGS="$CFLAGS -Wendif-labels"])
    AX_CHECK_COMPILE_FLAG([-Wempty-body], [CFLAGS="$CFLAGS -Wempty-body"])
    AX_CHECK_COMPILE_FLAG([-Wcast-align], [CFLAGS="$CFLAGS -Wcast-align"])
    AX_CHECK_COMPILE_FLAG([-Wclobbered], [CFLAGS="$CFLAGS -Wclobbered"])
    AX_CHECK_COMPILE_FLAG([-Wvla], [CFLAGS="$CFLAGS -Wvla"])
    AX_CHECK_COMPILE_FLAG([-Wpragmas], [CFLAGS="$CFLAGS -Wpragmas"])
    AX_CHECK_COMPILE_FLAG([-Wunreachable-code], [CFLAGS="$CFLAGS -Wunreachable-code"])
    AX_CHECK_COMPILE_FLAG([-Waddress], [CFLAGS="$CFLAGS -Waddress"])
    AX_CHECK_COMPILE_FLAG([-Wattributes], [CFLAGS="$CFLAGS -Wattributes"])
    AX_CHECK_COMPILE_FLAG([-Wdiv-by-zero], [CFLAGS="$CFLAGS -Wdiv-by-zero"])
    AX_CHECK_COMPILE_FLAG([-Wshorten-64-to-32], [CFLAGS="$CFLAGS -Wshorten-64-to-32"])

    # Only work with Clang for the moment
    AX_CHECK_COMPILE_FLAG([-Wheader-guard], [CFLAGS="$CFLAGS -Wheader-guard"])
fi

AC_SUBST([TESTS_LIBS])
AC_SUBST([SRC_LIBS])

AC_CONFIG_FILES([
  Makefile
  lib/Makefile
  lib/libspdylay.pc
  lib/includes/Makefile
  lib/includes/spdylay/spdylayver.h
  tests/Makefile
  tests/testdata/Makefile
  src/Makefile
  examples/Makefile
  doc/Makefile
  doc/conf.py
  python/Makefile
])
AC_OUTPUT

AC_MSG_NOTICE([summary of build options:

    Version:        ${VERSION} shared $LT_CURRENT:$LT_REVISION:$LT_AGE
    Host type:      ${host}
    Install prefix: ${prefix}
    C compiler:     ${CC}
    CFLAGS:         ${CFLAGS}
    LDFLAGS:        ${LDFLAGS}
    LIBS:           ${LIBS}
    CPPFLAGS:       ${CPPFLAGS}
    C preprocessor: ${CPP}
    C++ compiler:   ${CXX}
    CXXFLAGS:       ${CXXFLAGS}
    CXXCPP:         ${CXXCPP}
    Library types:  Shared=${enable_shared}, Static=${enable_static}
    CUnit:          ${have_cunit}
    OpenSSL:        ${have_openssl}
    Libxml2:        ${have_libxml2}
    Libevent(SSL):  ${have_libevent_openssl}
    Src:            ${enable_src}
    Examples:       ${enable_examples}
])


================================================
FILE: doc/.gitignore
================================================
apiref.rst
conf.py
manual


================================================
FILE: doc/Makefile.am
================================================
# Spdylay - SPDY Library

# Copyright (c) 2012 Tatsuhiro Tsujikawa

# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:

# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

EXTRA_DIST = README.rst apiref-header.rst index.rst mkapiref.py python.rst \
	package_README.rst android-spdy-proxy.rst \
	_themes/sphinx_rtd_theme/footer.html \
	_themes/sphinx_rtd_theme/theme.conf \
	_themes/sphinx_rtd_theme/layout_old.html \
	_themes/sphinx_rtd_theme/__init__.py \
	_themes/sphinx_rtd_theme/layout.html \
	_themes/sphinx_rtd_theme/search.html \
	_themes/sphinx_rtd_theme/breadcrumbs.html \
	_themes/sphinx_rtd_theme/versions.html \
	_themes/sphinx_rtd_theme/searchbox.html \
	_themes/sphinx_rtd_theme/static/fonts/FontAwesome.otf \
	_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.svg \
	_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.woff \
	_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.eot \
	_themes/sphinx_rtd_theme/static/fonts/fontawesome-webfont.ttf \
	_themes/sphinx_rtd_theme/static/js/theme.js \
	_themes/sphinx_rtd_theme/static/css/theme.css \
	_themes/sphinx_rtd_theme/static/css/badge_only.css

# Makefile for Sphinx documentation
#

# You can set these variables from the command line.
SPHINXOPTS    =
SPHINXBUILD   = sphinx-build
PAPER         =
BUILDDIR      = manual

# Internal variables.
PAPEROPT_a4     = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .

.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest

help:
	@echo "Please use \`make <target>' where <target> is one of"
	@echo "  html       to make standalone HTML files"
	@echo "  dirhtml    to make HTML files named index.html in directories"
	@echo "  singlehtml to make a single large HTML file"
	@echo "  pickle     to make pickle files"
	@echo "  json       to make JSON files"
	@echo "  htmlhelp   to make HTML files and a HTML help project"
	@echo "  qthelp     to make HTML files and a qthelp project"
	@echo "  devhelp    to make HTML files and a Devhelp project"
	@echo "  epub       to make an epub"
	@echo "  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
	@echo "  latexpdf   to make LaTeX files and run them through pdflatex"
	@echo "  text       to make text files"
	@echo "  man        to make manual pages"
	@echo "  changes    to make an overview of all changed/added/deprecated items"
	@echo "  linkcheck  to check all external links for integrity"
	@echo "  doctest    to run all doctests embedded in the documentation (if enabled)"

apiref.rst: $(top_builddir)/lib/includes/spdylay/spdylayver.h \
	$(top_builddir)/lib/includes/spdylay/spdylay.h
	$(builddir)/mkapiref.py --header apiref-header.rst $^ > $@

clean:
	-rm apiref.rst
	-rm -rf $(BUILDDIR)/*

html: apiref.rst
	$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."

dirhtml:
	$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
	@echo
	@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."

singlehtml:
	$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
	@echo
	@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."

pickle:
	$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
	@echo
	@echo "Build finished; now you can process the pickle files."

json:
	$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
	@echo
	@echo "Build finished; now you can process the JSON files."

htmlhelp:
	$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
	@echo
	@echo "Build finished; now you can run HTML Help Workshop with the" \
	      ".hhp project file in $(BUILDDIR)/htmlhelp."

qthelp:
	$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
	@echo
	@echo "Build finished; now you can run "qcollectiongenerator" with the" \
	      ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
	@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Spdylay.qhcp"
	@echo "To view the help file:"
	@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Spdylay.qhc"

devhelp:
	$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
	@echo
	@echo "Build finished."
	@echo "To view the help file:"
	@echo "# mkdir -p $$HOME/.local/share/devhelp/Spdylay"
	@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Spdylay"
	@echo "# devhelp"

epub:
	$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
	@echo
	@echo "Build finished. The epub file is in $(BUILDDIR)/epub."

latex:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo
	@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
	@echo "Run \`make' in that directory to run these through (pdf)latex" \
	      "(use \`make latexpdf' here to do that automatically)."

latexpdf:
	$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
	@echo "Running LaTeX files through pdflatex..."
	$(MAKE) -C $(BUILDDIR)/latex all-pdf
	@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."

text:
	$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
	@echo
	@echo "Build finished. The text files are in $(BUILDDIR)/text."

man:
	$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
	@echo
	@echo "Build finished. The manual pages are in $(BUILDDIR)/man."

changes:
	$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
	@echo
	@echo "The overview file is in $(BUILDDIR)/changes."

linkcheck:
	$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
	@echo
	@echo "Link check complete; look for any errors in the above output " \
	      "or in $(BUILDDIR)/linkcheck/output.txt."

doctest:
	$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
	@echo "Testing of doctests in the sources finished, look at the " \
	      "results in $(BUILDDIR)/doctest/output.txt."


================================================
FILE: doc/README.rst
================================================
Spdylay Documentation
=====================

The documentation of Spdylay is generated using Sphinx.  This
directory contains the source files to be processed by Sphinx.  The
source file for API reference is generated using a script called
``mkapiref.py`` from the Spdylay C source code.

Generating API reference
------------------------

As described earlier, we use ``mkapiref.py`` to generate rst formatted
text of API reference from C source code.  The ``mkapiref.py`` is not
so flexible and it requires that C source code is formatted in rather
strict rules.

To generate API reference, just run ``make html``. It runs
``mkapiref.py`` and then run Sphinx to build the entire document.

The ``mkapiref.py`` reads C source code and searches the comment block
starts with ``/**``. In other words, it only processes the comment
block starting ``/**``. The comment block must end with ``*/``. The
``mkapiref.py`` requires that which type of the object this comment
block refers to.  To specify the type of the object, the next line
must contain the so-caled action keyword.  Currently, the following
action keywords are supported: ``@function``, ``@functypedef``,
``@enum``, ``@struct`` and ``@union``. The following sections
describes each action keyword.

@function
#########

``@function`` is used to refer to the function.  The comment block is
used for the document for the function.  After the script sees the end
of the comment block, it consumes the lines as the function
declaration until the line which ends with ``;`` is encountered.

In Sphinx doc, usually the function argument is formatted like
``*this*``.  But in C, ``*`` is used for dereferencing a pointer and
we must escape ``*`` with a back slash. To avoid this, we format the
argument like ``|this|``. The ``mkapiref.py`` translates it with
``*this*``, as escaping ``*`` inside ``|`` and ``|`` as necessary.
Note that this shadows the substitution feature of Sphinx.

The example follows::

    /**
     * @function
     *
     * Submits PING frame to the |session|.
     */
    int spdylay_submit_ping(spdylay_session *session);


@functypedef
############

``@functypedef`` is used to refer to the typedef of the function
pointer. The formatting rule is pretty much the same with
``@function``, but this outputs ``type`` domain, rather than
``function`` domain.

The example follows::

    /**
     * @functypedef
     *
     * Callback function invoked when |session| wants to send data to
     * remote peer.
     */
    typedef ssize_t (*spdylay_send_callback)
    (spdylay_session *session,
     const uint8_t *data, size_t length, int flags, void *user_data);

@enum
#####

``@enum`` is used to refer to the enum.  Currently, only enum typedefs
are supported.  The comment block is used for the document for the
enum type itself. To document each values, put comment block starting
with the line ``/**`` and ending with the ``*/`` just before the enum
value.  When the line starts with ``}`` is encountered, the
``mkapiref.py`` extracts strings next to ``}`` as the name of enum.

At the time of this writing, Sphinx does not support enum type. So we
use ``type`` domain for enum it self and ``macro`` domain for each
value. To refer to the enum value, use ``:enum:`` pseudo role. The
``mkapiref.py`` replaces it with ``:macro:``. By doing this, when
Sphinx will support enum officially, we can replace ``:enum:`` with
the official role easily.

The example follows::

    /**
     * @enum
     * Error codes used in the Spdylay library.
     */
    typedef enum {
      /**
       * Invalid argument passed.
       */
      SPDYLAY_ERR_INVALID_ARGUMENT = -501,
      /**
       * Zlib error.
       */
      SPDYLAY_ERR_ZLIB = -502,
    } spdylay_error;

@struct
#######

``@struct`` is used to refer to the struct. Currently, only struct
typedefs are supported. The comment block is used for the document for
the struct type itself.To document each member, put comment block
starting with the line ``/**`` and ending with the ``*/`` just before
the member.  When the line starts with ``}`` is encountered, the
``mkapiref.py`` extracts strings next to ``}`` as the name of struct.
The block-less typedef is also supported. In this case, typedef
declaration must be all in one line and the ``mkapiref.py`` uses last
word as the name of struct.

Some examples follow::
    
    /**
     * @struct
     * The control frame header.
     */
    typedef struct {
      /**
       * SPDY protocol version.
       */
      uint16_t version;
      /**
       * The type of this control frame.
       */
      uint16_t type;
      /**
       * The control frame flags.
       */
      uint8_t flags;
      /**
       * The length field of this control frame.
       */
      int32_t length;
    } spdylay_ctrl_hd;
        
    /**
     * @struct
     *
     * The primary structure to hold the resources needed for a SPDY
     * session. The details of this structure is hidden from the public
     * API.
     */
    typedef struct spdylay_session spdylay_session;

@union
######

``@union`` is used to refer to the union. Currently, ``@union`` is an
alias of ``@struct``.


================================================
FILE: doc/_themes/sphinx_rtd_theme/__init__.py
================================================
"""Sphinx ReadTheDocs theme.

From https://github.com/ryan-roemer/sphinx-bootstrap-theme.

"""
import os

VERSION = (0, 1, 5)

__version__ = ".".join(str(v) for v in VERSION)
__version_full__ = __version__


def get_html_theme_path():
    """Return list of HTML theme paths."""
    cur_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
    return cur_dir


================================================
FILE: doc/_themes/sphinx_rtd_theme/breadcrumbs.html
================================================
<div role="navigation" aria-label="breadcrumbs navigation">
  <ul class="wy-breadcrumbs">
    <li><a href="{{ pathto(master_doc) }}">Docs</a> &raquo;</li>
      {% for doc in parents %}
          <li><a href="{{ doc.link|e }}">{{ doc.title }}</a> &raquo;</li>
      {% endfor %}
    <li>{{ title }}</li>
      <li class="wy-breadcrumbs-aside">
        {% if display_github %}
          <a href="https://github.com/{{ github_user }}/{{ github_repo }}/blob/{{ github_version }}{{ conf_py_path }}{{ pagename }}{{ source_suffix }}" class="fa fa-github"> Edit on GitHub</a>
        {% elif display_bitbucket %}
          <a href="https://bitbucket.org/{{ bitbucket_user }}/{{ bitbucket_repo }}/src/{{ bitbucket_version}}{{ conf_py_path }}{{ pagename }}{{ source_suffix }}" class="fa fa-bitbucket"> Edit on Bitbucket</a>
        {% elif show_source and has_source and sourcename %}
          <a href="{{ pathto('_sources/' + sourcename, true)|e }}" rel="nofollow"> View page source</a>
        {% endif %}
      </li>
  </ul>
  <hr/>
</div>


================================================
FILE: doc/_themes/sphinx_rtd_theme/footer.html
================================================
<footer>
  {% if next or prev %}
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      {% if next %}
        <a href="{{ next.link|e }}" class="btn btn-neutral float-right" title="{{ next.title|striptags|e }}">Next <span class="fa fa-arrow-circle-right"></span></a>
      {% endif %}
      {% if prev %}
        <a href="{{ prev.link|e }}" class="btn btn-neutral" title="{{ prev.title|striptags|e }}"><span class="fa fa-arrow-circle-left"></span> Previous</a>
      {% endif %}
    </div>
  {% endif %}

  <hr/>

  <div role="contentinfo">
    <p>
    {%- if show_copyright %}
      {%- if hasdoc('copyright') %}
        {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
      {%- else %}
        {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
      {%- endif %}
    {%- endif %}

    {%- if last_updated %}
      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
    {%- endif %}
    </p>
  </div>

  {% trans %}<a href="https://github.com/snide/sphinx_rtd_theme">Sphinx theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>{% endtrans %}
</footer>


================================================
FILE: doc/_themes/sphinx_rtd_theme/layout.html
================================================
{# TEMPLATE VAR SETTINGS #}
{%- set url_root = pathto('', 1) %}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
{%- if not embedded and docstitle %}
  {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
{%- else %}
  {%- set titlesuffix = "" %}
{%- endif %}

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  {% block htmltitle %}
  <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
  {% endblock %}

  {# FAVICON #}
  {% if favicon %}
    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
  {% endif %}

  {# CSS #}
  <link href='https://fonts.googleapis.com/css?family=Lato:400,700|Roboto+Slab:400,700|Inconsolata:400,700' rel='stylesheet' type='text/css'>

  {# OPENSEARCH #}
  {% if not embedded %}
    {% if use_opensearch %}
      <link rel="search" type="application/opensearchdescription+xml" title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" href="{{ pathto('_static/opensearch.xml', 1) }}"/>
    {% endif %}

  {% endif %}

  {# RTD hosts this file, so just load on non RTD builds #}
  {% if not READTHEDOCS %}
    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
  {% endif %}

  {% for cssfile in css_files %}
    <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
  {% endfor %}

  {%- block linktags %}
    {%- if hasdoc('about') %}
        <link rel="author" title="{{ _('About these documents') }}"
              href="{{ pathto('about') }}"/>
    {%- endif %}
    {%- if hasdoc('genindex') %}
        <link rel="index" title="{{ _('Index') }}"
              href="{{ pathto('genindex') }}"/>
    {%- endif %}
    {%- if hasdoc('search') %}
        <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}"/>
    {%- endif %}
    {%- if hasdoc('copyright') %}
        <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}"/>
    {%- endif %}
    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}"/>
    {%- if parents %}
        <link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}"/>
    {%- endif %}
    {%- if next %}
        <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}"/>
    {%- endif %}
    {%- if prev %}
        <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}"/>
    {%- endif %}
  {%- endblock %}
  {%- block extrahead %} {% endblock %}

  {# Keep modernizr in head - http://modernizr.com/docs/#installing #}
  <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.6.2/modernizr.min.js"></script>

</head>

<body class="wy-body-for-nav" role="document">

  <div class="wy-grid-for-nav">

    {# SIDE NAV, TOGGLES ON MOBILE #}
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-nav-search">
        <a href="{{ pathto(master_doc) }}" class="fa fa-home"> {{ project }}</a>
        {% include "searchbox.html" %}
      </div>

      <div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
        {% set toctree = toctree(maxdepth=2, collapse=False, includehidden=True) %}
        {% if toctree %}
            {{ toctree }}
        {% else %}
            <!-- Local TOC -->
            <div class="local-toc">{{ toc }}</div>
        {% endif %}
      </div>
      &nbsp;
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">

      {# MOBILE NAV, TRIGGLES SIDE NAV ON TOGGLE #}
      <nav class="wy-nav-top" role="navigation" aria-label="top navigation">
        <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
        <a href="{{ pathto(master_doc) }}">{{ project }}</a>
      </nav>


      {# PAGE CONTENT #}
      <div class="wy-nav-content">
        <div class="rst-content">
          {% include "breadcrumbs.html" %}
          <div role="main">
            {% block body %}{% endblock %}
          </div>
          {% include "footer.html" %}
        </div>
      </div>

    </section>

  </div>
  {% include "versions.html" %}

  {% if not embedded %}

    <script type="text/javascript">
        var DOCUMENTATION_OPTIONS = {
            URL_ROOT:'{{ url_root }}',
            VERSION:'{{ release|e }}',
            COLLAPSE_INDEX:false,
            FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
            HAS_SOURCE:  {{ has_source|lower }}
        };
    </script>
    {%- for scriptfile in script_files %}
      <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
    {%- endfor %}

  {% endif %}

  {# RTD hosts this file, so just load on non RTD builds #}
  {% if not READTHEDOCS %}
    <script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
  {% endif %}

  {# STICKY NAVIGATION #}
  {% if theme_sticky_navigation %}
  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.StickyNav.enable();
      });
  </script>
  {% endif %}

  {%- block footer %} {% endblock %}

</body>
</html>


================================================
FILE: doc/_themes/sphinx_rtd_theme/layout_old.html
================================================
{#
    basic/layout.html
    ~~~~~~~~~~~~~~~~~

    Master layout template for Sphinx themes.

    :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
#}
{%- block doctype -%}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
{%- endblock %}
{%- set reldelim1 = reldelim1 is not defined and ' &raquo;' or reldelim1 %}
{%- set reldelim2 = reldelim2 is not defined and ' |' or reldelim2 %}
{%- set render_sidebar = (not embedded) and (not theme_nosidebar|tobool) and
                         (sidebars != []) %}
{%- set url_root = pathto('', 1) %}
{# XXX necessary? #}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
{%- if not embedded and docstitle %}
  {%- set titlesuffix = " &mdash; "|safe + docstitle|e %}
{%- else %}
  {%- set titlesuffix = "" %}
{%- endif %}

{%- macro relbar() %}
    <div class="related">
      <h3>{{ _('Navigation') }}</h3>
      <ul>
        {%- for rellink in rellinks %}
        <li class="right" {% if loop.first %}style="margin-right: 10px"{% endif %}>
          <a href="{{ pathto(rellink[0]) }}" title="{{ rellink[1]|striptags|e }}"
             {{ accesskey(rellink[2]) }}>{{ rellink[3] }}</a>
          {%- if not loop.first %}{{ reldelim2 }}{% endif %}</li>
        {%- endfor %}
        {%- block rootrellink %}
        <li><a href="{{ pathto(master_doc) }}">{{ shorttitle|e }}</a>{{ reldelim1 }}</li>
        {%- endblock %}
        {%- for parent in parents %}
          <li><a href="{{ parent.link|e }}" {% if loop.last %}{{ accesskey("U") }}{% endif %}>{{ parent.title }}</a>{{ reldelim1 }}</li>
        {%- endfor %}
        {%- block relbaritems %} {% endblock %}
      </ul>
    </div>
{%- endmacro %}

{%- macro sidebar() %}
      {%- if render_sidebar %}
      <div class="sphinxsidebar">
        <div class="sphinxsidebarwrapper">
          {%- block sidebarlogo %}
          {%- if logo %}
            <p class="logo"><a href="{{ pathto(master_doc) }}">
              <img class="logo" src="{{ pathto('_static/' + logo, 1) }}" alt="Logo"/>
            </a></p>
          {%- endif %}
          {%- endblock %}
          {%- if sidebars != None %}
            {#- new style sidebar: explicitly include/exclude templates #}
            {%- for sidebartemplate in sidebars %}
            {%- include sidebartemplate %}
            {%- endfor %}
          {%- else %}
            {#- old style sidebars: using blocks -- should be deprecated #}
            {%- block sidebartoc %}
            {%- include "localtoc.html" %}
            {%- endblock %}
            {%- block sidebarrel %}
            {%- include "relations.html" %}
            {%- endblock %}
            {%- block sidebarsourcelink %}
            {%- include "sourcelink.html" %}
            {%- endblock %}
            {%- if customsidebar %}
            {%- include customsidebar %}
            {%- endif %}
            {%- block sidebarsearch %}
            {%- include "searchbox.html" %}
            {%- endblock %}
          {%- endif %}
        </div>
      </div>
      {%- endif %}
{%- endmacro %}

{%- macro script() %}
    <script type="text/javascript">
      var DOCUMENTATION_OPTIONS = {
        URL_ROOT:    '{{ url_root }}',
        VERSION:     '{{ release|e }}',
        COLLAPSE_INDEX: false,
        FILE_SUFFIX: '{{ '' if no_search_suffix else file_suffix }}',
        HAS_SOURCE:  {{ has_source|lower }}
      };
    </script>
    {%- for scriptfile in script_files %}
    <script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
    {%- endfor %}
{%- endmacro %}

{%- macro css() %}
    <link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
    <link rel="stylesheet" href="{{ pathto('_static/pygments.css', 1) }}" type="text/css" />
    {%- for cssfile in css_files %}
    <link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
    {%- endfor %}
{%- endmacro %}

<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset={{ encoding }}" />
    {{ metatags }}
    {%- block htmltitle %}
    <title>{{ title|striptags|e }}{{ titlesuffix }}</title>
    {%- endblock %}
    {{ css() }}
    {%- if not embedded %}
    {{ script() }}
    {%- if use_opensearch %}
    <link rel="search" type="application/opensearchdescription+xml"
          title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}"
          href="{{ pathto('_static/opensearch.xml', 1) }}"/>
    {%- endif %}
    {%- if favicon %}
    <link rel="shortcut icon" href="{{ pathto('_static/' + favicon, 1) }}"/>
    {%- endif %}
    {%- endif %}
{%- block linktags %}
    {%- if hasdoc('about') %}
    <link rel="author" title="{{ _('About these documents') }}" href="{{ pathto('about') }}" />
    {%- endif %}
    {%- if hasdoc('genindex') %}
    <link rel="index" title="{{ _('Index') }}" href="{{ pathto('genindex') }}" />
    {%- endif %}
    {%- if hasdoc('search') %}
    <link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}" />
    {%- endif %}
    {%- if hasdoc('copyright') %}
    <link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}" />
    {%- endif %}
    <link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}" />
    {%- if parents %}
    <link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}" />
    {%- endif %}
    {%- if next %}
    <link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}" />
    {%- endif %}
    {%- if prev %}
    <link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}" />
    {%- endif %}
{%- endblock %}
{%- block extrahead %} {% endblock %}
  </head>
  <body>
{%- block header %}{% endblock %}

{%- block relbar1 %}{{ relbar() }}{% endblock %}

{%- block content %}
  {%- block sidebar1 %} {# possible location for sidebar #} {% endblock %}

    <div class="document">
  {%- block document %}
      <div class="documentwrapper">
      {%- if render_sidebar %}
        <div class="bodywrapper">
      {%- endif %}
          <div class="body">
            {% block body %} {% endblock %}
          </div>
      {%- if render_sidebar %}
        </div>
      {%- endif %}
      </div>
  {%- endblock %}

  {%- block sidebar2 %}{{ sidebar() }}{% endblock %}
      <div class="clearer"></div>
    </div>
{%- endblock %}

{%- block relbar2 %}{{ relbar() }}{% endblock %}

{%- block footer %}
    <div class="footer">
    {%- if show_copyright %}
      {%- if hasdoc('copyright') %}
        {% trans path=pathto('copyright'), copyright=copyright|e %}&copy; <a href="{{ path }}">Copyright</a> {{ copyright }}.{% endtrans %}
      {%- else %}
        {% trans copyright=copyright|e %}&copy; Copyright {{ copyright }}.{% endtrans %}
      {%- endif %}
    {%- endif %}
    {%- if last_updated %}
      {% trans last_updated=last_updated|e %}Last updated on {{ last_updated }}.{% endtrans %}
    {%- endif %}
    {%- if show_sphinx %}
      {% trans sphinx_version=sphinx_version|e %}Created using <a href="http://sphinx-doc.org/">Sphinx</a> {{ sphinx_version }}.{% endtrans %}
    {%- endif %}
    </div>
    <p>asdf asdf asdf asdf 22</p>
{%- endblock %}
  </body>
</html>



================================================
FILE: doc/_themes/sphinx_rtd_theme/search.html
================================================
{#
    basic/search.html
    ~~~~~~~~~~~~~~~~~

    Template for the search page.

    :copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
#}
{%- extends "layout.html" %}
{% set title = _('Search') %}
{% set script_files = script_files + ['_static/searchtools.js'] %}
{% block footer %}
  <script type="text/javascript">
    jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
  </script>
  {# this is used when loading the search index using $.ajax fails,
     such as on Chrome for documents on localhost #}
  <script type="text/javascript" id="searchindexloader"></script>
  {{ super() }}
{% endblock %}
{% block body %}
  <noscript>
  <div id="fallback" class="admonition warning">
    <p class="last">
      {% trans %}Please activate JavaScript to enable the search
      functionality.{% endtrans %}
    </p>
  </div>
  </noscript>

  {% if search_performed %}
    <h2>{{ _('Search Results') }}</h2>
    {% if not search_results %}
      <p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}</p>
    {% endif %}
  {% endif %}
  <div id="search-results">
  {% if search_results %}
    <ul>
    {% for href, caption, context in search_results %}
      <li>
        <a href="{{ pathto(item.href) }}">{{ caption }}</a>
        <p class="context">{{ context|e }}</p>
      </li>
    {% endfor %}
    </ul>
  {% endif %}
  </div>
{% endblock %}


================================================
FILE: doc/_themes/sphinx_rtd_theme/searchbox.html
================================================
<div role="search">
  <form id ="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>


================================================
FILE: doc/_themes/sphinx_rtd_theme/static/css/badge_only.css
================================================
.fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../font/fontawesome_webfont.eot");src:url("../font/fontawesome_webfont.eot?#iefix") format("embedded-opentype"),url("../font/fontawesome_webfont.woff") format("woff"),url("../font/fontawesome_webfont.ttf") format("truetype"),url("../font/fontawesome_webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:0.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:"\f02d"}.icon-book:before{content:"\f02d"}.fa-caret-down:before{content:"\f0d7"}.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}


================================================
FILE: doc/_themes/sphinx_rtd_theme/static/css/theme.css
================================================
*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}audio:not([controls]){display:none}[hidden]{display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:hover,a:active{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}blockquote{margin:0}dfn{font-style:italic}hr{display:block;height:1px;border:0;border-top:1px solid #ccc;margin:20px 0;padding:0}ins{background:#ff9;color:#000;text-decoration:none}mark{background:#ff0;color:#000;font-style:italic;font-weight:bold}pre,code,.rst-content tt,kbd,samp{font-family:monospace,serif;_font-family:"courier new",monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:before,q:after{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}ul,ol,dl{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure{margin:0}form{margin:0}fieldset{border:0;margin:0;padding:0}label{cursor:pointer}legend{border:0;*margin-left:-7px;padding:0;white-space:normal}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;*width:13px;*height:13px}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top;resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:0.2em 0;background:#ccc;color:#000;padding:0.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none !important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{html,body,section{background:none !important}*{box-shadow:none !important;text-shadow:none !important;filter:none !important;-ms-filter:none !important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}/*!
 *  Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome
 *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
 */@font-face{font-family:'FontAwesome';src:url("../fonts/fontawesome-webfont.eot?v=4.0.3");src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.0.3") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.0.3") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.0.3") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular") format("svg");font-weight:normal;font-style:normal}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:0.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:0.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:solid 0.08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.rst-content .pull-left.admonition-title,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content dl dt .pull-left.headerlink,.pull-left.icon{margin-right:.3em}.fa.pull-right,.rst-content .pull-right.admonition-title,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content dl dt .pull-right.headerlink,.pull-right.icon{margin-left:.3em}.fa-spin{-webkit-animation:spin 2s infinite linear;-moz-animation:spin 2s infinite linear;-o-animation:spin 2s infinite linear;animation:spin 2s infinite linear}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg)}100%{-moz-transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg)}}@-o-keyframes spin{0%{-o-transform:rotate(0deg)}100%{-o-transform:rotate(359deg)}}@-ms-keyframes spin{0%{-ms-transform:rotate(0deg)}100%{-ms-transform:rotate(359deg)}}@keyframes spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(-1, 1);-moz-transform:scale(-1, 1);-ms-transform:scale(-1, 1);-o-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=$rotation);-webkit-transform:scale(1, -1);-moz-transform:scale(1, -1);-ms-transform:scale(1, -1);-o-transform:scale(1, -1);transform:scale(1, -1)}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before,.icon-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before,.icon-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:"\f057"}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before,.icon-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before,.icon-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:"\f0a8"}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before,.icon-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before,.wy-dropdown .caret:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-asc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-desc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-reply-all:before{content:"\f122"}.fa-mail-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before,.icon-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa,.rst-content .admonition-title,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{font-family:inherit}.fa:before,.rst-content .admonition-title:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{font-family:"FontAwesome";display:inline-block;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .icon{display:inline-block;text-decoration:inherit}.btn .fa,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .icon,.nav .fa,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .icon{display:inline}.btn .fa.fa-large,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .fa-large.icon{line-height:0.9em}.btn .fa.fa-spin,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .fa-spin.icon{display:inline-block}.btn.fa:before,.rst-content .btn.admonition-title:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content dl dt .btn.headerlink:before,.btn.icon:before{opacity:0.5;-webkit-transition:opacity 0.05s ease-in;-moz-transition:opacity 0.05s ease-in;transition:opacity 0.05s ease-in}.btn.fa:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.btn.icon:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .icon:before{font-size:14px;vertical-align:-15%}.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.wy-alert-title,.rst-content .admonition-title{color:#fff;font-weight:bold;display:block;color:#fff;background:#6ab0de;margin:-12px;padding:6px 12px;margin-bottom:12px}.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{background:#fdf3f2}.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{background:#f29f97}.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{background:#ffedcc}.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{background:#f0b37e}.wy-alert.wy-alert-info,.rst-content .note,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{background:#e7f2fa}.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{background:#6ab0de}.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{background:#dbfaf4}.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{background:#1abc9c}.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{background:#f3f6f6}.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{color:#404040;background:#e1e4e5}.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{color:#2980b9}.wy-alert p:last-child,.rst-content .note p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0px;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,0.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:60px;overflow:hidden;-webkit-transition:all 0.3s ease-in;-moz-transition:all 0.3s ease-in;transition:all 0.3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:60px}@media screen and (max-width: 768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px 12px;color:#fff;border:1px solid rgba(0,0,0,0.1);background-color:#27ae60;text-decoration:none;font-weight:normal;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset;outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0.1s linear;-moz-transition:all 0.1s linear;transition:all 0.1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset;padding:8px 12px 6px 12px}.btn:visited{color:#fff}.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:0.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9 !important}.btn-info:hover{background-color:#2e8ece !important}.btn-neutral{background-color:#f3f6f6 !important;color:#404040 !important}.btn-neutral:hover{background-color:#e5ebeb !important;color:#404040}.btn-neutral:visited{color:#404040 !important}.btn-success{background-color:#27ae60 !important}.btn-success:hover{background-color:#295 !important}.btn-danger{background-color:#e74c3c !important}.btn-danger:hover{background-color:#ea6153 !important}.btn-warning{background-color:#e67e22 !important}.btn-warning:hover{background-color:#e98b39 !important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f !important}.btn-link{background-color:transparent !important;color:#2980b9;box-shadow:none;border-color:transparent !important}.btn-link:hover{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:active{background-color:transparent !important;color:#409ad5 !important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:before,.wy-btn-group:after{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:solid 1px #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,0.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:solid 1px #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type="search"]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{border:0;margin:0;padding:0}legend{display:block;width:100%;border:0;padding:0;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label{display:block;margin:0 0 0.3125em 0;color:#999;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;*zoom:1;max-width:68em;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group:before,.wy-control-group:after{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.wy-control-group .wy-form-full input[type="search"],.wy-control-group .wy-form-full input[type="tel"],.wy-control-group .wy-form-full input[type="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.wy-control-group .wy-form-halves input[type="search"],.wy-control-group .wy-form-halves input[type="tel"],.wy-control-group .wy-form-halves input[type="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.wy-control-group .wy-form-thirds input[type="search"],.wy-control-group .wy-form-thirds input[type="tel"],.wy-control-group .wy-form-thirds input[type="color"]{width:100%}.wy-control-group .wy-form-full{display:block;float:left;margin-right:2.35765%;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{display:block;float:left;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child{margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(2n+1){clear:left}.wy-control-group .wy-form-thirds{display:block;float:left;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child{margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control{margin:6px 0 0 0;font-size:90%}.wy-control-no-input{display:inline-block;margin:6px 0 0 0;font-size:90%}.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{width:100%}.wy-form-message-inline{display:inline-block;padding-left:0.3em;color:#666;vertical-align:middle;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:0.3125em;font-style:italic}input{line-height:normal}input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;*overflow:visible}input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}input[type="datetime-local"]{padding:0.34375em 0.625em}input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0;margin-right:0.3125em;*height:13px;*width:13px}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}input[type="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{outline:0;outline:thin dotted \9;border-color:#333}input.no-focus:focus{border-color:#ccc !important}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{cursor:not-allowed;background-color:#f3f6f6;color:#cad2d3}input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e74c3c}input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif}select,textarea{padding:0.5em 0.625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border 0.3s linear;-moz-transition:border 0.3s linear;transition:border 0.3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#fff;color:#cad2d3;border-color:transparent}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{padding:6px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:solid 1px #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.wy-control-group.wy-control-group-error input[type="search"],.wy-control-group.wy-control-group-error input[type="tel"],.wy-control-group.wy-control-group-error input[type="color"]{border:solid 1px #e74c3c}.wy-control-group.wy-control-group-error textarea{border:solid 1px #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:0.5em 0.625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width: 480px){.wy-form button[type="submit"]{margin:0.7em 0 0}.wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0.3em;display:block}.wy-form label{margin-bottom:0.3em;display:block}.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:0.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0 0}.wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width: 768px){.tablet-hide{display:none}}@media screen and (max-width: 480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.wy-table,.rst-content table.docutils,.rst-content table.field-list{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{border-left-width:0}.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{font-weight:bold;border-bottom:solid 2px #e1e4e5}.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{background-color:transparent;vertical-align:middle}.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{line-height:18px;margin-bottom:0}.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{width:1%;padding-right:0}.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:gray;font-size:90%}.wy-table-tertiary{color:gray;font-size:80%}.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{background-color:#f3f6f6}.wy-table-backed{background-color:#f3f6f6}.wy-table-bordered-all,.rst-content table.docutils{border:1px solid #e1e4e5}.wy-table-bordered-all td,.rst-content table.docutils td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px 0;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0 !important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%;overflow-x:hidden}body{font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;font-weight:normal;color:#404040;min-height:100%;overflow-x:hidden;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22 !important}a.wy-text-warning:hover{color:#eb9950 !important}.wy-text-info{color:#2980b9 !important}a.wy-text-info:hover{color:#409ad5 !important}.wy-text-success{color:#27ae60 !important}a.wy-text-success:hover{color:#36d278 !important}.wy-text-danger{color:#e74c3c !important}a.wy-text-danger:hover{color:#ed7669 !important}.wy-text-neutral{color:#404040 !important}a.wy-text-neutral:hover{color:#595959 !important}h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif}p{line-height:24px;margin:0;font-size:16px;margin-bottom:24px}h1{font-size:175%}h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}code,.rst-content tt{white-space:nowrap;max-width:100%;background:#fff;border:solid 1px #e1e4e5;font-size:75%;padding:0 5px;font-family:"Consolas","Monaco",monospace;color:#e74c3c;overflow-x:auto}code.code-large,.rst-content tt.code-large{font-size:90%}.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{list-style:disc;margin-left:24px}.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{margin-bottom:0}.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{list-style:circle}.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{list-style:square}.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{list-style:decimal}.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{list-style:decimal;margin-left:24px}.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{margin-bottom:0}.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{list-style:disc}.codeblock-example{border:1px solid #e1e4e5;border-bottom:none;padding:24px;padding-top:48px;font-weight:500;background:#fff;position:relative}.codeblock-example:after{content:"Example";position:absolute;top:0px;left:0px;background:#9b59b6;color:#fff;padding:6px 12px}.codeblock-example.prettyprint-example-only{border:1px solid #e1e4e5;margin-bottom:24px}.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{border:1px solid #e1e4e5;padding:0px;overflow-x:auto;background:#fff;margin:1px 0 24px 0}.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{border:none;background:none;margin:0}div[class^='highlight'] td.code{width:100%}.linenodiv pre{border-right:solid 1px #e6e9ea;margin:0;padding:12px 12px;font-family:"Consolas","Monaco",monospace;font-size:12px;line-height:1.5;color:#d9d9d9}div[class^='highlight'] pre{white-space:pre;margin:0;padding:12px 12px;font-family:"Consolas","Monaco",monospace;font-size:12px;line-height:1.5;display:block;overflow:auto;color:#404040}@media print{.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{white-space:pre-wrap}}.hll{background-color:#ffc;margin:0 -12px;padding:0 12px;display:block}.c{color:#998;font-style:italic}.err{color:#a61717;background-color:#e3d2d2}.k{font-weight:bold}.o{font-weight:bold}.cm{color:#998;font-style:italic}.cp{color:#999;font-weight:bold}.c1{color:#998;font-style:italic}.cs{color:#999;font-weight:bold;font-style:italic}.gd{color:#000;background-color:#fdd}.gd .x{color:#000;background-color:#faa}.ge{font-style:italic}.gr{color:#a00}.gh{color:#999}.gi{color:#000;background-color:#dfd}.gi .x{color:#000;background-color:#afa}.go{color:#888}.gp{color:#555}.gs{font-weight:bold}.gu{color:purple;font-weight:bold}.gt{color:#a00}.kc{font-weight:bold}.kd{font-weight:bold}.kn{font-weight:bold}.kp{font-weight:bold}.kr{font-weight:bold}.kt{color:#458;font-weight:bold}.m{color:#099}.s{color:#d14}.n{color:#333}.na{color:teal}.nb{color:#0086b3}.nc{color:#458;font-weight:bold}.no{color:teal}.ni{color:purple}.ne{color:#900;font-weight:bold}.nf{color:#900;font-weight:bold}.nn{color:#555}.nt{color:navy}.nv{color:teal}.ow{font-weight:bold}.w{color:#bbb}.mf{color:#099}.mh{color:#099}.mi{color:#099}.mo{color:#099}.sb{color:#d14}.sc{color:#d14}.sd{color:#d14}.s2{color:#d14}.se{color:#d14}.sh{color:#d14}.si{color:#d14}.sx{color:#d14}.sr{color:#009926}.s1{color:#d14}.ss{color:#990073}.bp{color:#999}.vc{color:teal}.vg{color:teal}.vi{color:teal}.il{color:#099}.gc{color:#999;background-color:#eaf2f5}.wy-breadcrumbs li{display:inline-block}.wy-breadcrumbs li.wy-breadcrumbs-aside{float:right}.wy-breadcrumbs li a{display:inline-block;padding:5px}.wy-breadcrumbs li a:first-child{padding-left:0}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width: 480px){.wy-breadcrumbs-extra{display:none}.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:before,.wy-menu-horiz:after{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz ul,.wy-menu-horiz li{display:inline-block}.wy-menu-horiz li:hover{background:rgba(255,255,255,0.1)}.wy-menu-horiz li.divide-left{border-left:solid 1px #404040}.wy-menu-horiz li.divide-right{border-right:solid 1px #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical header{height:32px;display:inline-block;line-height:32px;padding:0 1.618em;display:block;font-weight:bold;text-transform:uppercase;font-size:80%;color:#2980b9;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:solid 1px #404040}.wy-menu-vertical li.divide-bottom{border-bottom:solid 1px #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:gray;border-right:solid 1px #c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{color:#404040;padding:0.4045em 1.618em;font-weight:bold;position:relative;background:#fcfcfc;border:none;border-bottom:solid 1px #c9c9c9;border-top:solid 1px #c9c9c9;padding-left:1.618em -4px}.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{background:#fcfcfc}.wy-menu-vertical li.toctree-l2.current>a{background:#c9c9c9;padding:0.4045em 2.427em}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical .local-toc li ul{display:block}.wy-menu-vertical li ul li a{margin-bottom:0;color:#b3b3b3;font-weight:normal}.wy-menu-vertical a{display:inline-block;line-height:18px;padding:0.4045em 1.618em;display:block;position:relative;font-size:90%;color:#b3b3b3}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-side-nav-search{z-index:200;background-color:#2980b9;text-align:center;padding:0.809em;display:block;color:#fcfcfc;margin-bottom:0.809em}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto 0.809em auto;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{color:#fcfcfc;font-size:100%;font-weight:bold;display:inline-block;padding:4px 6px;margin-bottom:0.809em}.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{background:rgba(255,255,255,0.1)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all 0.2s ease-in;-moz-transition:all 0.2s ease-in;transition:all 0.2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:left repeat-y #fcfcfc;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC);background-size:300px 1px}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:absolute;top:0;left:0;width:300px;overflow:hidden;min-height:100%;background:#343131;z-index:200}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:0.4045em 0.809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:before,.wy-nav-top:after{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:bold}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,0.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:#999}footer p{margin-bottom:12px}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:before,.rst-footer-buttons:after{display:table;content:""}.rst-footer-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:solid 1px #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:solid 1px #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:gray;font-size:90%}@media screen and (max-width: 768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width: 1400px){.wy-nav-content-wrap{background:rgba(0,0,0,0.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,footer,.wy-nav-side{display:none}.wy-nav-content-wrap{margin-left:0}}nav.stickynav{position:fixed;top:0}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;border-top:solid 10px #343131;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .icon{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}img{width:100%;height:auto}}.rst-content img{max-width:100%;height:auto !important}.rst-content div.figure{margin-bottom:24px}.rst-content div.figure.align-center{text-align:center}.rst-content .section>img{margin-bottom:24px}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,0.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent !important;border-color:rgba(0,0,0,0.1) !important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha li{list-style:upper-alpha}.rst-content .section ol p,.rst-content .section ul p{margin-bottom:12px}.rst-content .line-block{margin-left:24px}.rst-content .topic-title{font-weight:bold;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0px 0px 24px 24px}.rst-content .align-left{float:left;margin:0px 24px 24px 0px}.rst-content .align-center{margin:auto;display:block}.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content dl dt .headerlink{display:none;visibility:hidden;font-size:14px}.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{visibility:visible;content:"\f0c1";font-family:FontAwesome;display:inline-block}.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{display:inline-block}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:solid 1px #e1e4e5}.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{font-size:90%}.rst-content .sidebar .last{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif;font-weight:bold;background:#e1e4e5;padding:6px 12px;margin:-24px;margin-bottom:24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;display:inline-block;font-weight:bold;padding:0 6px}.rst-content .footnote-reference,.rst-content .citation-reference{vertical-align:super;font-size:90%}.rst-content table.docutils.citation,.rst-content table.docutils.footnote{background:none;border:none;color:#999}.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{border:none;background-color:transparent !important;white-space:normal}.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}.rst-content table.field-list{border:none}.rst-content table.field-list td{border:none;padding-top:5px}.rst-content table.field-list td>strong{display:inline-block;margin-top:3px}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left;padding-left:0}.rst-content tt{color:#000}.rst-content tt big,.rst-content tt em{font-size:100% !important;line-height:normal}.rst-content tt .xref,a .rst-content tt{font-weight:bold}.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:bold}.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{margin-bottom:12px !important}.rst-content dl dd{margin:0 0 12px 24px}.rst-content dl:not(.docutils){margin-bottom:24px}.rst-content dl:not(.docutils) dt{display:inline-block;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:solid 3px #6ab0de;padding:6px;position:relative}.rst-content dl:not(.docutils) dt:before{color:#6ab0de}.rst-content dl:not(.docutils) dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dl dt{margin-bottom:6px;border:none;border-left:solid 3px #ccc;background:#f0f0f0;color:gray}.rst-content dl:not(.docutils) dl dt .headerlink{color:#404040;font-size:100% !important}.rst-content dl:not(.docutils) dt:first-child{margin-top:0}.rst-content dl:not(.docutils) tt{font-weight:bold}.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{background-color:transparent;border:none;padding:0;font-size:100% !important}.rst-content dl:not(.docutils) tt.descname{font-weight:bold}.rst-content dl:not(.docutils) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:bold}.rst-content dl:not(.docutils) .property{display:inline-block;padding-right:8px}.rst-content .viewcode-link,.rst-content .viewcode-back{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:bold}@media screen and (max-width: 480px){.rst-content .sidebar{width:100%}}span[id*='MathJax-Span']{color:#404040}


================================================
FILE: doc/_themes/sphinx_rtd_theme/static/js/theme.js
================================================
$( document ).ready(function() {
    // Shift nav in mobile when clicking the menu.
    $(document).on('click', "[data-toggle='wy-nav-top']", function() {
      $("[data-toggle='wy-nav-shift']").toggleClass("shift");
      $("[data-toggle='rst-versions']").toggleClass("shift");
    });
    // Close menu when you click a link.
    $(document).on('click', ".wy-menu-vertical .current ul li a", function() {
      $("[data-toggle='wy-nav-shift']").removeClass("shift");
      $("[data-toggle='rst-versions']").toggleClass("shift");
    });
    $(document).on('click', "[data-toggle='rst-current-version']", function() {
      $("[data-toggle='rst-versions']").toggleClass("shift-up");
    });  
    // Make tables responsive
    $("table.docutils:not(.field-list)").wrap("<div class='wy-table-responsive'></div>");
});

window.SphinxRtdTheme = (function (jquery) {
    var stickyNav = (function () {
        var navBar,
            win,
            stickyNavCssClass = 'stickynav',
            applyStickNav = function () {
                if (navBar.height() <= win.height()) {
                    navBar.addClass(stickyNavCssClass);
                } else {
                    navBar.removeClass(stickyNavCssClass);
                }
            },
            enable = function () {
                applyStickNav();
                win.on('resize', applyStickNav);
            },
            init = function () {
                navBar = jquery('nav.wy-nav-side:first');
                win    = jquery(window);
            };
        jquery(init);
        return {
            enable : enable
        };
    }());
    return {
        StickyNav : stickyNav
    };
}($));


================================================
FILE: doc/_themes/sphinx_rtd_theme/theme.conf
================================================
[theme]
inherit = basic
stylesheet = css/theme.css

[options]
typekit_id = hiw1hhg
analytics_id = 
sticky_navigation = False


================================================
FILE: doc/_themes/sphinx_rtd_theme/versions.html
================================================
{% if READTHEDOCS %}
{# Add rst-badge after rst-versions for small badge style. #}
  <div class="rst-versions" data-toggle="rst-versions" role="note" aria-label="versions">
    <span class="rst-current-version" data-toggle="rst-current-version">
      <span class="fa fa-book"> Read the Docs</span>
      v: {{ current_version }}
      <span class="fa fa-caret-down"></span>
    </span>
    <div class="rst-other-versions">
      <dl>
        <dt>Versions</dt>
        {% for slug, url in versions %}
          <dd><a href="{{ url }}">{{ slug }}</a></dd>
        {% endfor %}
      </dl>
      <dl>
        <dt>Downloads</dt>
        {% for type, url in downloads %}
          <dd><a href="{{ url }}">{{ type }}</a></dd>
        {% endfor %}
      </dl>
      <dl>
        <dt>On Read the Docs</dt>
          <dd>
            <a href="//{{ PRODUCTION_DOMAIN }}/projects/{{ slug }}/?fromdocs={{ slug }}">Project Home</a>
          </dd>
          <dd>
            <a href="//{{ PRODUCTION_DOMAIN }}/builds/{{ slug }}/?fromdocs={{ slug }}">Builds</a>
          </dd>
      </dl>
      <hr/>
      Free document hosting provided by <a href="http://www.readthedocs.org">Read the Docs</a>.

    </div>
  </div>
{% endif %}



================================================
FILE: doc/android-spdy-proxy.rst
================================================
SPDY Proxy with Firefox for Android
===================================

This document describes how to use SPDY proxy from Android device
using Firefox for Android. No root privilege is required. It may be
possible to use other Web browser/software if they provide the ability
to specify HTTP proxy. Because we don't use the features only
available in latest Android devices, this method works on relatively
old but still used versions, e.g., Andriod 2.3 series.

Setting up SPDY Proxy
---------------------

If you have VPS, then you can setup SPDY proxy there.  You can use
``shrpx`` with ``-s`` option + Squid as SPDY proxy.  Alternatively,
`node-spdyproxy <https://github.com/igrigorik/node-spdyproxy/>`_ may
also work. If you don't have VPS, but your home internet connection
has global IP address which can be accessible from Android device, you
can use your home PC as SPDY proxy temporarily for the experiment.
The self-signed certificate is OK because we will run ``shrpx`` with
``-k`` option on Android in this example. Alternatively, you can store
your certificate in Android device and specify it using ``--cacert``
option. If you think these are insecure, obtain valid certificate.

Building spdylay library and shrpx
----------------------------------

First Android NDK must be installed on your system.  Refer
:doc:`package_README` to see how to install NDK. In the following document, We
use ``ANDROID_HOME`` environment variable.

To make it easier to run Android cross-compiler tools (and for the
sake of this document), include the path to those commands to
``PATH``::

    $ export PATH=$ANDROID_HOME/toolchain/bin:$PATH

We need to build dependent libraries: OpenSSL and libevent.

To configure OpenSSL, use the following script::

    #!/bin/sh

    if [ -z "$ANDROID_HOME" ]; then
        echo 'No $ANDROID_HOME specified.'
        exit 1
    fi
    PREFIX=$ANDROID_HOME/usr/local
    TOOLCHAIN=$ANDROID_HOME/toolchain
    PATH=$TOOLCHAIN/bin:$PATH

    export CROSS_COMPILE=$TOOLCHAIN/bin/arm-linux-androideabi-
    ./Configure --prefix=$PREFIX android

Then run ``make install`` to build and install library.

For libevent, use the following script to configure::

    #!/bin/sh

    if [ -z "$ANDROID_HOME" ]; then
        echo 'No $ANDROID_HOME specified.'
        exit 1
    fi
    PREFIX=$ANDROID_HOME/usr/local
    TOOLCHAIN=$ANDROID_HOME/toolchain
    PATH=$TOOLCHAIN/bin:$PATH

    ./configure \
        --host=arm-linux-androideabi \
        --build=`dpkg-architecture -qDEB_BUILD_GNU_TYPE` \
        --prefix=$PREFIX \
        --disable-shared \
        --enable-static \
        CPPFLAGS=-I$PREFIX/include \
        LDFLAGS=-L$PREFIX/lib

Then run ``make install`` to
build and install library.

To build spdylay, use ``android-config`` to configure and
``android-make`` to build as described in :doc:`package_README`.

If all went well, ``shrpx`` binary is created in src directory.  Strip
debugging information from the binary using the following command::

    $ arm-linux-androideabi-strip src/shrpx

Setup shrpx on Android device
-----------------------------

There may be several ways to run ``shrpx`` on Android. I describe the
way to use `Android Terminal Emulator
<https://github.com/jackpal/Android-Terminal-Emulator>`_.  It can be
installed from Google Play. Copy ``shrpx`` binary to the location
where the Android-Terminal-Emulator is installed (In case of my phone,
it is ``/data/data/jackpal.androidterm``) and give the executable
permission to ``shrpx`` using ``chmod``::

    $ chmod 755 shrpx

Then run ``shrpx`` in client-mode like this::

    $ ./shrpx -k -p -f localhost,8000 -b SPDY-PROXY-ADDR,SPDY-PROXY-PORT

Substitute ``SPDY-PROXY-ADDR`` and ``SPDY-PROXY-PORT`` with the SPDY
proxy address and port you have setup respectively. The ``-k`` option
tells ``shrpx`` not to complain the self-signed certificate for SPDY
proxy. The ``-p`` option makes ``shrpx`` run so called client mode.
In that mode, ``shrpx`` acts like ordinary HTTP forward proxy in
frontend connection, it forwards the requests from the client to
backend in encrypted SPDY connection. The ``-f`` option specify the
address and port ``shrpx`` listens to. In this setup, the web browser
should be setup to use HTTP proxy localhost:8000. The ``-b`` option
specify the SPDY proxy address and port ``shrpx`` forwards the
requests from the client. The configuration looks like this::


    +----Android------------------------+          +---SPDY-Proxy------+
    | [Firefox] <-- HTTP --> [shrpx] <--=-- SPDY --=-->[shrpx,squid]<--=-- SPDY --> ...
    +-----------------------------------+          +-------------------+   HTTP

With the above command-line option, ``shrpx`` only opens 1 connection
to SPDY proxy. Of course, Firefox will use multiple connections to
neighboring ``shrpx``. ``shrpx`` coalesces all the requests in 1
backend connection, that is the benefit SPDY proxy brings in.

Setup Firefox to use SPDY proxy
-------------------------------

If you have not installed, Firefox for Android, install it.  Enter
``about:config`` in URL bar in Firefox and locate proxy
settings. Setup those values like this::

    network.proxy.http = localhost
    network.proxy.http_port = 8000
    network.proxy.ssl = localhost
    network.proxy.ssl_port = 8000
    network.proxy.type = 1

You also need to tweak the following settings to increase in-flight
requests to circumvent latency::

    network.http.max-persistent-connections-per-proxy
    network.http.max-connections
    network.http.max-connections-per-server

Since ``shrpx`` handles maximum 100 concurrent streams, it is
reasonable to set
``network.http.max-persistent-connections-per-proxy`` to ``100``.

Now borwse the sites with Firefox. The all HTTP requests are now sent
via internal ``shrpx`` to SPDY proxy in 1 connection. SPDY proxy will
get resources on behalf of the client and sent back the response.


================================================
FILE: doc/apiref-header.rst
================================================
API Reference
=============

Includes
--------

To use the public APIs, include ``spdylay/spdylay.h``::

    #include <spdylay/spdylay.h>

Remarks
-------

Do not call `spdylay_session_send`, `spdylay_session_recv` or
`spdylay_session_mem_recv` from the spdylay callback functions
directly or indirectly. It will lead to the crash. You can submit
requests or frames in the callbacks then call `spdylay_session_send`,
`spdylay_session_recv` or `spdylay_session_mem_recv` outside of the
callbacks.


================================================
FILE: doc/conf.py.in
================================================
# -*- coding: utf-8 -*-
# Spdylay - SPDY Library

# Copyright (c) 2012 Tatsuhiro Tsujikawa

# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:

# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

#
# Spdylay documentation build configuration file, created by
# sphinx-quickstart on Sun Mar 11 22:57:49 2012.
#
# This file is execfile()d with the current directory set to its containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.

import sys, os

# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))

# -- General configuration -----------------------------------------------------

# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'

# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = []

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

# The suffix of source filenames.
source_suffix = '.rst'

# The encoding of source files.
#source_encoding = 'utf-8-sig'

# The master toctree document.
master_doc = 'index'

# General information about the project.
project = u'Spdylay'
copyright = u'2012, 2014, Tatsuhiro Tsujikawa'

# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '@PACKAGE_VERSION@'
# The full version, including alpha/beta/rc tags.
release = '@PACKAGE_VERSION@'

# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#language = None

# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'

# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['manual', 'README.rst', '*-header.rst']

# The reST default role (used for this markup: `text`) to use for all documents.
default_role = 'c:func'
primary_domain = 'c'

# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True

# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True

# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False

# The default language to highlight source code in. The default is 'python'.
highlight_language = 'c'

# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'

# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []


# -- Options for HTML output ---------------------------------------------------

# The theme to use for HTML and HTML Help pages.  See the documentation for
# a list of builtin themes.
html_theme = 'sphinx_rtd_theme'

# Theme options are theme-specific and customize the look and feel of a theme
# further.  For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}

# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = ['_themes']

# The name for this set of Sphinx documents.  If None, it defaults to
# "<project> v<release> documentation".
#html_title = None

# A shorter title for the navigation bar.  Default is the same as html_title.
#html_short_title = None

# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None

# The name of an image file (within the static path) to use as favicon of the
# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None

# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
#html_static_path = []

# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'

# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True

# Custom sidebar templates, maps document names to template names.
html_sidebars = {
    '**': ['menu.html', 'localtoc.html', 'relations.html', 'sourcelink.html',
           'searchbox.html']
    }

# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}

# If false, no module index is generated.
#html_domain_indices = True

# If false, no index is generated.
#html_use_index = True

# If true, the index is split into individual pages for each letter.
#html_split_index = False

# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True

# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True

# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True

# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it.  The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''

# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None

# Output file base name for HTML help builder.
htmlhelp_basename = 'Spdylaydoc'


# -- Options for LaTeX output --------------------------------------------------

# The paper size ('letter' or 'a4').
#latex_paper_size = 'letter'

# The font size ('10pt', '11pt' or '12pt').
#latex_font_size = '10pt'

# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
  ('index', 'Spdylay.tex', u'Spdylay Documentation',
   u'Tatsuhiro Tsujikawa', 'manual'),
]

# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None

# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False

# If true, show page references after internal links.
#latex_show_pagerefs = False

# If true, show URL addresses after external links.
#latex_show_urls = False

# Additional stuff for the LaTeX preamble.
#latex_preamble = ''

# Documents to append as an appendix to all manuals.
#latex_appendices = []

# If false, no module index is generated.
#latex_domain_indices = True


# -- Options for manual page output --------------------------------------------

# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
    ('index', 'spdylay', u'Spdylay Documentation',
     [u'Tatsuhiro Tsujikawa'], 1)
]


================================================
FILE: doc/index.rst
================================================
.. Spdylay documentation master file, created by
   sphinx-quickstart on Sun Mar 11 22:57:49 2012.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Spdylay - SPDY C Library
========================

This is an experimental implementation of Google's SPDY protocol in C.
This library provides SPDY version 2, 3 and 3.1 framing layer
implementation.  It does not perform any I/O operations.  When the
library needs them, it calls the callback functions provided by the
application. It also does not include any event polling mechanism, so
the application can freely choose the way of handling events. This
library code does not depend on any particular SSL library (except for
example programs which depend on OpenSSL 1.0.1 or later).

This project also develops SPDY client, server and proxy on top of
Spdylay library.

Contents:

.. toctree::
   :maxdepth: 2

   package_README
   apiref
   python
   android-spdy-proxy
   Download <https://github.com/tatsuhiro-t/spdylay/releases>
   Old download <http://sourceforge.net/projects/spdylay/files/>
   Source <https://github.com/tatsuhiro-t/spdylay>
   Issues <https://github.com/tatsuhiro-t/spdylay/issues>

Resources
---------

* http://www.chromium.org/spdy


================================================
FILE: doc/make.bat
================================================
@ECHO OFF

REM Command file for Sphinx documentation

if "%SPHINXBUILD%" == "" (
	set SPHINXBUILD=sphinx-build
)
set BUILDDIR=_build
set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
if NOT "%PAPER%" == "" (
	set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
)

if "%1" == "" goto help

if "%1" == "help" (
	:help
	echo.Please use `make ^<target^>` where ^<target^> is one of
	echo.  html       to make standalone HTML files
	echo.  dirhtml    to make HTML files named index.html in directories
	echo.  singlehtml to make a single large HTML file
	echo.  pickle     to make pickle files
	echo.  json       to make JSON files
	echo.  htmlhelp   to make HTML files and a HTML help project
	echo.  qthelp     to make HTML files and a qthelp project
	echo.  devhelp    to make HTML files and a Devhelp project
	echo.  epub       to make an epub
	echo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter
	echo.  text       to make text files
	echo.  man        to make manual pages
	echo.  changes    to make an overview over all changed/added/deprecated items
	echo.  linkcheck  to check all external links for integrity
	echo.  doctest    to run all doctests embedded in the documentation if enabled
	goto end
)

if "%1" == "clean" (
	for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
	del /q /s %BUILDDIR%\*
	goto end
)

if "%1" == "html" (
	%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished. The HTML pages are in %BUILDDIR%/html.
	goto end
)

if "%1" == "dirhtml" (
	%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
	goto end
)

if "%1" == "singlehtml" (
	%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
	goto end
)

if "%1" == "pickle" (
	%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished; now you can process the pickle files.
	goto end
)

if "%1" == "json" (
	%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished; now you can process the JSON files.
	goto end
)

if "%1" == "htmlhelp" (
	%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in %BUILDDIR%/htmlhelp.
	goto end
)

if "%1" == "qthelp" (
	%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in %BUILDDIR%/qthelp, like this:
	echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Spdylay.qhcp
	echo.To view the help file:
	echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Spdylay.ghc
	goto end
)

if "%1" == "devhelp" (
	%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished.
	goto end
)

if "%1" == "epub" (
	%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished. The epub file is in %BUILDDIR%/epub.
	goto end
)

if "%1" == "latex" (
	%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
	goto end
)

if "%1" == "text" (
	%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished. The text files are in %BUILDDIR%/text.
	goto end
)

if "%1" == "man" (
	%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
	if errorlevel 1 exit /b 1
	echo.
	echo.Build finished. The manual pages are in %BUILDDIR%/man.
	goto end
)

if "%1" == "changes" (
	%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
	if errorlevel 1 exit /b 1
	echo.
	echo.The overview file is in %BUILDDIR%/changes.
	goto end
)

if "%1" == "linkcheck" (
	%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
	if errorlevel 1 exit /b 1
	echo.
	echo.Link check complete; look for any errors in the above output ^
or in %BUILDDIR%/linkcheck/output.txt.
	goto end
)

if "%1" == "doctest" (
	%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
	if errorlevel 1 exit /b 1
	echo.
	echo.Testing of doctests in the sources finished, look at the ^
results in %BUILDDIR%/doctest/output.txt.
	goto end
)

:end


================================================
FILE: doc/mkapiref.py
================================================
#!/usr/bin/env python
# Spdylay - SPDY Library

# Copyright (c) 2012 Tatsuhiro Tsujikawa

# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:

# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.

# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# Generates API reference from C source code.
import re, sys, argparse

class FunctionDoc:
    def __init__(self, name, content, domain):
        self.name = name
        self.content = content
        self.domain = domain

    def write(self, out):
        print '''.. {}:: {}'''.format(self.domain, self.name)
        print ''
        for line in self.content:
            print '    {}'.format(line)

class StructDoc:
    def __init__(self, name, content, members, member_domain):
        self.name = name
        self.content = content
        self.members = members
        self.member_domain = member_domain

    def write(self, out):
        if self.name:
            print '''.. type:: {}'''.format(self.name)
            print ''
            for line in self.content:
                print '    {}'.format(line)
            print ''
            for name, content in self.members:
                print '''    .. {}:: {}'''.format(self.member_domain, name)
                print ''
                for line in content:
                    print '''        {}'''.format(line)
            print ''

class MacroDoc:
    def __init__(self, name, content):
        self.name = name
        self.content = content

    def write(self, out):
        print '''.. macro:: {}'''.format(self.name)
        print ''
        for line in self.content:
            print '    {}'.format(line)

def make_api_ref(infiles):
    macros = []
    enums = []
    types = []
    functions = []
    for infile in infiles:
        while True:
            line = infile.readline()
            if not line:
                break
            elif line == '/**\n':
                line = infile.readline()
                doctype = line.split()[1]
                if doctype == '@function':
                    functions.append(process_function('function', infile))
                elif doctype == '@functypedef':
                    types.append(process_function('type', infile))
                elif doctype == '@struct' or doctype == '@union':
                    types.append(process_struct(infile))
                elif doctype == '@enum':
                    enums.append(process_enum(infile))
                elif doctype == '@macro':
                    macros.append(process_macro(infile))
    alldocs = [('Macros', macros),
               ('Enums', enums),
               ('Types (structs, unions and typedefs)', types),
               ('Functions', functions)]
    for title, docs in alldocs:
        if not docs:
            continue
        print title
        print '-'*len(title)
        for doc in docs:
            doc.write(sys.stdout)
            print ''
        print ''

def process_macro(infile):
    content = read_content(infile)
    line = infile.readline()
    macro_name = line.split()[1]
    return MacroDoc(macro_name, content)

def process_enum(infile):
    members = []
    enum_name = None
    content = read_content(infile)
    while True:
        line = infile.readline()
        if not line:
            break
        elif re.match(r'\s*/\*\*\n', line):
            member_content = read_content(infile)
            line = infile.readline()
            items = line.split()
            member_name = items[0]
            if len(items) >= 3:
                member_content.insert(0, '(``{}``) '\
                                          .format(items[2].rstrip(',')))
            members.append((member_name, member_content))
        elif line.startswith('}'):
            enum_name = line.rstrip().split()[1]
            enum_name = re.sub(r';$', '', enum_name)
            break
    return StructDo
Download .txt
gitextract_ldhk4ot2/

├── .gitignore
├── AUTHORS
├── COPYING
├── ChangeLog
├── Makefile.am
├── NEWS
├── README
├── README.rst
├── android-config
├── android-make
├── configure.ac
├── doc/
│   ├── .gitignore
│   ├── Makefile.am
│   ├── README.rst
│   ├── _themes/
│   │   └── sphinx_rtd_theme/
│   │       ├── __init__.py
│   │       ├── breadcrumbs.html
│   │       ├── footer.html
│   │       ├── layout.html
│   │       ├── layout_old.html
│   │       ├── search.html
│   │       ├── searchbox.html
│   │       ├── static/
│   │       │   ├── css/
│   │       │   │   ├── badge_only.css
│   │       │   │   └── theme.css
│   │       │   ├── fonts/
│   │       │   │   └── FontAwesome.otf
│   │       │   └── js/
│   │       │       └── theme.js
│   │       ├── theme.conf
│   │       └── versions.html
│   ├── android-spdy-proxy.rst
│   ├── apiref-header.rst
│   ├── conf.py.in
│   ├── index.rst
│   ├── make.bat
│   ├── mkapiref.py
│   ├── package_README.rst
│   └── python.rst
├── examples/
│   ├── .gitignore
│   ├── Makefile.am
│   ├── README.rst
│   ├── spdy.h
│   ├── spdycli.c
│   └── spdynative.cc
├── fedora/
│   └── spdylay.spec
├── lib/
│   ├── Makefile.am
│   ├── includes/
│   │   ├── Makefile.am
│   │   └── spdylay/
│   │       ├── spdylay.h
│   │       └── spdylayver.h.in
│   ├── libspdylay.pc.in
│   ├── spdylay_buffer.c
│   ├── spdylay_buffer.h
│   ├── spdylay_frame.c
│   ├── spdylay_frame.h
│   ├── spdylay_gzip.c
│   ├── spdylay_gzip.h
│   ├── spdylay_helper.c
│   ├── spdylay_helper.h
│   ├── spdylay_int.h
│   ├── spdylay_map.c
│   ├── spdylay_map.h
│   ├── spdylay_net.h
│   ├── spdylay_npn.c
│   ├── spdylay_npn.h
│   ├── spdylay_outbound_item.c
│   ├── spdylay_outbound_item.h
│   ├── spdylay_pq.c
│   ├── spdylay_pq.h
│   ├── spdylay_queue.c
│   ├── spdylay_queue.h
│   ├── spdylay_session.c
│   ├── spdylay_session.h
│   ├── spdylay_stream.c
│   ├── spdylay_stream.h
│   ├── spdylay_submit.c
│   ├── spdylay_submit.h
│   ├── spdylay_zlib.c
│   └── spdylay_zlib.h
├── m4/
│   └── README
├── makerelease.sh
├── proxy.pac.sample
├── python/
│   ├── MANIFEST.in
│   ├── Makefile.am
│   ├── README.rst
│   ├── cspdylay.pxd
│   ├── setup.py
│   ├── spdyclient.py
│   ├── spdylay.pyx
│   ├── spdylay_tests.py
│   └── spdyserv.py
├── shrpx.conf.sample
├── src/
│   ├── .gitignore
│   ├── EventPoll.h
│   ├── EventPollEvent.h
│   ├── EventPoll_epoll.cc
│   ├── EventPoll_epoll.h
│   ├── EventPoll_kqueue.cc
│   ├── EventPoll_kqueue.h
│   ├── HtmlParser.cc
│   ├── HtmlParser.h
│   ├── Makefile.am
│   ├── SpdyServer.cc
│   ├── SpdyServer.h
│   ├── base64.h
│   ├── http-parser/
│   │   ├── 0001-Support-custom-HTTP-version-string-e.g.-ICY.patch
│   │   ├── 0002-Allow-chars-in-32-126-except-for-58-for-TOKEN.patch
│   │   ├── 0003-Use-http_parser-for-tunneling-connection-transparent.patch
│   │   ├── AUTHORS
│   │   ├── CONTRIBUTIONS
│   │   ├── LICENSE-MIT
│   │   ├── README.md
│   │   ├── bench.c
│   │   ├── contrib/
│   │   │   ├── parsertrace.c
│   │   │   └── url_parser.c
│   │   ├── http_parser.c
│   │   ├── http_parser.gyp
│   │   ├── http_parser.h
│   │   └── test.c
│   ├── shrpx-unittest.cc
│   ├── shrpx.cc
│   ├── shrpx.h
│   ├── shrpx_accesslog.cc
│   ├── shrpx_accesslog.h
│   ├── shrpx_client_handler.cc
│   ├── shrpx_client_handler.h
│   ├── shrpx_config.cc
│   ├── shrpx_config.h
│   ├── shrpx_downstream.cc
│   ├── shrpx_downstream.h
│   ├── shrpx_downstream_connection.cc
│   ├── shrpx_downstream_connection.h
│   ├── shrpx_downstream_queue.cc
│   ├── shrpx_downstream_queue.h
│   ├── shrpx_error.h
│   ├── shrpx_http.cc
│   ├── shrpx_http.h
│   ├── shrpx_http_downstream_connection.cc
│   ├── shrpx_http_downstream_connection.h
│   ├── shrpx_https_upstream.cc
│   ├── shrpx_https_upstream.h
│   ├── shrpx_io_control.cc
│   ├── shrpx_io_control.h
│   ├── shrpx_listen_handler.cc
│   ├── shrpx_listen_handler.h
│   ├── shrpx_log.cc
│   ├── shrpx_log.h
│   ├── shrpx_spdy_downstream_connection.cc
│   ├── shrpx_spdy_downstream_connection.h
│   ├── shrpx_spdy_session.cc
│   ├── shrpx_spdy_session.h
│   ├── shrpx_spdy_upstream.cc
│   ├── shrpx_spdy_upstream.h
│   ├── shrpx_ssl.cc
│   ├── shrpx_ssl.h
│   ├── shrpx_ssl_test.cc
│   ├── shrpx_ssl_test.h
│   ├── shrpx_thread_event_receiver.cc
│   ├── shrpx_thread_event_receiver.h
│   ├── shrpx_upstream.h
│   ├── shrpx_worker.cc
│   ├── shrpx_worker.h
│   ├── spdycat.cc
│   ├── spdyd.cc
│   ├── spdylay_config.h
│   ├── spdylay_ssl.cc
│   ├── spdylay_ssl.h
│   ├── timegm.c
│   ├── timegm.h
│   ├── util.cc
│   └── util.h
└── tests/
    ├── .gitignore
    ├── Makefile.am
    ├── end_to_end.py
    ├── failmalloc.c
    ├── failmalloc_test.c
    ├── failmalloc_test.h
    ├── main.c
    ├── malloc_wrapper.c
    ├── malloc_wrapper.h
    ├── spdylay_buffer_test.c
    ├── spdylay_buffer_test.h
    ├── spdylay_frame_test.c
    ├── spdylay_frame_test.h
    ├── spdylay_gzip_test.c
    ├── spdylay_gzip_test.h
    ├── spdylay_map_test.c
    ├── spdylay_map_test.h
    ├── spdylay_npn_test.c
    ├── spdylay_npn_test.h
    ├── spdylay_pq_test.c
    ├── spdylay_pq_test.h
    ├── spdylay_queue_test.c
    ├── spdylay_queue_test.h
    ├── spdylay_session_test.c
    ├── spdylay_session_test.h
    ├── spdylay_stream_test.c
    ├── spdylay_stream_test.h
    ├── spdylay_test_helper.c
    ├── spdylay_test_helper.h
    ├── spdylay_zlib_test.c
    ├── spdylay_zlib_test.h
    └── testdata/
        ├── Makefile.am
        ├── cacert.pem
        ├── index.html
        └── privkey.pem
Download .txt
SYMBOL INDEX (1077 symbols across 113 files)

FILE: doc/_themes/sphinx_rtd_theme/__init__.py
  function get_html_theme_path (line 14) | def get_html_theme_path():

FILE: doc/mkapiref.py
  class FunctionDoc (line 28) | class FunctionDoc:
    method __init__ (line 29) | def __init__(self, name, content, domain):
    method write (line 34) | def write(self, out):
  class StructDoc (line 40) | class StructDoc:
    method __init__ (line 41) | def __init__(self, name, content, members, member_domain):
    method write (line 47) | def write(self, out):
  class MacroDoc (line 61) | class MacroDoc:
    method __init__ (line 62) | def __init__(self, name, content):
    method write (line 66) | def write(self, out):
  function make_api_ref (line 72) | def make_api_ref(infiles):
  function process_macro (line 109) | def process_macro(infile):
  function process_enum (line 115) | def process_enum(infile):
  function process_struct (line 138) | def process_struct(infile):
  function process_function (line 162) | def process_function(domain, infile):
  function read_content (line 178) | def read_content(infile):
  function arg_repl (line 190) | def arg_repl(matchobj):
  function transform_content (line 193) | def transform_content(content):

FILE: examples/spdy.h
  function namespace (line 43) | namespace spdylay {
  function class (line 59) | class response {
  function end (line 128) | void end(const std::string& body)
  function string_read_callback (line 143) | ssize_t string_read_callback
  function on_request_recv_callback (line 161) | void on_request_recv_callback
  function class (line 181) | class spdy {
  function run (line 206) | int run()
  function namespace (line 216) | namespace reactor {

FILE: examples/spdycli.c
  type Connection (line 57) | struct Connection {
  type Request (line 69) | struct Request {
  type URI (line 83) | struct URI {
  function die (line 110) | static void die(const char *msg)
  function dief (line 120) | static void dief(const char *func, const char *msg)
  function diec (line 130) | static void diec(const char *func, int error_code)
  function check_gzip (line 141) | static void check_gzip(struct Request *req, char **nv)
  function send_callback (line 169) | static ssize_t send_callback(spdylay_session *session _U_,
  function recv_callback (line 198) | static ssize_t recv_callback(spdylay_session *session _U_,
  function before_ctrl_send_callback (line 229) | static void before_ctrl_send_callback(spdylay_session *session,
  function on_ctrl_send_callback (line 245) | static void on_ctrl_send_callback(spdylay_session *session,
  function on_ctrl_recv_callback (line 270) | static void on_ctrl_recv_callback(spdylay_session *session,
  function on_stream_close_callback (line 312) | static void on_stream_close_callback(spdylay_session *session,
  function on_data_chunk_recv_callback (line 334) | static void on_data_chunk_recv_callback(spdylay_session *session, uint8_...
  function setup_spdylay_callbacks (line 373) | static void setup_spdylay_callbacks(spdylay_session_callbacks *callbacks)
  function select_next_proto_cb (line 390) | static int select_next_proto_cb(SSL* ssl _U_,
  function init_ssl_ctx (line 412) | static void init_ssl_ctx(SSL_CTX *ssl_ctx, uint16_t *spdy_proto_version)
  function ssl_handshake (line 423) | static void ssl_handshake(SSL *ssl, int fd)
  function connect_to (line 440) | static int connect_to(const char *host, uint16_t port)
  function make_non_block (line 472) | static void make_non_block(int fd)
  function set_tcp_nodelay (line 488) | static void set_tcp_nodelay(int fd)
  function ctl_poll (line 501) | static void ctl_poll(struct pollfd *pollfd, struct Connection *connection)
  function submit_request (line 519) | static void submit_request(struct Connection *connection, struct Request...
  function exec_io (line 544) | static void exec_io(struct Connection *connection)
  function request_init (line 557) | static void request_init(struct Request *req, const struct URI *uri)
  function request_free (line 567) | static void request_free(struct Request *req)
  function fetch_uri (line 578) | static void fetch_uri(const struct URI *uri)
  function parse_uri (line 659) | static int parse_uri(struct URI *res, const char *uri)
  function main (line 742) | int main(int argc, char **argv)

FILE: examples/spdynative.cc
  function main (line 29) | int main()

FILE: lib/includes/spdylay/spdylay.h
  type spdylay_session (line 38) | struct spdylay_session
  type spdylay_session (line 46) | typedef struct spdylay_session spdylay_session;
  type spdylay_proto_version (line 53) | typedef enum {
  type spdylay_error (line 74) | typedef enum {
  type spdylay_io_flag (line 194) | typedef enum {
  type spdylay_frame_type (line 202) | typedef enum {
  type spdylay_ctrl_flag (line 250) | typedef enum {
  type spdylay_data_flag (line 269) | typedef enum {
  type spdylay_settings_flag (line 284) | typedef enum {
  type spdylay_settings_id_flag (line 299) | typedef enum {
  type spdylay_settings_id (line 318) | typedef enum {
  type spdylay_status_code (line 376) | typedef enum {
  type spdylay_goaway_status_code (line 433) | typedef enum {
  type spdylay_ctrl_hd (line 452) | typedef struct {
  type spdylay_syn_stream (line 475) | typedef struct {
  type spdylay_syn_reply (line 514) | typedef struct {
  type spdylay_headers (line 537) | typedef struct {
  type spdylay_rst_stream (line 560) | typedef struct {
  type spdylay_settings_entry (line 579) | typedef struct {
  type spdylay_settings (line 598) | typedef struct {
  type spdylay_ping (line 617) | typedef struct {
  type spdylay_goaway (line 632) | typedef struct {
  type spdylay_window_update (line 654) | typedef struct {
  type spdylay_mem_chunk (line 674) | typedef struct {
  type spdylay_credential (line 691) | typedef struct {
  type spdylay_ctrl_frame (line 721) | typedef struct {
  type spdylay_data_source (line 734) | typedef union {
  type spdylay_data_provider (line 776) | typedef struct {
  type spdylay_frame (line 793) | typedef union {
  type spdylay_origin (line 1027) | struct spdylay_origin
  type spdylay_origin (line 1036) | typedef struct spdylay_origin spdylay_origin;
  type spdylay_session_callbacks (line 1133) | typedef struct {
  type spdylay_opt (line 1309) | typedef enum {
  type spdylay_npn_proto (line 2161) | typedef struct {
  type spdylay_gzip (line 2202) | struct spdylay_gzip
  type spdylay_gzip (line 2210) | typedef struct spdylay_gzip spdylay_gzip;

FILE: lib/spdylay_buffer.c
  function spdylay_buffer_init (line 33) | void spdylay_buffer_init(spdylay_buffer *buffer, size_t chunk_capacity)
  function spdylay_buffer_free (line 47) | void spdylay_buffer_free(spdylay_buffer *buffer)
  function spdylay_buffer_alloc (line 58) | int spdylay_buffer_alloc(spdylay_buffer *buffer)
  function spdylay_buffer_avail (line 93) | size_t spdylay_buffer_avail(spdylay_buffer *buffer)
  function spdylay_buffer_advance (line 98) | void spdylay_buffer_advance(spdylay_buffer *buffer, size_t amount)
  function spdylay_buffer_write (line 105) | int spdylay_buffer_write(spdylay_buffer *buffer, const uint8_t *data,
  function spdylay_buffer_length (line 125) | size_t spdylay_buffer_length(spdylay_buffer *buffer)
  function spdylay_buffer_capacity (line 130) | size_t spdylay_buffer_capacity(spdylay_buffer *buffer)
  function spdylay_buffer_serialize (line 135) | void spdylay_buffer_serialize(spdylay_buffer *buffer, uint8_t *buf)
  function spdylay_buffer_reset (line 150) | void spdylay_buffer_reset(spdylay_buffer *buffer)
  function spdylay_buffer_reader_init (line 157) | void spdylay_buffer_reader_init(spdylay_buffer_reader *reader,
  function spdylay_buffer_reader_uint8 (line 165) | uint8_t spdylay_buffer_reader_uint8(spdylay_buffer_reader *reader)
  function spdylay_buffer_reader_uint16 (line 172) | uint16_t spdylay_buffer_reader_uint16(spdylay_buffer_reader *reader)
  function spdylay_buffer_reader_uint32 (line 179) | uint32_t spdylay_buffer_reader_uint32(spdylay_buffer_reader *reader)
  function spdylay_buffer_reader_data (line 186) | void spdylay_buffer_reader_data(spdylay_buffer_reader *reader,
  function spdylay_buffer_reader_count (line 204) | int spdylay_buffer_reader_count(spdylay_buffer_reader *reader,
  function spdylay_buffer_reader_advance (line 229) | void spdylay_buffer_reader_advance(spdylay_buffer_reader *reader,

FILE: lib/spdylay_buffer.h
  type spdylay_buffer_chunk (line 34) | typedef struct spdylay_buffer_chunk {
  type spdylay_buffer (line 42) | typedef struct {
  type spdylay_buffer_reader (line 117) | typedef struct {

FILE: lib/spdylay_frame.c
  function spdylay_frame_get_len_size (line 35) | size_t spdylay_frame_get_len_size(uint16_t version)
  function spdylay_frame_pack_ctrl_hd (line 56) | static void spdylay_frame_pack_ctrl_hd(uint8_t* buf, const spdylay_ctrl_...
  function spdylay_frame_unpack_ctrl_hd (line 65) | static void spdylay_frame_unpack_ctrl_hd(spdylay_ctrl_hd *hd,
  function spdylay_frame_alloc_pack_nv (line 74) | ssize_t spdylay_frame_alloc_pack_nv(uint8_t **buf_ptr,
  function spdylay_frame_count_unpack_nv_space (line 113) | int spdylay_frame_count_unpack_nv_space(size_t *nvlen_ptr, size_t *bufle...
  function spdylay_frame_unpack_nv (line 228) | int spdylay_frame_unpack_nv(char ***nv_ptr, spdylay_buffer *in,
  function spdylay_frame_count_nv_space (line 316) | size_t spdylay_frame_count_nv_space(char **nv, size_t len_size)
  function spdylay_frame_pack_nv (line 351) | ssize_t spdylay_frame_pack_nv(uint8_t *buf, char **nv, size_t len_size)
  function spdylay_frame_is_ctrl_frame (line 400) | int spdylay_frame_is_ctrl_frame(uint8_t first_byte)
  function spdylay_frame_nv_del (line 405) | void spdylay_frame_nv_del(char **nv)
  function spdylay_string_compar (line 437) | static int spdylay_string_compar(const void *lhs, const void *rhs)
  function spdylay_frame_nv_sort (line 442) | void spdylay_frame_nv_sort(char **nv)
  function spdylay_frame_nv_downcase (line 449) | void spdylay_frame_nv_downcase(char **nv)
  function spdylay_frame_nv_3to2 (line 483) | void spdylay_frame_nv_3to2(char **nv)
  function spdylay_frame_nv_2to3 (line 496) | void spdylay_frame_nv_2to3(char **nv)
  function spdylay_frame_syn_stream_init (line 509) | void spdylay_frame_syn_stream_init(spdylay_syn_stream *frame,
  function spdylay_frame_syn_stream_free (line 524) | void spdylay_frame_syn_stream_free(spdylay_syn_stream *frame)
  function spdylay_frame_syn_reply_init (line 529) | void spdylay_frame_syn_reply_init(spdylay_syn_reply *frame,
  function spdylay_frame_syn_reply_free (line 541) | void spdylay_frame_syn_reply_free(spdylay_syn_reply *frame)
  function spdylay_frame_ping_init (line 546) | void spdylay_frame_ping_init(spdylay_ping *frame,
  function spdylay_frame_ping_free (line 557) | void spdylay_frame_ping_free(spdylay_ping *frame _U_)
  function spdylay_frame_goaway_init (line 560) | void spdylay_frame_goaway_init(spdylay_goaway *frame,
  function spdylay_frame_goaway_free (line 578) | void spdylay_frame_goaway_free(spdylay_goaway *frame _U_)
  function spdylay_frame_headers_init (line 581) | void spdylay_frame_headers_init(spdylay_headers *frame,
  function spdylay_frame_headers_free (line 593) | void spdylay_frame_headers_free(spdylay_headers *frame)
  function spdylay_frame_rst_stream_init (line 598) | void spdylay_frame_rst_stream_init(spdylay_rst_stream *frame,
  function spdylay_frame_rst_stream_free (line 611) | void spdylay_frame_rst_stream_free(spdylay_rst_stream *frame _U_)
  function spdylay_frame_window_update_init (line 614) | void spdylay_frame_window_update_init(spdylay_window_update *frame,
  function spdylay_frame_window_update_free (line 628) | void spdylay_frame_window_update_free(spdylay_window_update *frame _U_)
  function spdylay_frame_settings_init (line 631) | void spdylay_frame_settings_init(spdylay_settings *frame,
  function spdylay_frame_settings_free (line 644) | void spdylay_frame_settings_free(spdylay_settings *frame)
  function spdylay_frame_data_init (line 649) | void spdylay_frame_data_init(spdylay_data *frame, int32_t stream_id,
  function spdylay_frame_data_free (line 659) | void spdylay_frame_data_free(spdylay_data *frame _U_)
  function spdylay_frame_pack_syn_stream (line 662) | ssize_t spdylay_frame_pack_syn_stream(uint8_t **buf_ptr,
  function spdylay_frame_unpack_syn_stream (line 698) | int spdylay_frame_unpack_syn_stream(spdylay_syn_stream *frame,
  function spdylay_frame_unpack_syn_stream_without_nv (line 717) | int spdylay_frame_unpack_syn_stream_without_nv(spdylay_syn_stream *frame,
  function spdylay_frame_pack_syn_reply (line 741) | ssize_t spdylay_frame_pack_syn_reply(uint8_t **buf_ptr,
  function spdylay_frame_unpack_syn_reply (line 771) | int spdylay_frame_unpack_syn_reply(spdylay_syn_reply *frame,
  function spdylay_frame_unpack_syn_reply_without_nv (line 790) | int spdylay_frame_unpack_syn_reply_without_nv(spdylay_syn_reply *frame,
  function spdylay_frame_pack_ping (line 808) | ssize_t spdylay_frame_pack_ping(uint8_t **buf_ptr, size_t *buflen_ptr,
  function spdylay_frame_unpack_ping (line 823) | int spdylay_frame_unpack_ping(spdylay_ping *frame,
  function spdylay_frame_pack_goaway (line 835) | ssize_t spdylay_frame_pack_goaway(uint8_t **buf_ptr, size_t *buflen_ptr,
  function spdylay_frame_unpack_goaway (line 860) | int spdylay_frame_unpack_goaway(spdylay_goaway *frame,
  function spdylay_frame_pack_headers (line 886) | ssize_t spdylay_frame_pack_headers(uint8_t **buf_ptr, size_t *buflen_ptr,
  function spdylay_frame_unpack_headers (line 914) | int spdylay_frame_unpack_headers(spdylay_headers *frame,
  function spdylay_frame_unpack_headers_without_nv (line 933) | int spdylay_frame_unpack_headers_without_nv(spdylay_headers *frame,
  function spdylay_frame_pack_rst_stream (line 951) | ssize_t spdylay_frame_pack_rst_stream(uint8_t **buf_ptr, size_t *buflen_...
  function spdylay_frame_unpack_rst_stream (line 967) | int spdylay_frame_unpack_rst_stream(spdylay_rst_stream *frame,
  function spdylay_frame_pack_window_update (line 980) | ssize_t spdylay_frame_pack_window_update(uint8_t **buf_ptr, size_t *bufl...
  function spdylay_frame_unpack_window_update (line 996) | int spdylay_frame_unpack_window_update(spdylay_window_update *frame,
  function spdylay_frame_pack_settings (line 1011) | ssize_t spdylay_frame_pack_settings(uint8_t **buf_ptr, size_t *buflen_ptr,
  function spdylay_frame_unpack_settings (line 1050) | int spdylay_frame_unpack_settings(spdylay_settings *frame,
  function spdylay_settings_entry (line 1093) | spdylay_settings_entry* spdylay_frame_iv_copy(const spdylay_settings_ent...
  function spdylay_settings_entry_compar (line 1106) | static int spdylay_settings_entry_compar(const void *lhs, const void *rhs)
  function spdylay_frame_iv_sort (line 1112) | void spdylay_frame_iv_sort(spdylay_settings_entry *iv, size_t niv)
  function spdylay_frame_nv_offset (line 1117) | ssize_t spdylay_frame_nv_offset(spdylay_frame_type type, uint16_t version)
  function spdylay_frame_nv_check_null (line 1144) | int spdylay_frame_nv_check_null(const char **nv)

FILE: lib/spdylay_frame.h
  type spdylay_frame_category (line 69) | typedef enum {
  type spdylay_data (line 80) | typedef struct {

FILE: lib/spdylay_gzip.c
  function spdylay_gzip_inflate_new (line 29) | int spdylay_gzip_inflate_new(spdylay_gzip **inflater_ptr)
  function spdylay_gzip_inflate_del (line 50) | void spdylay_gzip_inflate_del(spdylay_gzip *inflater)
  function spdylay_gzip_inflate (line 58) | int spdylay_gzip_inflate(spdylay_gzip *inflater,

FILE: lib/spdylay_gzip.h
  type spdylay_gzip (line 34) | struct spdylay_gzip {

FILE: lib/spdylay_helper.c
  function spdylay_put_uint16be (line 31) | void spdylay_put_uint16be(uint8_t *buf, uint16_t n)
  function spdylay_put_uint32be (line 37) | void spdylay_put_uint32be(uint8_t *buf, uint32_t n)
  function spdylay_get_uint16 (line 43) | uint16_t spdylay_get_uint16(const uint8_t *data)
  function spdylay_get_uint32 (line 50) | uint32_t spdylay_get_uint32(const uint8_t *data)
  function spdylay_reserve_buffer (line 57) | int spdylay_reserve_buffer(uint8_t **buf_ptr, size_t *buflen_ptr,

FILE: lib/spdylay_map.c
  function spdylay_map_init (line 31) | int spdylay_map_init(spdylay_map *map)
  function spdylay_map_free (line 43) | void spdylay_map_free(spdylay_map *map)
  function spdylay_map_each_free (line 48) | void spdylay_map_each_free(spdylay_map *map,
  function spdylay_map_each (line 64) | int spdylay_map_each(spdylay_map *map,
  function spdylay_map_entry_init (line 82) | void spdylay_map_entry_init(spdylay_map_entry *entry, key_type key)
  function hash (line 90) | static int32_t hash(int32_t h, int32_t mod)
  function insert (line 96) | static int insert(spdylay_map_entry **table, size_t tablelen,
  function resize (line 117) | static int resize(spdylay_map *map, size_t new_tablelen)
  function spdylay_map_insert (line 142) | int spdylay_map_insert(spdylay_map *map, spdylay_map_entry *new_entry)
  function spdylay_map_entry (line 160) | spdylay_map_entry* spdylay_map_find(spdylay_map *map, key_type key)
  function spdylay_map_remove (line 173) | int spdylay_map_remove(spdylay_map *map, key_type key)
  function spdylay_map_size (line 194) | size_t spdylay_map_size(spdylay_map *map)

FILE: lib/spdylay_map.h
  type key_type (line 37) | typedef uint32_t key_type;
  type spdylay_map_entry (line 39) | typedef struct spdylay_map_entry {
  type spdylay_map (line 44) | typedef struct {

FILE: lib/spdylay_npn.c
  function spdylay_npn_proto (line 35) | const spdylay_npn_proto* spdylay_npn_get_proto_list(size_t *len_ptr)
  function spdylay_select_next_protocol (line 41) | int spdylay_select_next_protocol(unsigned char **out, unsigned char *out...
  function spdylay_npn_get_version (line 84) | uint16_t spdylay_npn_get_version(const unsigned char *proto, size_t prot...

FILE: lib/spdylay_outbound_item.c
  function spdylay_outbound_item_free (line 29) | void spdylay_outbound_item_free(spdylay_outbound_item *item)

FILE: lib/spdylay_outbound_item.h
  type spdylay_syn_stream_aux_data (line 38) | typedef struct {
  type spdylay_outbound_item (line 43) | typedef struct {

FILE: lib/spdylay_pq.c
  function spdylay_pq_init (line 27) | int spdylay_pq_init(spdylay_pq *pq, spdylay_compar compar)
  function spdylay_pq_free (line 39) | void spdylay_pq_free(spdylay_pq *pq)
  function swap (line 45) | static void swap(spdylay_pq *pq, size_t i, size_t j)
  function bubble_up (line 52) | static void bubble_up(spdylay_pq *pq, size_t index)
  function spdylay_pq_push (line 65) | int spdylay_pq_push(spdylay_pq *pq, void *item)
  function bubble_down (line 91) | static void bubble_down(spdylay_pq *pq, size_t index)
  function spdylay_pq_pop (line 111) | void spdylay_pq_pop(spdylay_pq *pq)
  function spdylay_pq_empty (line 120) | int spdylay_pq_empty(spdylay_pq *pq)
  function spdylay_pq_size (line 125) | size_t spdylay_pq_size(spdylay_pq *pq)

FILE: lib/spdylay_pq.h
  type spdylay_pq (line 37) | typedef struct {

FILE: lib/spdylay_queue.c
  function spdylay_queue_init (line 30) | void spdylay_queue_init(spdylay_queue *queue)
  function spdylay_queue_free (line 35) | void spdylay_queue_free(spdylay_queue *queue)
  function spdylay_queue_push (line 49) | int spdylay_queue_push(spdylay_queue *queue, void *data)
  function spdylay_queue_pop (line 68) | void spdylay_queue_pop(spdylay_queue *queue)
  function spdylay_queue_empty (line 91) | int spdylay_queue_empty(spdylay_queue *queue)

FILE: lib/spdylay_queue.h
  type spdylay_queue_cell (line 34) | typedef struct spdylay_queue_cell {
  type spdylay_queue (line 39) | typedef struct {

FILE: lib/spdylay_session.c
  function spdylay_session_is_outgoing_concurrent_streams_max (line 40) | static int spdylay_session_is_outgoing_concurrent_streams_max
  function spdylay_session_is_incoming_concurrent_streams_max (line 52) | static int spdylay_session_is_incoming_concurrent_streams_max
  function spdylay_is_non_fatal (line 62) | static int spdylay_is_non_fatal(int error)
  function spdylay_is_fatal (line 70) | static int spdylay_is_fatal(int error)
  function spdylay_session_fail_session (line 75) | int spdylay_session_fail_session(spdylay_session *session,
  function spdylay_session_is_my_stream_id (line 82) | int spdylay_session_is_my_stream_id(spdylay_session *session,
  function spdylay_stream (line 93) | spdylay_stream* spdylay_session_get_stream(spdylay_session *session,
  function spdylay_outbound_item_compar (line 99) | static int spdylay_outbound_item_compar(const void *lhsx, const void *rhsx)
  function spdylay_inbound_frame_reset (line 111) | static void spdylay_inbound_frame_reset(spdylay_inbound_frame *iframe)
  function spdylay_inbound_frame_payload_nv_offset (line 125) | static size_t spdylay_inbound_frame_payload_nv_offset
  function spdylay_session_new (line 139) | static int spdylay_session_new(spdylay_session **session_ptr,
  function spdylay_session_client_new (line 275) | int spdylay_session_client_new(spdylay_session **session_ptr,
  function spdylay_session_server_new (line 292) | int spdylay_session_server_new(spdylay_session **session_ptr,
  function spdylay_free_streams (line 311) | static int spdylay_free_streams(spdylay_map_entry *entry, void *ptr _U_)
  function spdylay_session_ob_pq_free (line 318) | static void spdylay_session_ob_pq_free(spdylay_pq *pq)
  function spdylay_active_outbound_item_reset (line 329) | static void spdylay_active_outbound_item_reset
  function spdylay_session_del (line 338) | void spdylay_session_del(spdylay_session *session)
  function spdylay_session_add_frame (line 357) | int spdylay_session_add_frame(spdylay_session *session,
  function spdylay_session_add_rst_stream (line 460) | int spdylay_session_add_rst_stream(spdylay_session *session,
  function spdylay_stream (line 480) | spdylay_stream* spdylay_session_open_stream(spdylay_session *session,
  function spdylay_session_close_stream (line 508) | int spdylay_session_close_stream(spdylay_session *session, int32_t strea...
  function spdylay_session_close_stream_if_shut_rdwr (line 538) | int spdylay_session_close_stream_if_shut_rdwr(spdylay_session *session,
  function spdylay_session_close_pushed_streams (line 549) | void spdylay_session_close_pushed_streams(spdylay_session *session,
  function spdylay_predicate_stream_for_send (line 564) | static int spdylay_predicate_stream_for_send(spdylay_stream *stream)
  function spdylay_session_predicate_syn_stream_send (line 588) | static int spdylay_session_predicate_syn_stream_send
  function spdylay_session_predicate_syn_reply_send (line 629) | static int spdylay_session_predicate_syn_reply_send(spdylay_session *ses...
  function spdylay_session_predicate_headers_send (line 669) | static int spdylay_session_predicate_headers_send(spdylay_session *session,
  function spdylay_session_predicate_window_update_send (line 708) | static int spdylay_session_predicate_window_update_send
  function spdylay_session_next_data_read (line 733) | static size_t spdylay_session_next_data_read(spdylay_session *session,
  function spdylay_session_predicate_data_send (line 770) | static int spdylay_session_predicate_data_send(spdylay_session *session,
  function spdylay_session_prep_frame (line 810) | static ssize_t spdylay_session_prep_frame(spdylay_session *session,
  function spdylay_outbound_item (line 1022) | spdylay_outbound_item* spdylay_session_get_ob_pq_top
  function spdylay_outbound_item (line 1028) | spdylay_outbound_item* spdylay_session_get_next_ob_item
  function spdylay_outbound_item (line 1062) | spdylay_outbound_item* spdylay_session_pop_next_ob_item
  function spdylay_session_after_frame_sent (line 1115) | static int spdylay_session_after_frame_sent(spdylay_session *session)
  function spdylay_session_send (line 1326) | int spdylay_session_send(spdylay_session *session)
  function spdylay_recv (line 1437) | static ssize_t spdylay_recv(spdylay_session *session, uint8_t *buf, size...
  function spdylay_session_call_on_request_recv (line 1454) | static void spdylay_session_call_on_request_recv
  function spdylay_session_call_on_ctrl_frame_received (line 1463) | static void spdylay_session_call_on_ctrl_frame_received
  function spdylay_session_is_new_peer_stream_id (line 1476) | static int spdylay_session_is_new_peer_stream_id(spdylay_session *session,
  function spdylay_session_check_version (line 1492) | static int spdylay_session_check_version(spdylay_session *session,
  function spdylay_session_validate_syn_stream (line 1502) | static int spdylay_session_validate_syn_stream(spdylay_session *session,
  function spdylay_session_handle_invalid_stream (line 1538) | static int spdylay_session_handle_invalid_stream
  function spdylay_session_on_syn_stream_received (line 1557) | int spdylay_session_on_syn_stream_received(spdylay_session *session,
  function spdylay_session_on_syn_reply_received (line 1639) | int spdylay_session_on_syn_reply_received(spdylay_session *session,
  function spdylay_session_on_rst_stream_received (line 1688) | int spdylay_session_on_rst_stream_received(spdylay_session *session,
  function spdylay_update_initial_window_size_func (line 1707) | static int spdylay_update_initial_window_size_func(spdylay_map_entry *en...
  function spdylay_session_update_initial_window_size (line 1745) | static int spdylay_session_update_initial_window_size
  function spdylay_session_update_local_settings (line 1759) | void spdylay_session_update_local_settings(spdylay_session *session,
  function spdylay_session_on_settings_received (line 1770) | int spdylay_session_on_settings_received(spdylay_session *session,
  function spdylay_session_on_ping_received (line 1807) | int spdylay_session_on_ping_received(spdylay_session *session,
  function spdylay_session_on_goaway_received (line 1831) | int spdylay_session_on_goaway_received(spdylay_session *session,
  function push_back_deferred_data_func (line 1843) | static int push_back_deferred_data_func(spdylay_map_entry *entry, void *...
  function push_back_deferred_data (line 1871) | static int push_back_deferred_data(spdylay_session *session)
  function spdylay_session_on_window_update_received (line 1877) | int spdylay_session_on_window_update_received(spdylay_session *session,
  function spdylay_session_on_headers_received (line 1944) | int spdylay_session_on_headers_received(spdylay_session *session,
  function spdylay_session_handle_parse_error (line 1997) | static void spdylay_session_handle_parse_error(spdylay_session *session,
  function spdylay_get_status_code_from_error_code (line 2014) | static int spdylay_get_status_code_from_error_code(int error_code)
  function spdylay_session_process_ctrl_frame (line 2025) | static int spdylay_session_process_ctrl_frame(spdylay_session *session)
  function spdylay_session_on_data_received (line 2234) | int spdylay_session_on_data_received(spdylay_session *session,
  function spdylay_session_process_data_frame (line 2294) | static int spdylay_session_process_data_frame(spdylay_session *session)
  function update_recv_window_size (line 2313) | static int update_recv_window_size(spdylay_session *session,
  function spdylay_session_update_recv_connection_window_size (line 2359) | static int spdylay_session_update_recv_connection_window_size
  function spdylay_session_update_recv_window_size (line 2382) | static int spdylay_session_update_recv_window_size(spdylay_session *sess...
  function update_consumed_size (line 2399) | static int update_consumed_size
  function spdylay_session_update_connection_consumed_size (line 2430) | static int spdylay_session_update_connection_consumed_size
  function spdylay_session_update_stream_consumed_size (line 2438) | static int spdylay_session_update_stream_consumed_size
  function spdylay_session_check_data_recv_allowed (line 2452) | static int spdylay_session_check_data_recv_allowed(spdylay_session *sess...
  function spdylay_session_mem_recv (line 2474) | ssize_t spdylay_session_mem_recv(spdylay_session *session,
  function spdylay_session_recv (line 2682) | int spdylay_session_recv(spdylay_session *session)
  function spdylay_session_want_read (line 2704) | int spdylay_session_want_read(spdylay_session *session)
  function spdylay_session_want_write (line 2718) | int spdylay_session_want_write(spdylay_session *session)
  function spdylay_session_add_ping (line 2739) | int spdylay_session_add_ping(spdylay_session *session, uint32_t unique_id)
  function spdylay_session_add_goaway (line 2756) | int spdylay_session_add_goaway(spdylay_session *session,
  function spdylay_session_add_window_update (line 2776) | int spdylay_session_add_window_update(spdylay_session *session,
  function spdylay_session_pack_data (line 2796) | ssize_t spdylay_session_pack_data(spdylay_session *session,
  function spdylay_session_get_next_unique_id (line 2832) | uint32_t spdylay_session_get_next_unique_id(spdylay_session *session)
  function spdylay_session_set_stream_user_data (line 2860) | int spdylay_session_set_stream_user_data(spdylay_session *session,
  function spdylay_session_resume_data (line 2872) | int spdylay_session_resume_data(spdylay_session *session, int32_t stream...
  function spdylay_session_get_pri_lowest (line 2888) | uint8_t spdylay_session_get_pri_lowest(spdylay_session *session)
  function spdylay_session_get_outbound_queue_size (line 2899) | size_t spdylay_session_get_outbound_queue_size(spdylay_session *session)
  function spdylay_session_set_initial_client_cert_origin (line 2904) | int spdylay_session_set_initial_client_cert_origin(spdylay_session *sess...
  function spdylay_origin (line 2912) | const spdylay_origin* spdylay_session_get_client_cert_origin
  function spdylay_session_set_option (line 2920) | int spdylay_session_set_option(spdylay_session *session,
  function spdylay_session_get_stream_recv_data_length (line 2966) | int32_t spdylay_session_get_stream_recv_data_length
  function spdylay_session_get_recv_data_length (line 2980) | int32_t spdylay_session_get_recv_data_length(spdylay_session *session)
  function spdylay_session_consume (line 2988) | int spdylay_session_consume(spdylay_session *session, int32_t stream_id,

FILE: lib/spdylay_session.h
  type spdylay_optmask (line 55) | typedef enum {
  type spdylay_active_outbound_item (line 60) | typedef struct {
  type spdylay_inbound_state (line 84) | typedef enum {
  type spdylay_inbound_frame (line 105) | typedef struct {
  type spdylay_goaway_flag (line 132) | typedef enum {
  type spdylay_flow_control_flag (line 142) | typedef enum {
  type spdylay_session (line 151) | struct spdylay_session {
  type spdylay_update_window_size_arg (line 241) | typedef struct {

FILE: lib/spdylay_stream.c
  function spdylay_stream_init (line 29) | void spdylay_stream_init(spdylay_stream *stream, int32_t stream_id,
  function spdylay_stream_free (line 52) | void spdylay_stream_free(spdylay_stream *stream)
  function spdylay_stream_shutdown (line 59) | void spdylay_stream_shutdown(spdylay_stream *stream, spdylay_shut_flag f...
  function spdylay_stream_add_pushed_stream (line 64) | int spdylay_stream_add_pushed_stream(spdylay_stream *stream, int32_t str...
  function spdylay_stream_defer_data (line 81) | void spdylay_stream_defer_data(spdylay_stream *stream,
  function spdylay_stream_detach_deferred_data (line 90) | void spdylay_stream_detach_deferred_data(spdylay_stream *stream)
  function spdylay_stream_update_initial_window_size (line 96) | void spdylay_stream_update_initial_window_size(spdylay_stream *stream,

FILE: lib/spdylay_stream.h
  type spdylay_stream_state (line 47) | typedef enum {
  type spdylay_shut_flag (line 62) | typedef enum {
  type spdylay_deferred_flag (line 73) | typedef enum {
  type spdylay_stream (line 79) | typedef struct {

FILE: lib/spdylay_submit.c
  function spdylay_submit_syn_stream_shared (line 33) | static int spdylay_submit_syn_stream_shared
  function spdylay_submit_syn_stream (line 114) | int spdylay_submit_syn_stream(spdylay_session *session, uint8_t flags,
  function spdylay_submit_syn_reply (line 122) | int spdylay_submit_syn_reply(spdylay_session *session, uint8_t flags,
  function spdylay_submit_headers (line 155) | int spdylay_submit_headers(spdylay_session *session, uint8_t flags,
  function spdylay_submit_ping (line 188) | int spdylay_submit_ping(spdylay_session *session)
  function spdylay_submit_rst_stream (line 194) | int spdylay_submit_rst_stream(spdylay_session *session, int32_t stream_id,
  function spdylay_submit_goaway (line 200) | int spdylay_submit_goaway(spdylay_session *session, uint32_t status_code)
  function spdylay_submit_settings (line 206) | int spdylay_submit_settings(spdylay_session *session, uint8_t flags,
  function spdylay_submit_window_update (line 245) | int spdylay_submit_window_update(spdylay_session *session, int32_t strea...
  function spdylay_submit_request (line 271) | int spdylay_submit_request(spdylay_session *session, uint8_t pri,
  function spdylay_submit_response (line 285) | int spdylay_submit_response(spdylay_session *session,
  function spdylay_submit_data (line 330) | int spdylay_submit_data(spdylay_session *session, int32_t stream_id,

FILE: lib/spdylay_zlib.c
  function spdylay_zlib_deflate_hd_init (line 246) | int spdylay_zlib_deflate_hd_init(spdylay_zlib *deflater, int comp,
  function spdylay_zlib_inflate_hd_init (line 274) | int spdylay_zlib_inflate_hd_init(spdylay_zlib *inflater, uint16_t version)
  function spdylay_zlib_deflate_free (line 294) | void spdylay_zlib_deflate_free(spdylay_zlib *deflater)
  function spdylay_zlib_inflate_free (line 299) | void spdylay_zlib_inflate_free(spdylay_zlib *inflater)
  function spdylay_zlib_deflate_hd (line 304) | ssize_t spdylay_zlib_deflate_hd(spdylay_zlib *deflater,
  function spdylay_zlib_deflate_hd_bound (line 321) | size_t spdylay_zlib_deflate_hd_bound(spdylay_zlib *deflater, size_t len)
  function spdylay_zlib_inflate_hd (line 326) | ssize_t spdylay_zlib_inflate_hd(spdylay_zlib *inflater,

FILE: lib/spdylay_zlib.h
  type spdylay_zlib (line 36) | typedef struct {

FILE: python/spdyclient.py
  class MyStreamHandler (line 11) | class MyStreamHandler(spdylay.BaseSPDYStreamHandler):
    method on_header (line 12) | def on_header(self, nv):
    method on_data (line 17) | def on_data(self, data):
    method on_close (line 21) | def on_close(self, status_code):

FILE: python/spdylay_tests.py
  class BufferList (line 9) | class BufferList:
    method __init__ (line 10) | def __init__(self):
    method add_buffer (line 13) | def add_buffer(self, bytebuf):
    method get_bytes (line 16) | def get_bytes(self, length):
  class IOBridge (line 26) | class IOBridge:
    method __init__ (line 27) | def __init__(self, inputs, outputs):
  class Streams (line 31) | class Streams:
    method __init__ (line 32) | def __init__(self, iob):
  function recv_cb (line 38) | def recv_cb(session, length):
  function send_cb (line 42) | def send_cb(session, data):
  function read_cb (line 47) | def read_cb(session, stream_id, length, read_ctrl, source):
  function on_data_chunk_recv_cb (line 53) | def on_data_chunk_recv_cb(session, flags, stream_id, data):
  function on_ctrl_recv_cb (line 56) | def on_ctrl_recv_cb(session, frame):
  class SpdylayTests (line 59) | class SpdylayTests(unittest.TestCase):
    method setUp (line 61) | def setUp(self):
    method test_submit_request_and_response (line 89) | def test_submit_request_and_response(self):
    method test_submit_syn_stream_and_syn_stream (line 125) | def test_submit_syn_stream_and_syn_stream(self):
    method test_submit_rst_stream (line 150) | def test_submit_rst_stream(self):
    method test_submit_goaway (line 166) | def test_submit_goaway(self):
    method test_resume_data (line 176) | def test_resume_data(self):
    method test_get_pri_lowest (line 179) | def test_get_pri_lowest(self):
    method test_fail_session (line 182) | def test_fail_session(self):
    method test_deferred_data (line 195) | def test_deferred_data(self):
    method test_recv_cb_eof (line 227) | def test_recv_cb_eof(self):
    method test_recv_cb_callback_failure (line 240) | def test_recv_cb_callback_failure(self):
    method test_send_cb_callback_failure (line 253) | def test_send_cb_callback_failure(self):
    method test_submit_data (line 268) | def test_submit_data(self):
    method test_submit_headers (line 287) | def test_submit_headers(self):
    method test_submit_ping (line 309) | def test_submit_ping(self):
    method test_submit_window_update (line 319) | def test_submit_window_update(self):
    method test_get_npn_protocols (line 340) | def test_get_npn_protocols(self):

FILE: python/spdyserv.py
  class MySPDYRequestHandler (line 14) | class MySPDYRequestHandler(spdylay.BaseSPDYRequestHandler):
    method do_GET (line 16) | def do_GET(self):

FILE: src/EventPollEvent.h
  function namespace (line 30) | namespace spdylay {

FILE: src/EventPoll_epoll.cc
  type spdylay (line 31) | namespace spdylay {
    function update_event (line 89) | int update_event(int epfd, int op, int fd, int events, void *user_data)

FILE: src/EventPoll_epoll.h
  function namespace (line 36) | namespace spdylay {

FILE: src/EventPoll_kqueue.cc
  type spdylay (line 38) | namespace spdylay {
    type kevent (line 45) | struct kevent
    function update_event (line 100) | int update_event(int kq, int fd, int events, void *user_data)

FILE: src/EventPoll_kqueue.h
  function namespace (line 38) | namespace spdylay {

FILE: src/HtmlParser.cc
  type spdylay (line 31) | namespace spdylay {
    function start_element_func (line 61) | void start_element_func

FILE: src/HtmlParser.h
  type ParserData (line 39) | struct ParserData {
  function std (line 50) | const std::vector<std::string>& get_links() const;

FILE: src/SpdyServer.cc
  type spdylay (line 50) | namespace spdylay {
    class Sessions (line 94) | class Sessions {
      method Sessions (line 96) | Sessions(int max_events, SSL_CTX *ssl_ctx)
      method add_handler (line 109) | void add_handler(EventHandler *handler)
      method remove_handler (line 113) | void remove_handler(EventHandler *handler)
      method SSL (line 117) | SSL* ssl_session_new(int fd)
      method add_poll (line 126) | int add_poll(EventHandler *handler)
      method mod_poll (line 130) | int mod_poll(EventHandler *handler)
      method poll (line 134) | int poll(int timeout)
      method get_events (line 142) | int get_events(int p)
      method update_poll_internal (line 147) | int update_poll_internal(EventHandler *handler, int op)
    function print_session_id (line 165) | void print_session_id(int64_t id)
    function on_session_closed (line 172) | void on_session_closed(EventHandler *hd, int64_t session_id)
    function Request (line 383) | Request* SpdyEventHandler::get_stream(int32_t stream_id)
    function hd_send_callback (line 394) | ssize_t hd_send_callback(spdylay_session *session,
    function hd_recv_callback (line 415) | ssize_t hd_recv_callback(spdylay_session *session,
    function file_read_callback (line 433) | ssize_t file_read_callback
    function check_url (line 452) | bool check_url(const std::string& url)
    function prepare_status_response (line 464) | void prepare_status_response(Request *req, SpdyEventHandler *hd,
    function prepare_response (line 498) | void prepare_response(Request *req, SpdyEventHandler *hd)
    function append_nv (line 575) | void append_nv(Request *req, char **nv)
    function hd_on_ctrl_recv_callback (line 584) | void hd_on_ctrl_recv_callback
    function htdocs_on_request_recv_callback (line 613) | void htdocs_on_request_recv_callback
    function hd_on_ctrl_send_callback (line 621) | void hd_on_ctrl_send_callback
    function on_data_chunk_recv_callback (line 634) | void on_data_chunk_recv_callback
    function hd_on_data_recv_callback (line 643) | void hd_on_data_recv_callback
    function hd_on_data_send_callback (line 657) | void hd_on_data_send_callback
    function on_stream_close_callback (line 670) | void on_stream_close_callback
    function fill_callback (line 686) | void fill_callback(spdylay_session_callbacks& callbacks, const Config ...
    class SSLAcceptEventHandler (line 707) | class SSLAcceptEventHandler : public EventHandler {
      method SSLAcceptEventHandler (line 709) | SSLAcceptEventHandler(const Config *config,
      method execute (line 731) | virtual int execute(Sessions *sessions)
      method want_read (line 778) | virtual bool want_read()
      method want_write (line 782) | virtual bool want_write()
      method fd (line 786) | virtual int fd() const
      method finish (line 790) | virtual bool finish()
      method add_next_handler (line 795) | void add_next_handler(Sessions *sessions)
    class ListenEventHandler (line 818) | class ListenEventHandler : public EventHandler {
      method ListenEventHandler (line 820) | ListenEventHandler(const Config* config,
      method execute (line 828) | virtual int execute(Sessions *sessions)
      method want_read (line 842) | virtual bool want_read()
      method want_write (line 846) | virtual bool want_write()
      method fd (line 850) | virtual int fd() const
      method finish (line 854) | virtual bool finish()
      method add_next_handler (line 859) | void add_next_handler(Sessions *sessions, int cfd)
    function on_close (line 897) | void on_close(Sessions &sessions, EventHandler *hd)
    function next_proto_cb (line 945) | int next_proto_cb(SSL *s, const unsigned char **data, unsigned int *len,
    function verify_callback (line 957) | int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)

FILE: src/SpdyServer.h
  type Config (line 45) | struct Config {
  function class (line 63) | class EventHandler {
  type Request (line 89) | struct Request {
  function class (line 98) | class SpdyEventHandler : public EventHandler {

FILE: src/base64.h
  function namespace (line 30) | namespace spdylay {

FILE: src/http-parser/bench.c
  function on_info (line 44) | static int on_info(http_parser* p) {
  function on_data (line 49) | static int on_data(http_parser* p, const char *at, size_t length) {
  function bench (line 64) | int bench(int iter_count, int silent) {
  function main (line 103) | int main(int argc, char** argv) {

FILE: src/http-parser/contrib/parsertrace.c
  function on_message_begin (line 32) | int on_message_begin(http_parser* _) {
  function on_headers_complete (line 38) | int on_headers_complete(http_parser* _) {
  function on_message_complete (line 44) | int on_message_complete(http_parser* _) {
  function on_url (line 50) | int on_url(http_parser* _, const char* at, size_t length) {
  function on_header_field (line 56) | int on_header_field(http_parser* _, const char* at, size_t length) {
  function on_header_value (line 62) | int on_header_value(http_parser* _, const char* at, size_t length) {
  function on_body (line 68) | int on_body(http_parser* _, const char* at, size_t length) {
  function usage (line 74) | void usage(const char* name) {
  function main (line 83) | int main(int argc, char* argv[]) {

FILE: src/http-parser/contrib/url_parser.c
  function dump_url (line 5) | void
  function main (line 26) | int main(int argc, char ** argv) {

FILE: src/http-parser/http_parser.c
  type state (line 279) | enum state
  type header_states (line 364) | enum header_states
  type http_host_state (line 394) | enum http_host_state
  function parse_url_char (line 479) | static enum state
  function http_parser_execute (line 627) | size_t http_parser_execute (http_parser *parser,
  function http_message_needs_eof (line 2112) | int
  function http_should_keep_alive (line 2135) | int
  type http_method (line 2155) | enum http_method
  function http_parser_init (line 2161) | void
  function http_parser_settings_init (line 2172) | void
  type http_errno (line 2179) | enum http_errno
  type http_errno (line 2186) | enum http_errno
  function http_parse_host_char (line 2192) | static enum http_host_state
  function http_parse_host (line 2257) | static int
  function http_parser_parse_url (line 2331) | int
  function http_parser_pause (line 2435) | void
  function http_body_is_final (line 2449) | int
  function http_parser_version (line 2454) | unsigned long

FILE: src/http-parser/http_parser.h
  type __int8 (line 36) | typedef __int8 int8_t;
  type __int16 (line 38) | typedef __int16 int16_t;
  type __int32 (line 40) | typedef __int32 int32_t;
  type __int64 (line 42) | typedef __int64 int64_t;
  type http_parser (line 66) | typedef struct http_parser http_parser;
  type http_parser_settings (line 67) | typedef struct http_parser_settings http_parser_settings;
  type http_method (line 123) | enum http_method
  type http_parser_type (line 131) | enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }
  type flags (line 135) | enum flags
  type http_errno (line 196) | enum http_errno {
  type http_parser (line 206) | struct http_parser {
  type http_parser_settings (line 236) | struct http_parser_settings {
  type http_parser_url_fields (line 253) | enum http_parser_url_fields
  type http_parser_url (line 272) | struct http_parser_url {
  type http_parser_type (line 295) | enum http_parser_type
  type http_method (line 320) | enum http_method
  type http_errno (line 323) | enum http_errno
  type http_errno (line 326) | enum http_errno
  type http_parser_url (line 331) | struct http_parser_url

FILE: src/http-parser/test.c
  type message (line 48) | struct message {
  type message (line 87) | struct message
  type message (line 92) | struct message
  type message (line 1108) | struct message
  function strnlen (line 1702) | size_t
  function strlncat (line 1714) | size_t
  function strlcat (line 1736) | size_t
  function strlncpy (line 1742) | size_t
  function strlcpy (line 1760) | size_t
  function request_url_cb (line 1766) | int
  function header_field_cb (line 1777) | int
  function header_value_cb (line 1796) | int
  function check_body_is_final (line 1812) | void
  function body_cb (line 1825) | int
  function count_body_cb (line 1839) | int
  function message_begin_cb (line 1849) | int
  function headers_complete_cb (line 1857) | int
  function message_complete_cb (line 1870) | int
  function response_status_cb (line 1902) | int
  function chunk_header_cb (line 1913) | int
  function chunk_complete_cb (line 1926) | int
  function dontcall_message_begin_cb (line 1944) | int
  function dontcall_header_field_cb (line 1952) | int
  function dontcall_header_value_cb (line 1960) | int
  function dontcall_request_url_cb (line 1968) | int
  function dontcall_body_cb (line 1976) | int
  function dontcall_headers_complete_cb (line 1984) | int
  function dontcall_message_complete_cb (line 1993) | int
  function dontcall_response_status_cb (line 2002) | int
  function dontcall_chunk_header_cb (line 2010) | int
  function dontcall_chunk_complete_cb (line 2018) | int
  function pause_message_begin_cb (line 2044) | int
  function pause_header_field_cb (line 2052) | int
  function pause_header_value_cb (line 2060) | int
  function pause_request_url_cb (line 2068) | int
  function pause_body_cb (line 2076) | int
  function pause_headers_complete_cb (line 2084) | int
  function pause_message_complete_cb (line 2092) | int
  function pause_response_status_cb (line 2100) | int
  function pause_chunk_header_cb (line 2108) | int
  function pause_chunk_complete_cb (line 2116) | int
  function parser_init (line 2176) | void
  function parser_free (line 2191) | void
  function parse (line 2199) | size_t parse (const char *buf, size_t len)
  function parse_count_body (line 2207) | size_t parse_count_body (const char *buf, size_t len)
  function parse_pause (line 2215) | size_t parse_pause (const char *buf, size_t len)
  function check_str_eq (line 2226) | static inline int
  function check_num_eq (line 2246) | static inline int
  function message_eq (line 2281) | int
  function count_parsed_messages (line 2367) | size_t
  function upgrade_message_fix (line 2390) | void
  function print_error (line 2427) | static void
  function test_preserve_data (line 2468) | void
  type url_test (line 2481) | struct url_test {
  type url_test (line 2489) | struct url_test
  function dump_url (line 2971) | void
  function test_parse_url (line 2992) | void
  function test_method_str (line 3038) | void
  function test_message (line 3045) | void
  function test_message_count_body (line 3105) | void
  type http_errno (line 3142) | enum http_errno
  type http_errno (line 3146) | enum http_errno
  function test_header_overflow_error (line 3168) | void
  function test_header_nread_value (line 3197) | void
  function test_content_length_overflow (line 3212) | static void
  function test_header_content_length_overflow_error (line 3225) | void
  function test_chunk_content_length_overflow_error (line 3241) | void
  function test_no_overflow_long_body (line 3259) | void
  function test_multiple3 (line 3292) | void
  function test_scan (line 3349) | void
  function test_message_pause (line 3499) | void
  function main (line 3550) | int

FILE: src/shrpx-unittest.cc
  function init_suite1 (line 33) | static int init_suite1(void)
  function clean_suite1 (line 38) | static int clean_suite1(void)
  function main (line 44) | int main(int argc, char* argv[])

FILE: src/shrpx.cc
  type shrpx (line 61) | namespace shrpx {
    function ssl_acceptcb (line 64) | void ssl_acceptcb(evconnlistener *listener, int fd,
    function is_ipv6_numeric_addr (line 73) | bool is_ipv6_numeric_addr(const char *host)
    function resolve_hostname (line 81) | int resolve_hostname(sockaddr_union *addr, size_t *addrlen,
    function evlistener_errorcb (line 126) | void evlistener_errorcb(evconnlistener *listener, void *ptr)
    function evconnlistener (line 133) | evconnlistener* create_evlistener(ListenHandler *handler, int family)
    function drop_privileges (line 221) | void drop_privileges()
    function save_pid (line 241) | void save_pid()
    function event_loop (line 254) | int event_loop()
    function conf_exists (line 323) | bool conf_exists(const char *path)
    function fill_default_config (line 336) | void fill_default_config()
    function get_rate_limit (line 438) | size_t get_rate_limit(size_t rate_limit)
    function print_version (line 449) | void print_version(std::ostream& out)
    function print_usage (line 456) | void print_usage(std::ostream& out)
    function print_help (line 468) | void print_help(std::ostream& out)
    function main (line 747) | int main(int argc, char **argv)
    function main (line 1251) | int main(int argc, char **argv)

FILE: src/shrpx_accesslog.cc
  type shrpx (line 36) | namespace shrpx {
    function get_datestr (line 39) | void get_datestr(char *buf)
    function upstream_connect (line 55) | void upstream_connect(const std::string& client_ip)
    function upstream_response (line 85) | void upstream_response(const std::string& client_ip, int status_code,

FILE: src/shrpx_accesslog.h
  function namespace (line 32) | namespace shrpx {

FILE: src/shrpx_client_handler.cc
  type shrpx (line 39) | namespace shrpx {
    function upstream_readcb (line 42) | void upstream_readcb(bufferevent *bev, void *arg)
    function upstream_writecb (line 53) | void upstream_writecb(bufferevent *bev, void *arg)
    function upstream_eventcb (line 78) | void upstream_eventcb(bufferevent *bev, short events, void *arg)
    function Upstream (line 207) | Upstream* ClientHandler::get_upstream()
    function bufferevent (line 212) | bufferevent* ClientHandler::get_bev() const
    function event_base (line 217) | event_base* ClientHandler::get_evbase() const
    function DownstreamConnection (line 306) | DownstreamConnection* ClientHandler::get_downstream_connection()
    function SSL (line 334) | SSL* ClientHandler::get_ssl() const
    function SpdySession (line 344) | SpdySession* ClientHandler::get_spdy_session() const
    function shutdown_cb (line 362) | void shutdown_cb(evutil_socket_t fd, short what, void *arg)

FILE: src/shrpx_client_handler.h
  function namespace (line 37) | namespace shrpx {

FILE: src/shrpx_config.cc
  type shrpx (line 48) | namespace shrpx {
    function Config (line 119) | const Config* get_config()
    function Config (line 124) | Config* mod_config()
    function create_config (line 129) | void create_config()
    function split_host_port (line 135) | int split_host_port(char *host, size_t hostlen, uint16_t *port_ptr,
    function is_secure (line 165) | bool is_secure(const char *filename)
    function read_passwd_from_file (line 181) | std::string read_passwd_from_file(const char *filename)
    function set_config_str (line 201) | void set_config_str(char **destp, const char *val)
    function parse_spdy_proto (line 212) | int parse_spdy_proto(const char *optarg)
    function parse_config (line 248) | int parse_config(const char *opt, const char *optarg)
    function load_config (line 495) | int load_config(const char *filename)
    function int_syslog_facility (line 575) | int int_syslog_facility(const char *strfacility)

FILE: src/shrpx_config.h
  function namespace (line 40) | namespace shrpx {

FILE: src/shrpx_downstream.cc
  type shrpx (line 38) | namespace shrpx {
    function DownstreamConnection (line 86) | DownstreamConnection* Downstream::get_downstream_connection()
    function check_header_field (line 115) | void check_header_field(bool *result, const Headers::value_type &item,
    function check_transfer_encoding_chunked (line 127) | void check_transfer_encoding_chunked(bool *chunked,
    function check_expect_100_continue (line 135) | void check_expect_100_continue(bool *res,
    function Headers (line 142) | const Headers& Downstream::get_request_headers() const
    function Upstream (line 228) | Upstream* Downstream::get_upstream() const
    function Headers (line 308) | const Headers& Downstream::get_response_headers() const
    function evbuffer (line 436) | evbuffer* Downstream::get_response_body_buf()

FILE: src/shrpx_downstream.h
  function namespace (line 40) | namespace shrpx {

FILE: src/shrpx_downstream_connection.cc
  type shrpx (line 30) | namespace shrpx {
    function ClientHandler (line 40) | ClientHandler* DownstreamConnection::get_client_handler()
    function Downstream (line 45) | Downstream* DownstreamConnection::get_downstream()

FILE: src/shrpx_downstream_connection.h
  function namespace (line 32) | namespace shrpx {

FILE: src/shrpx_downstream_queue.cc
  type shrpx (line 31) | namespace shrpx {
    function Downstream (line 54) | Downstream* DownstreamQueue::find(int32_t stream_id)

FILE: src/shrpx_downstream_queue.h
  function namespace (line 34) | namespace shrpx {

FILE: src/shrpx_error.h
  function namespace (line 30) | namespace shrpx {

FILE: src/shrpx_http.cc
  type shrpx (line 33) | namespace shrpx {
    type http (line 35) | namespace http {
      function get_status_string (line 37) | std::string get_status_string(unsigned int status_code)
      function create_error_html (line 85) | std::string create_error_html(unsigned int status_code)
      function create_via_header_value (line 103) | std::string create_via_header_value(int major, int minor)
      function capitalize (line 113) | void capitalize(std::string& s, size_t offset)
      function check_header_value (line 125) | bool check_header_value(const char *value)
      function sanitize_header_value (line 130) | void sanitize_header_value(std::string& s, size_t offset)
      function colorizeHeaders (line 139) | std::string colorizeHeaders(const char *hdrs)
      function copy_url_component (line 170) | void copy_url_component(std::string& dest, http_parser_url *u, int f...
      function determine_window_update_transmission (line 178) | int32_t determine_window_update_transmission(spdylay_session *session,

FILE: src/shrpx_http.h
  function namespace (line 34) | namespace shrpx {

FILE: src/shrpx_http_downstream_connection.cc
  type shrpx (line 37) | namespace shrpx {
    function idle_eventcb (line 281) | void idle_eventcb(bufferevent *bev, short events, void *arg)
    function bufferevent (line 330) | bufferevent* HttpDownstreamConnection::get_bev()
    function htp_hdrs_completecb (line 358) | int htp_hdrs_completecb(http_parser *htp)
    function htp_hdr_keycb (line 387) | int htp_hdr_keycb(http_parser *htp, const char *data, size_t len)
    function htp_hdr_valcb (line 401) | int htp_hdr_valcb(http_parser *htp, const char *data, size_t len)
    function htp_bodycb (line 415) | int htp_bodycb(http_parser *htp, const char *data, size_t len)
    function htp_msg_completecb (line 426) | int htp_msg_completecb(http_parser *htp)

FILE: src/shrpx_http_downstream_connection.h
  function namespace (line 38) | namespace shrpx {

FILE: src/shrpx_https_upstream.cc
  type shrpx (line 43) | namespace shrpx {
    function htp_msg_begin (line 73) | int htp_msg_begin(http_parser *htp)
    function htp_uricb (line 88) | int htp_uricb(http_parser *htp, const char *data, size_t len)
    function htp_hdr_keycb (line 99) | int htp_hdr_keycb(http_parser *htp, const char *data, size_t len)
    function htp_hdr_valcb (line 114) | int htp_hdr_valcb(http_parser *htp, const char *data, size_t len)
    function htp_hdrs_completecb (line 129) | int htp_hdrs_completecb(http_parser *htp)
    function htp_bodycb (line 205) | int htp_bodycb(http_parser *htp, const char *data, size_t len)
    function htp_msg_completecb (line 221) | int htp_msg_completecb(http_parser *htp)
    function ClientHandler (line 346) | ClientHandler* HttpsUpstream::get_client_handler() const
    function https_downstream_readcb (line 369) | void https_downstream_readcb(bufferevent *bev, void *ptr)
    function https_downstream_writecb (line 455) | void https_downstream_writecb(bufferevent *bev, void *ptr)
    function https_downstream_eventcb (line 470) | void https_downstream_eventcb(bufferevent *bev, short events, void *ptr)
    function bufferevent_data_cb (line 583) | bufferevent_data_cb HttpsUpstream::get_downstream_readcb()
    function bufferevent_data_cb (line 588) | bufferevent_data_cb HttpsUpstream::get_downstream_writecb()
    function bufferevent_event_cb (line 593) | bufferevent_event_cb HttpsUpstream::get_downstream_eventcb()
    function Downstream (line 610) | Downstream* HttpsUpstream::get_downstream() const

FILE: src/shrpx_https_upstream.h
  function namespace (line 36) | namespace shrpx {

FILE: src/shrpx_io_control.cc
  type shrpx (line 29) | namespace shrpx {

FILE: src/shrpx_io_control.h
  function namespace (line 35) | namespace shrpx {

FILE: src/shrpx_listen_handler.cc
  type shrpx (line 42) | namespace shrpx {
    function event_base (line 126) | event_base* ListenHandler::get_evbase() const

FILE: src/shrpx_listen_handler.h
  function namespace (line 38) | namespace shrpx {

FILE: src/shrpx_log.cc
  type shrpx (line 34) | namespace shrpx {
    function severity_to_syslog_level (line 69) | int severity_to_syslog_level(int severity)

FILE: src/shrpx_log.h
  function namespace (line 32) | namespace shrpx {

FILE: src/shrpx_spdy_downstream_connection.cc
  type shrpx (line 46) | namespace shrpx {
    function spdy_data_read_callback (line 153) | ssize_t spdy_data_read_callback(spdylay_session *session,
    function evbuffer (line 468) | evbuffer* SpdyDownstreamConnection::get_request_body_buf() const
    function StreamData (line 485) | StreamData* SpdyDownstreamConnection::detach_stream_data()

FILE: src/shrpx_spdy_downstream_connection.h
  function namespace (line 36) | namespace shrpx {

FILE: src/shrpx_spdy_session.cc
  type shrpx (line 47) | namespace shrpx {
    function notify_readcb (line 144) | void notify_readcb(bufferevent *bev, void *arg)
    function notify_eventcb (line 168) | void notify_eventcb(bufferevent *bev, short events, void *arg)
    function readcb (line 217) | void readcb(bufferevent *bev, void *ptr)
    function writecb (line 229) | void writecb(bufferevent *bev, void *ptr)
    function eventcb (line 244) | void eventcb(bufferevent *bev, short events, void *ptr)
    function proxy_readcb (line 284) | void proxy_readcb(bufferevent *bev, void *ptr)
    function proxy_eventcb (line 309) | void proxy_eventcb(bufferevent *bev, short events, void *ptr)
    function htp_hdrs_completecb (line 479) | int htp_hdrs_completecb(http_parser *htp)
    function call_downstream_readcb (line 623) | void call_downstream_readcb(SpdySession *spdy, Downstream *downstream)
    function send_callback (line 635) | ssize_t send_callback(spdylay_session *session,
    function recv_callback (line 660) | ssize_t recv_callback(spdylay_session *session,
    function on_stream_close_callback (line 679) | void on_stream_close_callback
    function on_ctrl_recv_callback (line 721) | void on_ctrl_recv_callback
    function on_data_chunk_recv_callback (line 880) | void on_data_chunk_recv_callback(spdylay_session *session,
    function before_ctrl_send_callback (line 946) | void before_ctrl_send_callback(spdylay_session *session,
    function on_ctrl_not_send_callback (line 973) | void on_ctrl_not_send_callback(spdylay_session *session,
    function on_ctrl_recv_parse_error_callback (line 1008) | void on_ctrl_recv_parse_error_callback(spdylay_session *session,
    function on_unknown_ctrl_recv_callback (line 1026) | void on_unknown_ctrl_recv_callback(spdylay_session *session,
    function bufferevent (line 1194) | bufferevent* SpdySession::get_bev() const
    function spdylay_session (line 1209) | spdylay_session* SpdySession::get_session() const

FILE: src/shrpx_spdy_session.h
  function namespace (line 41) | namespace shrpx {

FILE: src/shrpx_spdy_upstream.cc
  type shrpx (line 42) | namespace shrpx {
    function send_callback (line 49) | ssize_t send_callback(spdylay_session *session,
    function recv_callback (line 74) | ssize_t recv_callback(spdylay_session *session,
    function on_stream_close_callback (line 93) | void on_stream_close_callback
    function on_ctrl_recv_callback (line 139) | void on_ctrl_recv_callback
    function on_data_chunk_recv_callback (line 248) | void on_data_chunk_recv_callback(spdylay_session *session,
    function on_data_recv_callback (line 297) | void on_data_recv_callback(spdylay_session *session, uint8_t flags,
    function on_ctrl_not_send_callback (line 310) | void on_ctrl_not_send_callback(spdylay_session *session,
    function on_ctrl_recv_parse_error_callback (line 331) | void on_ctrl_recv_parse_error_callback(spdylay_session *session,
    function on_unknown_ctrl_recv_callback (line 349) | void on_unknown_ctrl_recv_callback(spdylay_session *session,
    function infer_upstream_rst_stream_status_code (line 362) | uint32_t infer_upstream_rst_stream_status_code(uint32_t downstream_sta...
    function ClientHandler (line 499) | ClientHandler* SpdyUpstream::get_client_handler() const
    function spdy_downstream_readcb (line 505) | void spdy_downstream_readcb(bufferevent *bev, void *ptr)
    function spdy_downstream_writecb (line 562) | void spdy_downstream_writecb(bufferevent *bev, void *ptr)
    function spdy_downstream_eventcb (line 576) | void spdy_downstream_eventcb(bufferevent *bev, short events, void *ptr)
    function spdy_data_read_callback (line 726) | ssize_t spdy_data_read_callback(spdylay_session *session,
    function bufferevent_data_cb (line 812) | bufferevent_data_cb SpdyUpstream::get_downstream_readcb()
    function bufferevent_data_cb (line 817) | bufferevent_data_cb SpdyUpstream::get_downstream_writecb()
    function bufferevent_event_cb (line 822) | bufferevent_event_cb SpdyUpstream::get_downstream_eventcb()
    function Downstream (line 837) | Downstream* SpdyUpstream::find_downstream(int32_t stream_id)
    function spdylay_session (line 842) | spdylay_session* SpdyUpstream::get_spdy_session()

FILE: src/shrpx_spdy_upstream.h
  function namespace (line 35) | namespace shrpx {

FILE: src/shrpx_ssl.cc
  type shrpx (line 52) | namespace shrpx {
    type ssl (line 54) | namespace ssl {
      function next_proto_cb (line 79) | int next_proto_cb(SSL *s, const unsigned char **data, unsigned int *...
      function verify_callback (line 91) | int verify_callback(int preverify_ok, X509_STORE_CTX *ctx)
      function set_npn_prefs (line 105) | size_t set_npn_prefs(unsigned char *out, const char **protos, size_t...
      function ssl_pem_passwd_cb (line 118) | int ssl_pem_passwd_cb(char *buf, int size, int rwflag, void *user_data)
      function servername_callback (line 133) | int servername_callback(SSL *ssl, int *al, void *arg)
      function info_callback (line 150) | void info_callback(const SSL *ssl, int where, int ret)
      function create_tls_proto_mask (line 173) | long int create_tls_proto_mask(char **tls_proto_list, size_t len)
      function SSL_CTX (line 191) | SSL_CTX* create_ssl_context(const char *private_key_file,
      function select_next_proto_cb (line 319) | int select_next_proto_cb(SSL* ssl,
      function SSL_CTX (line 332) | SSL_CTX* create_ssl_client_context()
      function ClientHandler (line 397) | ClientHandler* accept_connection
      function numeric_host (line 447) | bool numeric_host(const char *hostname)
      function tls_hostname_match (line 462) | bool tls_hostname_match(const char *pattern, const char *hostname)
      function verify_hostname (line 496) | int verify_hostname(const char *hostname,
      function get_altnames (line 538) | void get_altnames(X509 *cert,
      function check_cert (line 602) | int check_cert(SSL *ssl)
      function ssl_locking_cb (line 636) | void ssl_locking_cb(int mode, int type, const char *file, int line)
      function setup_ssl_lock (line 647) | void setup_ssl_lock()
      function teardown_ssl_lock (line 663) | void teardown_ssl_lock()
      function CertLookupTree (line 673) | CertLookupTree* cert_lookup_tree_new()
      function cert_node_del (line 685) | void cert_node_del(CertNode *node)
      function cert_lookup_tree_del (line 695) | void cert_lookup_tree_del(CertLookupTree *lt)
      function cert_lookup_tree_add_cert (line 708) | void cert_lookup_tree_add_cert(CertLookupTree *lt, CertNode *node,
      function cert_lookup_tree_add_cert (line 787) | void cert_lookup_tree_add_cert(CertLookupTree *lt, SSL_CTX *ssl_ctx,
      function SSL_CTX (line 804) | SSL_CTX* cert_lookup_tree_lookup(CertLookupTree *lt, CertNode *node,
      function SSL_CTX (line 843) | SSL_CTX* cert_lookup_tree_lookup(CertLookupTree *lt,
      function cert_lookup_tree_add_cert_from_file (line 850) | int cert_lookup_tree_add_cert_from_file(CertLookupTree *lt, SSL_CTX ...

FILE: src/shrpx_ssl.h
  function namespace (line 37) | namespace shrpx {

FILE: src/shrpx_ssl_test.cc
  type shrpx (line 31) | namespace shrpx {
    function test_shrpx_ssl_create_lookup_tree (line 33) | void test_shrpx_ssl_create_lookup_tree(void)
    function test_shrpx_ssl_cert_lookup_tree_add_cert_from_file (line 118) | void test_shrpx_ssl_cert_lookup_tree_add_cert_from_file(void)

FILE: src/shrpx_ssl_test.h
  function namespace (line 28) | namespace shrpx {

FILE: src/shrpx_thread_event_receiver.cc
  type shrpx (line 34) | namespace shrpx {

FILE: src/shrpx_thread_event_receiver.h
  function namespace (line 36) | namespace shrpx {

FILE: src/shrpx_upstream.h
  function namespace (line 34) | namespace shrpx {

FILE: src/shrpx_worker.cc
  type shrpx (line 38) | namespace shrpx {
    function readcb (line 53) | void readcb(bufferevent *bev, void *arg)
    function eventcb (line 61) | void eventcb(bufferevent *bev, short events, void *arg)

FILE: src/shrpx_worker.h
  function namespace (line 35) | namespace shrpx {

FILE: src/spdycat.cc
  type spdylay (line 68) | namespace spdylay {
    type Config (line 70) | struct Config {
      method Config (line 88) | Config()
    type RequestStat (line 103) | struct RequestStat {
      method RequestStat (line 107) | RequestStat()
    function record_time (line 118) | void record_time(timeval *tv)
    function has_uri_field (line 123) | bool has_uri_field(const http_parser_url &u, http_parser_url_fields fi...
    function fieldeq (line 128) | bool fieldeq(const char *uri1, const http_parser_url &u1,
    function fieldeq (line 149) | bool fieldeq(const char *uri, const http_parser_url &u,
    function get_default_port (line 168) | uint16_t get_default_port(const char *uri, const http_parser_url &u)
    function get_uri_field (line 179) | std::string get_uri_field(const char *uri, const http_parser_url &u,
    function porteq (line 190) | bool porteq(const char *uri1, const http_parser_url &u1,
    function write_uri_field (line 199) | void write_uri_field(std::ostream& o,
    function strip_fragment (line 208) | std::string strip_fragment(const char *raw_uri)
    type Request (line 216) | struct Request {
      method Request (line 229) | Request(const std::string& uri, const http_parser_url &u,
      method init_inflater (line 244) | void init_inflater()
      method init_html_parser (line 251) | void init_html_parser()
      method update_html_parser (line 256) | int update_html_parser(const uint8_t *data, size_t len, int fin)
      method make_reqpath (line 267) | std::string make_reqpath() const
      method is_ipv6_literal_addr (line 279) | bool is_ipv6_literal_addr() const
      method record_syn_stream_time (line 289) | void record_syn_stream_time()
      method record_syn_reply_time (line 294) | void record_syn_reply_time()
      method record_complete_time (line 299) | void record_complete_time()
    type SessionStat (line 305) | struct SessionStat {
      method SessionStat (line 307) | SessionStat()
    type SpdySession (line 316) | struct SpdySession {
      method SpdySession (line 328) | SpdySession():complete(0), sc(0) {}
      method all_requests_processed (line 335) | bool all_requests_processed() const
      method update_hostport (line 339) | void update_hostport()
      method add_request (line 359) | bool add_request(const std::string& uri, const http_parser_url& u,
      method record_handshake_time (line 374) | void record_handshake_time()
    function submit_request (line 382) | void submit_request
    function update_html_parser (line 395) | void update_html_parser(SpdySession *spdySession, Request *req,
    function SpdySession (line 421) | SpdySession* get_session(void *user_data)
      method SpdySession (line 328) | SpdySession():complete(0), sc(0) {}
      method all_requests_processed (line 335) | bool all_requests_processed() const
      method update_hostport (line 339) | void update_hostport()
      method add_request (line 359) | bool add_request(const std::string& uri, const http_parser_url& u,
      method record_handshake_time (line 374) | void record_handshake_time()
    function on_data_chunk_recv_callback (line 427) | void on_data_chunk_recv_callback
    function check_stream_id (line 463) | void check_stream_id(spdylay_session *session,
    function before_ctrl_send_callback (line 476) | void before_ctrl_send_callback
    function on_ctrl_send_callback2 (line 485) | void on_ctrl_send_callback2
    function check_response_header (line 494) | void check_response_header
    function on_ctrl_recv_callback2 (line 535) | void on_ctrl_recv_callback2
    function on_stream_close_callback (line 551) | void on_stream_close_callback
    function print_stats (line 568) | void print_stats(const SpdySession& spdySession)
    function spdy_evloop (line 601) | int spdy_evloop(int fd, SSL *ssl, int spdy_version, SpdySession& spdyS...
    function communicate (line 680) | int communicate(const std::string& host, uint16_t port,
    function file_read_callback (line 813) | ssize_t file_read_callback
    function run (line 837) | int run(char **uris, int n)
    function print_usage (line 988) | void print_usage(std::ostream& out)
    function print_help (line 996) | void print_help(std::ostream& out)
    function main (line 1049) | int main(int argc, char **argv)
  function main (line 1218) | int main(int argc, char **argv)

FILE: src/spdyd.cc
  type spdylay (line 43) | namespace spdylay {
    function print_usage (line 48) | void print_usage(std::ostream& out)
    function print_help (line 56) | void print_help(std::ostream& out)
    function main (line 88) | int main(int argc, char **argv)
  function main (line 213) | int main(int argc, char **argv)

FILE: src/spdylay_ssl.cc
  type spdylay (line 53) | namespace spdylay {
    function connect_to (line 246) | int connect_to(const std::string& host, uint16_t port)
    function nonblock_connect_to (line 279) | int nonblock_connect_to(const std::string& host, uint16_t port, int ti...
    function make_listen_socket (line 350) | int make_listen_socket(const std::string& host, uint16_t port, int fam...
    function make_non_block (line 415) | int make_non_block(int fd)
    function set_tcp_nodelay (line 429) | int set_tcp_nodelay(int fd)
    function send_callback (line 435) | ssize_t send_callback(spdylay_session *session,
    function recv_callback (line 454) | ssize_t recv_callback(spdylay_session *session,
    function print_frame_attr_indent (line 486) | void print_frame_attr_indent()
    function set_color_output (line 496) | void set_color_output(bool f)
    function print_nv (line 515) | void print_nv(char **nv)
    function print_timer (line 526) | void print_timer()
    function print_ctrl_hd (line 538) | void print_ctrl_hd(const spdylay_ctrl_hd& hd)
    type print_type (line 545) | enum print_type {
    function print_frame (line 558) | void print_frame(print_type ptype, spdylay_frame_type type,
    function on_ctrl_recv_callback (line 620) | void on_ctrl_recv_callback
    function on_invalid_ctrl_recv_callback (line 664) | void on_invalid_ctrl_recv_callback
    function dump_header (line 675) | void dump_header(const uint8_t *head, size_t headlen)
    function on_ctrl_recv_parse_error_callback (line 687) | void on_ctrl_recv_parse_error_callback(spdylay_session *session,
    function on_unknown_ctrl_recv_callback (line 706) | void on_unknown_ctrl_recv_callback(spdylay_session *session,
    function on_ctrl_send_callback (line 719) | void on_ctrl_send_callback
    function print_data_frame (line 730) | void print_data_frame(print_type ptype, uint8_t flags, int32_t stream_id,
    function on_data_recv_callback (line 739) | void on_data_recv_callback
    function on_data_send_callback (line 749) | void on_data_send_callback
    function ctl_poll (line 759) | void ctl_poll(pollfd *pollfd, Spdylay *sc)
    function select_next_proto_cb (line 770) | int select_next_proto_cb(SSL* ssl,
    function setup_ssl_ctx (line 807) | void setup_ssl_ctx(SSL_CTX *ssl_ctx, void *next_proto_select_cb_arg)
    function ssl_handshake (line 818) | int ssl_handshake(SSL *ssl, int fd)
    function ssl_nonblock_handshake (line 833) | int ssl_nonblock_handshake(SSL *ssl, int fd, int& timeout)
    function time_delta (line 885) | int64_t time_delta(const timeval& a, const timeval& b)
    function get_ssl_io_demand (line 892) | uint8_t get_ssl_io_demand(SSL *ssl, ssize_t r)
    function reset_timer (line 908) | void reset_timer()
    function get_timer (line 913) | void get_timer(timeval* tv)
    function get_time (line 924) | int get_time(timeval *tv)

FILE: src/timegm.c
  function count_leap_year (line 33) | static int count_leap_year(int y)
  function is_leap_year (line 41) | static int is_leap_year(int y)
  function time_t (line 52) | time_t timegm(struct tm *tm)

FILE: src/timegm.h
  type tm (line 40) | struct tm

FILE: src/util.cc
  type spdylay (line 34) | namespace spdylay {
    type util (line 36) | namespace util {
      function isAlpha (line 40) | bool isAlpha(const char c)
      function isDigit (line 45) | bool isDigit(const char c)
      function isHexDigit (line 50) | bool isHexDigit(const char c)
      function inRFC3986UnreservedChars (line 55) | bool inRFC3986UnreservedChars(const char c)
      function percentEncode (line 62) | std::string percentEncode(const unsigned char* target, size_t len)
      function percentEncode (line 78) | std::string percentEncode(const std::string& target)
      function percentDecode (line 84) | std::string percentDecode
      function http_date (line 105) | std::string http_date(time_t t)
      function time_t (line 113) | time_t parse_http_date(const std::string& s)
      function startsWith (line 124) | bool startsWith(const std::string& a, const std::string& b)
      function istartsWith (line 129) | bool istartsWith(const std::string& a, const std::string& b)
      function streq_advance (line 135) | void streq_advance(const char **ap, const char **bp)
      function istartsWith (line 141) | bool istartsWith(const char *a, const char* b)
      function endsWith (line 150) | bool endsWith(const std::string& a, const std::string& b)
      function strieq (line 154) | bool strieq(const char *a, const char *b)
      function strifind (line 163) | bool strifind(const char *a, const char *b)
      function upcase (line 178) | char upcase(char c)

FILE: src/util.h
  function namespace (line 36) | namespace spdylay {
  function string (line 158) | string strjoin(InputIterator first, InputIterator last,
  function string (line 175) | string joinPath(InputIterator first, InputIterator last)
  function string (line 212) | string to_str(T value)
  function if (line 234) | struct CaseCmp {
  function lowcase (line 301) | inline char lowcase(char c)
  function string (line 341) | string utos(T n)

FILE: tests/end_to_end.py
  function _run_server (line 23) | def _run_server(port, args):
  function _check_server_up (line 34) | def _check_server_up(port):
  function _kill_server (line 38) | def _kill_server(server):
  class EndToEndSpdyTests (line 45) | class EndToEndSpdyTests(unittest.TestCase):
    method setUpClass (line 47) | def setUpClass(cls):
    method setUpServer (line 51) | def setUpServer(cls, args):
    method tearDownClass (line 56) | def tearDownClass(cls):
    method setUp (line 59) | def setUp(self):
    method call (line 64) | def call(self, path, args):
  class EndToEndSpdy2Tests (line 72) | class EndToEndSpdy2Tests(EndToEndSpdyTests):
    method testSimpleRequest (line 73) | def testSimpleRequest(self):
    method testSimpleRequestSpdy3 (line 76) | def testSimpleRequestSpdy3(self):
    method testFailedRequests (line 80) | def testFailedRequests(self):
    method testOneFailedRequest (line 84) | def testOneFailedRequest(self):
    method testOneTimedOutRequest (line 87) | def testOneTimedOutRequest(self):
  class EndToEndSpdy3Tests (line 93) | class EndToEndSpdy3Tests(EndToEndSpdyTests):
    method setUpClass (line 95) | def setUpClass(cls):
    method testSimpleRequest (line 98) | def testSimpleRequest(self):

FILE: tests/failmalloc.c
  function init_suite1 (line 32) | static int init_suite1(void)
  function clean_suite1 (line 37) | static int clean_suite1(void)
  function main (line 42) | int main(int argc _U_, char* argv[] _U_)

FILE: tests/failmalloc_test.c
  type data_feed (line 39) | typedef struct {
  type my_user_data (line 44) | typedef struct {
  function data_feed_init (line 49) | static void data_feed_init(data_feed *df, uint8_t *data, size_t data_len...
  function null_send_callback (line 57) | static ssize_t null_send_callback(spdylay_session *session _U_,
  function data_feed_recv_callback (line 64) | static ssize_t data_feed_recv_callback(spdylay_session *session _U_,
  function fixed_length_data_source_read_callback (line 76) | static ssize_t fixed_length_data_source_read_callback
  function run_spdylay_session_send (line 113) | static void run_spdylay_session_send(void)
  function test_spdylay_session_send (line 213) | void test_spdylay_session_send(void)
  function run_spdylay_session_recv (line 218) | static void run_spdylay_session_recv(void)
  function test_spdylay_session_recv (line 314) | void test_spdylay_session_recv(void)
  function run_spdylay_frame_pack_syn_stream (line 319) | static void run_spdylay_frame_pack_syn_stream(void)
  function run_spdylay_frame_pack_ping (line 370) | static void run_spdylay_frame_pack_ping(void)
  function run_spdylay_frame_pack_goaway (line 381) | static void run_spdylay_frame_pack_goaway(void)
  function run_spdylay_frame_pack_rst_stream (line 393) | static void run_spdylay_frame_pack_rst_stream(void)
  function run_spdylay_frame_pack_window_update (line 405) | static void run_spdylay_frame_pack_window_update(void)
  function run_spdylay_frame_pack_settings (line 418) | static void run_spdylay_frame_pack_settings(void)
  function run_spdylay_frame (line 460) | static void run_spdylay_frame(void)
  function test_spdylay_frame (line 470) | void test_spdylay_frame(void)

FILE: tests/main.c
  function init_suite1 (line 41) | static int init_suite1(void)
  function clean_suite1 (line 46) | static int clean_suite1(void)
  function main (line 52) | int main(int argc _U_, char* argv[] _U_)

FILE: tests/malloc_wrapper.c
  function init (line 37) | static void init(void)
  function spdylay_failmalloc_pause (line 59) | void spdylay_failmalloc_pause(void)
  function spdylay_failmalloc_unpause (line 67) | void spdylay_failmalloc_unpause(void)

FILE: tests/spdylay_buffer_test.c
  function test_spdylay_buffer (line 34) | void test_spdylay_buffer(void)
  function test_spdylay_buffer_reader (line 84) | void test_spdylay_buffer_reader(void)

FILE: tests/spdylay_frame_test.c
  function get_packed_hd_len (line 38) | static int get_packed_hd_len(uint8_t *data, size_t len_size)
  function test_spdylay_frame_unpack_nv_with (line 62) | static void test_spdylay_frame_unpack_nv_with(size_t len_size)
  function test_spdylay_frame_unpack_nv_spdy2 (line 103) | void test_spdylay_frame_unpack_nv_spdy2(void)
  function test_spdylay_frame_unpack_nv_spdy3 (line 109) | void test_spdylay_frame_unpack_nv_spdy3(void)
  function test_spdylay_frame_pack_nv_duplicate_keys (line 115) | void test_spdylay_frame_pack_nv_duplicate_keys(void)
  function test_spdylay_frame_count_nv_space (line 220) | void test_spdylay_frame_count_nv_space(void)
  function frame_pack_nv_empty_value_check (line 237) | static void frame_pack_nv_empty_value_check(uint8_t *outptr,
  function test_spdylay_frame_pack_nv_empty_value_with (line 259) | static void test_spdylay_frame_pack_nv_empty_value_with(size_t len_size)
  function test_spdylay_frame_pack_nv_empty_value_spdy2 (line 285) | void test_spdylay_frame_pack_nv_empty_value_spdy2(void)
  function test_spdylay_frame_pack_nv_empty_value_spdy3 (line 291) | void test_spdylay_frame_pack_nv_empty_value_spdy3(void)
  function test_spdylay_frame_count_unpack_nv_space (line 297) | void test_spdylay_frame_count_unpack_nv_space(void)
  function test_spdylay_frame_pack_ping (line 346) | void test_spdylay_frame_pack_ping(void)
  function test_spdylay_frame_pack_goaway_version (line 365) | static void test_spdylay_frame_pack_goaway_version(uint16_t version)
  function test_spdylay_frame_pack_goaway_spdy2 (line 395) | void test_spdylay_frame_pack_goaway_spdy2(void)
  function test_spdylay_frame_pack_goaway_spdy3 (line 400) | void test_spdylay_frame_pack_goaway_spdy3(void)
  function test_spdylay_frame_pack_syn_stream_version (line 405) | static void test_spdylay_frame_pack_syn_stream_version(uint16_t version)
  function test_spdylay_frame_pack_syn_stream_spdy2 (line 450) | void test_spdylay_frame_pack_syn_stream_spdy2(void)
  function test_spdylay_frame_pack_syn_stream_spdy3 (line 455) | void test_spdylay_frame_pack_syn_stream_spdy3(void)
  function test_spdylay_frame_pack_syn_stream_frame_too_large (line 460) | void test_spdylay_frame_pack_syn_stream_frame_too_large(void)
  function test_spdylay_frame_pack_syn_reply_version (line 489) | static void test_spdylay_frame_pack_syn_reply_version(uint16_t version)
  function test_spdylay_frame_pack_syn_reply_spdy2 (line 525) | void test_spdylay_frame_pack_syn_reply_spdy2(void)
  function test_spdylay_frame_pack_syn_reply_spdy3 (line 530) | void test_spdylay_frame_pack_syn_reply_spdy3(void)
  function test_spdylay_frame_pack_headers_version (line 535) | static void test_spdylay_frame_pack_headers_version(uint16_t version)
  function test_spdylay_frame_pack_headers_spdy2 (line 574) | void test_spdylay_frame_pack_headers_spdy2(void)
  function test_spdylay_frame_pack_headers_spdy3 (line 579) | void test_spdylay_frame_pack_headers_spdy3(void)
  function test_spdylay_frame_pack_window_update (line 584) | void test_spdylay_frame_pack_window_update(void)
  function test_spdylay_frame_pack_settings_version (line 612) | static void test_spdylay_frame_pack_settings_version(uint16_t version)
  function test_spdylay_frame_pack_settings_spdy2 (line 659) | void test_spdylay_frame_pack_settings_spdy2(void)
  function test_spdylay_frame_pack_settings_spdy3 (line 664) | void test_spdylay_frame_pack_settings_spdy3(void)
  function test_spdylay_frame_nv_sort (line 669) | void test_spdylay_frame_nv_sort(void)
  function test_spdylay_frame_nv_downcase (line 688) | void test_spdylay_frame_nv_downcase(void)
  function test_spdylay_frame_nv_2to3 (line 705) | void test_spdylay_frame_nv_2to3(void)
  function test_spdylay_frame_nv_3to2 (line 730) | void test_spdylay_frame_nv_3to2(void)
  function spdylay_pack_nv (line 757) | static size_t spdylay_pack_nv(uint8_t *buf, size_t buflen _U_, const cha...
  function test_spdylay_frame_unpack_nv_check_name_with (line 790) | static void test_spdylay_frame_unpack_nv_check_name_with(size_t len_size)
  function test_spdylay_frame_unpack_nv_check_name_spdy2 (line 828) | void test_spdylay_frame_unpack_nv_check_name_spdy2(void)
  function test_spdylay_frame_unpack_nv_check_name_spdy3 (line 834) | void test_spdylay_frame_unpack_nv_check_name_spdy3(void)
  function test_spdylay_frame_unpack_nv_last_empty_value_with (line 840) | static void test_spdylay_frame_unpack_nv_last_empty_value_with(size_t le...
  function test_spdylay_frame_unpack_nv_last_empty_value_spdy2 (line 873) | void test_spdylay_frame_unpack_nv_last_empty_value_spdy2(void)
  function test_spdylay_frame_unpack_nv_last_empty_value_spdy3 (line 879) | void test_spdylay_frame_unpack_nv_last_empty_value_spdy3(void)
  function test_spdylay_frame_nv_check_null (line 885) | void test_spdylay_frame_nv_check_null(void)

FILE: tests/spdylay_gzip_test.c
  function deflate_data (line 36) | static ssize_t deflate_data(uint8_t *out, size_t outlen,
  function test_spdylay_gzip_inflate (line 70) | void test_spdylay_gzip_inflate(void)

FILE: tests/spdylay_map_test.c
  type strentry (line 31) | typedef struct strentry {
  function strentry_init (line 36) | static void strentry_init(strentry *entry, key_type key, const char *str)
  function test_spdylay_map (line 42) | void test_spdylay_map(void)
  function shuffle (line 95) | static void shuffle(int *a, int n)
  function eachfun (line 106) | static int eachfun(spdylay_map_entry *entry _U_, void *ptr _U_)
  function test_spdylay_map_functional (line 115) | void test_spdylay_map_functional(void)
  function entry_free (line 155) | static int entry_free(spdylay_map_entry *entry, void *ptr _U_)
  function test_spdylay_map_each_free (line 161) | void test_spdylay_map_each_free(void)

FILE: tests/spdylay_npn_test.c
  function spdy2 (line 31) | static void spdy2(void)
  function http11 (line 46) | static void http11(void)
  function no_overlap (line 61) | static void no_overlap(void)
  function test_spdylay_npn (line 76) | void test_spdylay_npn(void)
  function test_spdylay_npn_get_proto_list (line 83) | void test_spdylay_npn_get_proto_list(void)
  function test_spdylay_npn_get_version (line 102) | void test_spdylay_npn_get_version(void)

FILE: tests/spdylay_pq_test.c
  function pq_compar (line 31) | static int pq_compar(const void *lhs, const void *rhs)
  function test_spdylay_pq (line 36) | void test_spdylay_pq(void)

FILE: tests/spdylay_queue_test.c
  function test_spdylay_queue (line 31) | void test_spdylay_queue(void)

FILE: tests/spdylay_session_test.c
  type accumulator (line 42) | typedef struct {
  type scripted_data_feed (line 47) | typedef struct {
  type my_user_data (line 55) | typedef struct {
  function scripted_data_feed_init (line 73) | static void scripted_data_feed_init(scripted_data_feed *df,
  function null_send_callback (line 83) | static ssize_t null_send_callback(spdylay_session *session _U_,
  function fail_send_callback (line 90) | static ssize_t fail_send_callback(spdylay_session *session _U_,
  function fixed_bytes_send_callback (line 97) | static ssize_t fixed_bytes_send_callback(spdylay_session *session _U_,
  function scripted_recv_callback (line 105) | static ssize_t scripted_recv_callback(spdylay_session *session _U_,
  function eof_recv_callback (line 120) | static ssize_t eof_recv_callback(spdylay_session *session _U_,
  function accumulator_send_callback (line 127) | static ssize_t accumulator_send_callback(spdylay_session *session _U_,
  function on_ctrl_recv_callback (line 138) | static void on_ctrl_recv_callback(spdylay_session *session _U_,
  function on_invalid_ctrl_recv_callback (line 147) | static void on_invalid_ctrl_recv_callback(spdylay_session *session _U_,
  function on_ctrl_send_callback (line 157) | static void on_ctrl_send_callback(spdylay_session *session _U_,
  function on_ctrl_not_send_callback (line 167) | static void on_ctrl_not_send_callback(spdylay_session *session _U_,
  function on_data_chunk_recv_callback (line 179) | static void on_data_chunk_recv_callback(spdylay_session *session _U_,
  function on_data_recv_callback (line 188) | static void on_data_recv_callback(spdylay_session *session _U_,
  function fixed_length_data_source_read_callback (line 196) | static ssize_t fixed_length_data_source_read_callback
  function temporal_failure_data_source_read_callback (line 215) | static ssize_t temporal_failure_data_source_read_callback
  function fail_data_source_read_callback (line 223) | static ssize_t fail_data_source_read_callback
  function on_request_recv_callback (line 231) | static void on_request_recv_callback(spdylay_session *session _U_,
  function no_stream_user_data_stream_close_callback (line 239) | static void no_stream_user_data_stream_close_callback
  function spdylay_settings_entry (line 254) | static spdylay_settings_entry* dup_iv(const spdylay_settings_entry *iv,
  function test_spdylay_session_recv (line 268) | void test_spdylay_session_recv(void)
  function test_spdylay_session_add_frame (line 495) | void test_spdylay_session_add_frame(void)
  function test_spdylay_session_recv_invalid_stream_id (line 548) | void test_spdylay_session_recv_invalid_stream_id(void)
  function test_spdylay_session_on_syn_stream_received (line 596) | void test_spdylay_session_on_syn_stream_received(void)
  function test_spdylay_session_on_syn_stream_received_with_push (line 668) | void test_spdylay_session_on_syn_stream_received_with_push(void)
  function test_spdylay_session_on_syn_reply_received (line 722) | void test_spdylay_session_on_syn_reply_received(void)
  function test_spdylay_session_send_syn_stream (line 788) | void test_spdylay_session_send_syn_stream(void)
  function test_spdylay_session_send_syn_reply (line 813) | void test_spdylay_session_send_syn_reply(void)
  function test_spdylay_submit_response (line 838) | void test_spdylay_submit_response(void)
  function test_spdylay_submit_response_with_null_data_read_callback (line 864) | void test_spdylay_submit_response_with_null_data_read_callback(void)
  function test_spdylay_submit_request_with_data (line 900) | void test_spdylay_submit_request_with_data(void)
  function test_spdylay_submit_request_with_null_data_read_callback (line 925) | void test_spdylay_submit_request_with_null_data_read_callback(void)
  function test_spdylay_submit_syn_stream (line 959) | void test_spdylay_submit_syn_stream(void)
  function test_spdylay_submit_syn_reply (line 993) | void test_spdylay_submit_syn_reply(void)
  function test_spdylay_submit_headers (line 1032) | void test_spdylay_submit_headers(void)
  function test_spdylay_submit_invalid_nv (line 1081) | void test_spdylay_submit_invalid_nv(void)
  function test_spdylay_session_reply_fail (line 1135) | void test_spdylay_session_reply_fail(void)
  function test_spdylay_session_on_headers_received (line 1156) | void test_spdylay_session_on_headers_received(void)
  function test_spdylay_session_on_window_update_received (line 1224) | void test_spdylay_session_on_window_update_received(void)
  function test_spdylay_session_on_ping_received (line 1263) | void test_spdylay_session_on_ping_received(void)
  function test_spdylay_session_on_goaway_received (line 1299) | void test_spdylay_session_on_goaway_received(void)
  function test_spdylay_session_on_data_received (line 1326) | void test_spdylay_session_on_data_received(void)
  function test_spdylay_session_is_my_stream_id (line 1376) | void test_spdylay_session_is_my_stream_id(void)
  function test_spdylay_session_on_rst_received (line 1398) | void test_spdylay_session_on_rst_received(void)
  function test_spdylay_session_send_rst_stream (line 1431) | void test_spdylay_session_send_rst_stream(void)
  function test_spdylay_session_get_next_ob_item (line 1465) | void test_spdylay_session_get_next_ob_item(void)
  function test_spdylay_session_pop_next_ob_item (line 1509) | void test_spdylay_session_pop_next_ob_item(void)
  function test_spdylay_session_on_request_recv_callback (line 1566) | void test_spdylay_session_on_request_recv_callback(void)
  function stream_close_callback (line 1623) | static void stream_close_callback(spdylay_session *session, int32_t stre...
  function test_spdylay_session_on_stream_close (line 1633) | void test_spdylay_session_on_stream_close(void)
  function test_spdylay_session_max_concurrent_streams (line 1657) | void test_spdylay_session_max_concurrent_streams(void)
  function block_count_send_callback (line 1684) | static ssize_t block_count_send_callback(spdylay_session* session _U_,
  function test_spdylay_session_data_backoff_by_high_pri_frame (line 1700) | void test_spdylay_session_data_backoff_by_high_pri_frame(void)
  function test_spdylay_session_stop_data_with_rst_stream (line 1745) | void test_spdylay_session_stop_data_with_rst_stream(void)
  function test_spdylay_session_stream_close_on_syn_stream (line 1796) | void test_spdylay_session_stream_close_on_syn_stream(void)
  function test_spdylay_session_recv_invalid_frame (line 1823) | void test_spdylay_session_recv_invalid_frame(void)
  function defer_data_source_read_callback (line 1873) | static ssize_t defer_data_source_read_callback
  function test_spdylay_session_defer_data (line 1881) | void test_spdylay_session_defer_data(void)
  function test_spdylay_session_flow_control (line 1948) | void test_spdylay_session_flow_control(void)
  function test_spdylay_session_connection_flow_control (line 2036) | void test_spdylay_session_connection_flow_control(void)
  function test_spdylay_session_on_ctrl_not_send (line 2086) | void test_spdylay_session_on_ctrl_not_send(void)
  function test_spdylay_session_on_settings_received (line 2208) | void test_spdylay_session_on_settings_received(void)
  function test_spdylay_submit_settings (line 2274) | void test_spdylay_submit_settings(void)
  function test_spdylay_session_get_outbound_queue_size (line 2348) | void test_spdylay_session_get_outbound_queue_size(void)
  function test_spdylay_session_set_option (line 2369) | void test_spdylay_session_set_option(void)
  function test_spdylay_submit_window_update (line 2405) | void test_spdylay_submit_window_update(void)
  function test_spdylay_session_data_read_temporal_failure (line 2455) | void test_spdylay_session_data_read_temporal_failure(void)
  function test_spdylay_session_recv_eof (line 2510) | void test_spdylay_session_recv_eof(void)
  function test_spdylay_session_recv_data (line 2527) | void test_spdylay_session_recv_data(void)

FILE: tests/spdylay_stream_test.c
  function test_spdylay_stream_add_pushed_stream (line 31) | void test_spdylay_stream_add_pushed_stream(void)

FILE: tests/spdylay_test_helper.c
  function unpack_frame_with_nv_block (line 33) | ssize_t unpack_frame_with_nv_block(spdylay_frame_type type,

FILE: tests/spdylay_zlib_test.c
  function test_spdylay_zlib_with (line 33) | static void test_spdylay_zlib_with(uint16_t version)
  function test_spdylay_zlib_spdy2 (line 74) | void test_spdylay_zlib_spdy2(void)
  function test_spdylay_zlib_spdy3 (line 79) | void test_spdylay_zlib_spdy3(void)
Condensed preview — 202 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,740K chars).
[
  {
    "path": ".gitignore",
    "chars": 331,
    "preview": "*~\n*.o\n*.lo\n*.la\ndepcomp\n*.m4\nMakefile\nMakefile.in\nlibtool\nmissing\nautom4te.cache/\nconfig.guess\nconfig.h\nconfig.h.in\ncon"
  },
  {
    "path": "AUTHORS",
    "chars": 66,
    "preview": "Tatsuhiro Tsujikawa <t-tujikawa at users dot sourceforge dot net>\n"
  },
  {
    "path": "COPYING",
    "chars": 1086,
    "preview": "The MIT License\n\nCopyright (c) 2012, 2014 Tatsuhiro Tsujikawa\n\nPermission is hereby granted, free of charge, to any pers"
  },
  {
    "path": "ChangeLog",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "Makefile.am",
    "chars": 1297,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "NEWS",
    "chars": 2179,
    "preview": "spdylay 1.4.0\n=============\n\nRelease Note\n------------\n\nThis release removes CREDENTIAL frame support.  The API function"
  },
  {
    "path": "README",
    "chars": 15,
    "preview": "See README.rst\n"
  },
  {
    "path": "README.rst",
    "chars": 29749,
    "preview": "Spdylay - SPDY C Library\n========================\n\nThis is an experimental implementation of Google's SPDY protocol in C"
  },
  {
    "path": "android-config",
    "chars": 1579,
    "preview": "#!/bin/sh\n#\n# Spdylay - SPDY Library\n#\n# Copyright (c) 2013 Tatsuhiro Tsujikawa\n#\n# Permission is hereby granted, free o"
  },
  {
    "path": "android-make",
    "chars": 1296,
    "preview": "#!/bin/sh\n#\n# Spdylay - SPDY Library\n#\n# Copyright (c) 2013 Tatsuhiro Tsujikawa\n#\n# Permission is hereby granted, free o"
  },
  {
    "path": "configure.ac",
    "chars": 11685,
    "preview": "dnl Spdylay - SPDY Library\n\ndnl Copyright (c) 2012 Tatsuhiro Tsujikawa\n\ndnl Permission is hereby granted, free of charge"
  },
  {
    "path": "doc/.gitignore",
    "chars": 26,
    "preview": "apiref.rst\nconf.py\nmanual\n"
  },
  {
    "path": "doc/Makefile.am",
    "chars": 6883,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "doc/README.rst",
    "chars": 5144,
    "preview": "Spdylay Documentation\n=====================\n\nThe documentation of Spdylay is generated using Sphinx.  This\ndirectory con"
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/__init__.py",
    "chars": 371,
    "preview": "\"\"\"Sphinx ReadTheDocs theme.\n\nFrom https://github.com/ryan-roemer/sphinx-bootstrap-theme.\n\n\"\"\"\nimport os\n\nVERSION = (0, "
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/breadcrumbs.html",
    "chars": 1035,
    "preview": "<div role=\"navigation\" aria-label=\"breadcrumbs navigation\">\n  <ul class=\"wy-breadcrumbs\">\n    <li><a href=\"{{ pathto(mas"
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/footer.html",
    "chars": 1263,
    "preview": "<footer>\n  {% if next or prev %}\n    <div class=\"rst-footer-buttons\" role=\"navigation\" aria-label=\"footer navigation\">\n "
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/layout.html",
    "chars": 5260,
    "preview": "{# TEMPLATE VAR SETTINGS #}\n{%- set url_root = pathto('', 1) %}\n{%- if url_root == '#' %}{% set url_root = '' %}{% endif"
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/layout_old.html",
    "chars": 7341,
    "preview": "{#\n    basic/layout.html\n    ~~~~~~~~~~~~~~~~~\n\n    Master layout template for Sphinx themes.\n\n    :copyright: Copyright"
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/search.html",
    "chars": 1530,
    "preview": "{#\n    basic/search.html\n    ~~~~~~~~~~~~~~~~~\n\n    Template for the search page.\n\n    :copyright: Copyright 2007-2013 b"
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/searchbox.html",
    "chars": 308,
    "preview": "<div role=\"search\">\n  <form id =\"rtd-search-form\" class=\"wy-form\" action=\"{{ pathto('search') }}\" method=\"get\">\n    <inp"
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/static/css/badge_only.css",
    "chars": 3377,
    "preview": ".fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:\""
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/static/css/theme.css",
    "chars": 85592,
    "preview": "*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure"
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/static/js/theme.js",
    "chars": 1675,
    "preview": "$( document ).ready(function() {\n    // Shift nav in mobile when clicking the menu.\n    $(document).on('click', \"[data-t"
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/theme.conf",
    "chars": 125,
    "preview": "[theme]\ninherit = basic\nstylesheet = css/theme.css\n\n[options]\ntypekit_id = hiw1hhg\nanalytics_id = \nsticky_navigation = F"
  },
  {
    "path": "doc/_themes/sphinx_rtd_theme/versions.html",
    "chars": 1219,
    "preview": "{% if READTHEDOCS %}\n{# Add rst-badge after rst-versions for small badge style. #}\n  <div class=\"rst-versions\" data-togg"
  },
  {
    "path": "doc/android-spdy-proxy.rst",
    "chars": 5899,
    "preview": "SPDY Proxy with Firefox for Android\n===================================\n\nThis document describes how to use SPDY proxy f"
  },
  {
    "path": "doc/apiref-header.rst",
    "chars": 496,
    "preview": "API Reference\n=============\n\nIncludes\n--------\n\nTo use the public APIs, include ``spdylay/spdylay.h``::\n\n    #include <s"
  },
  {
    "path": "doc/conf.py.in",
    "chars": 8429,
    "preview": "# -*- coding: utf-8 -*-\n# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby grant"
  },
  {
    "path": "doc/index.rst",
    "chars": 1279,
    "preview": ".. Spdylay documentation master file, created by\n   sphinx-quickstart on Sun Mar 11 22:57:49 2012.\n   You can adapt this"
  },
  {
    "path": "doc/make.bat",
    "chars": 4513,
    "preview": "@ECHO OFF\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset BUI"
  },
  {
    "path": "doc/mkapiref.py",
    "chars": 7200,
    "preview": "#!/usr/bin/env python\n# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted"
  },
  {
    "path": "doc/package_README.rst",
    "chars": 27,
    "preview": ".. include:: ../README.rst\n"
  },
  {
    "path": "doc/python.rst",
    "chars": 35576,
    "preview": "Python-spdylay - Spdylay Python Extension Module\n================================================\n\n.. py:module:: spdyla"
  },
  {
    "path": "examples/.gitignore",
    "chars": 19,
    "preview": "spdynative\nspdycli\n"
  },
  {
    "path": "examples/Makefile.am",
    "chars": 1442,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "examples/README.rst",
    "chars": 51,
    "preview": "spdycat, spdyd and shrpx were moved to ``../src``.\n"
  },
  {
    "path": "examples/spdy.h",
    "chars": 6984,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "examples/spdycli.c",
    "chars": 21112,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "examples/spdynative.cc",
    "chars": 1655,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "fedora/spdylay.spec",
    "chars": 1940,
    "preview": "Prefix: %{_usr}\nName: spdylay\nVersion: 0.3.7\nRelease: 1%{?dist}\nSummary: The experimental SPDY protocol version 2 and 3 "
  },
  {
    "path": "lib/Makefile.am",
    "chars": 2017,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "lib/includes/Makefile.am",
    "chars": 1187,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "lib/includes/spdylay/spdylay.h",
    "chars": 69366,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/includes/spdylay/spdylayver.h.in",
    "chars": 1337,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/libspdylay.pc.in",
    "chars": 1379,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "lib/spdylay_buffer.c",
    "chars": 6467,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_buffer.h",
    "chars": 5783,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_frame.c",
    "chars": 37236,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_frame.h",
    "chars": 27858,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_gzip.c",
    "chars": 2749,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_gzip.h",
    "chars": 1388,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_helper.c",
    "chars": 4064,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_helper.h",
    "chars": 2819,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_int.h",
    "chars": 1438,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_map.c",
    "chars": 5167,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_map.h",
    "chars": 4440,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_net.h",
    "chars": 1539,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_npn.c",
    "chars": 3366,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_npn.h",
    "chars": 1324,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_outbound_item.c",
    "chars": 2854,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_outbound_item.h",
    "chars": 2272,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_pq.c",
    "chars": 3013,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_pq.h",
    "chars": 2890,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_queue.c",
    "chars": 2457,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_queue.h",
    "chars": 1857,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_session.c",
    "chars": 106202,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_session.h",
    "chars": 19785,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_stream.c",
    "chars": 3688,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_stream.h",
    "chars": 6100,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_submit.c",
    "chars": 11023,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_submit.h",
    "chars": 1338,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_zlib.c",
    "chars": 19730,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "lib/spdylay_zlib.h",
    "chars": 4054,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "m4/README",
    "chars": 50,
    "preview": "Empty m4 directory to make `autoreconf -i` happy.\n"
  },
  {
    "path": "makerelease.sh",
    "chars": 240,
    "preview": "#!/bin/sh -e\n\nTAG=$1\nPREV_TAG=$2\n\ngit checkout refs/tags/$TAG\ngit log --pretty=fuller --date=short refs/tags/$PREV_TAG.."
  },
  {
    "path": "proxy.pac.sample",
    "chars": 162,
    "preview": "function FindProxyForURL(url, host) {\n  // For SPDY proxy\n  return \"HTTPS localhost:3000\";\n  // For conventional HTTP pr"
  },
  {
    "path": "python/MANIFEST.in",
    "chars": 87,
    "preview": "include spdylay.pyx cspdylay.pxd spdylay_tests.py spdyclient.py spdyserv.py README.rst\n"
  },
  {
    "path": "python/Makefile.am",
    "chars": 1239,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "python/README.rst",
    "chars": 3413,
    "preview": "Python-spdylay is a Python SPDY library on top of Spdylay C\nlibrary. It supports SPDY/2 and SPDY/3 protocol.\n\nIt does no"
  },
  {
    "path": "python/cspdylay.pxd",
    "chars": 11871,
    "preview": "from libc.stdint cimport uint8_t, uint16_t, uint32_t, int32_t\n\ncdef extern from 'spdylay/spdylay.h':\n\n    ctypedef enum "
  },
  {
    "path": "python/setup.py",
    "chars": 4440,
    "preview": "from distutils.core import setup\nfrom distutils.extension import Extension\n\nsetup(\n    name = 'python-spdylay',\n    # Al"
  },
  {
    "path": "python/spdyclient.py",
    "chars": 726,
    "preview": "#!/usr/bin/env python\n\n# The example SPDY client.  You need Python 3.3 or later because we\n# use TLS NPN.\n#\n# Usage: spd"
  },
  {
    "path": "python/spdylay.pyx",
    "chars": 62416,
    "preview": "cimport cspdylay\n\nfrom libc.stdlib cimport malloc, free\nfrom libc.string cimport memcpy, memset\nfrom libc.stdint cimport"
  },
  {
    "path": "python/spdylay_tests.py",
    "chars": 12790,
    "preview": "#!/usr/bin/env python\n\nimport unittest\nimport io\nimport collections\n\nimport spdylay\n\nclass BufferList:\n    def __init__("
  },
  {
    "path": "python/spdyserv.py",
    "chars": 1175,
    "preview": "#!/usr/bin/env python\n\n# The example SPDY server. Python 3.3 or later is required because TLS\n# NPN is used in spdylay.T"
  },
  {
    "path": "shrpx.conf.sample",
    "chars": 907,
    "preview": "#\n# Sample configuration file for Shrpx.\n#\n# * Line staring '#' is treated as comment.\n#\n# * The option name in the conf"
  },
  {
    "path": "src/.gitignore",
    "chars": 88,
    "preview": "spdycat\nspdyd\nshrpx\nshrpx-unittest\nshrpx-unittest.log\nshrpx-unittest.trs\ntest-suite.log\n"
  },
  {
    "path": "src/EventPoll.h",
    "chars": 1373,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/EventPollEvent.h",
    "chars": 1467,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/EventPoll_epoll.cc",
    "chars": 2767,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/EventPoll_epoll.h",
    "chars": 1971,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/EventPoll_kqueue.cc",
    "chars": 3143,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/EventPoll_kqueue.h",
    "chars": 2019,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/HtmlParser.cc",
    "chars": 5211,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/HtmlParser.h",
    "chars": 2305,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/Makefile.am",
    "chars": 4079,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "src/SpdyServer.cc",
    "chars": 29170,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/SpdyServer.h",
    "chars": 4458,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/base64.h",
    "chars": 5889,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2013 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/http-parser/0001-Support-custom-HTTP-version-string-e.g.-ICY.patch",
    "chars": 1439,
    "preview": "From 0230de8d757d45dad9ab9fa8cb84613b53eb80b6 Mon Sep 17 00:00:00 2001\nFrom: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>"
  },
  {
    "path": "src/http-parser/0002-Allow-chars-in-32-126-except-for-58-for-TOKEN.patch",
    "chars": 2980,
    "preview": "From fad236762ca992a8a4a2b7f6c7077ddb53da5888 Mon Sep 17 00:00:00 2001\nFrom: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>"
  },
  {
    "path": "src/http-parser/0003-Use-http_parser-for-tunneling-connection-transparent.patch",
    "chars": 1214,
    "preview": "From 0bde8052816e615cb4216e5ef07233ee4e625951 Mon Sep 17 00:00:00 2001\nFrom: Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>"
  },
  {
    "path": "src/http-parser/AUTHORS",
    "chars": 2462,
    "preview": "# Authors ordered by first contribution.\nRyan Dahl <ry@tinyclouds.org>\nJeremy Hinegardner <jeremy@hinegardner.org>\nSerge"
  },
  {
    "path": "src/http-parser/CONTRIBUTIONS",
    "chars": 184,
    "preview": "Contributors must agree to the Contributor License Agreement before patches\ncan be accepted.\n\nhttp://spreadsheets2.googl"
  },
  {
    "path": "src/http-parser/LICENSE-MIT",
    "chars": 1251,
    "preview": "http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright\nIgor Sysoev.\n\nAdditional changes are licensed u"
  },
  {
    "path": "src/http-parser/README.md",
    "chars": 7385,
    "preview": "HTTP Parser\n===========\n\n[![Build Status](https://travis-ci.org/joyent/http-parser.png?branch=master)](https://travis-ci"
  },
  {
    "path": "src/http-parser/bench.c",
    "chars": 3400,
    "preview": "/* Copyright Fedor Indutny. All rights reserved.\n *\n * Permission is hereby granted, free of charge, to any person obtai"
  },
  {
    "path": "src/http-parser/contrib/parsertrace.c",
    "chars": 4352,
    "preview": "/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev\n *\n * Additional changes are licensed under the s"
  },
  {
    "path": "src/http-parser/contrib/url_parser.c",
    "chars": 1122,
    "preview": "#include \"http_parser.h\"\n#include <stdio.h>\n#include <string.h>\n\nvoid\ndump_url (const char *url, const struct http_parse"
  },
  {
    "path": "src/http-parser/http_parser.c",
    "chars": 71186,
    "preview": "/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev\n *\n * Additional changes are licensed under the s"
  },
  {
    "path": "src/http-parser/http_parser.gyp",
    "chars": 2855,
    "preview": "# This file is used with the GYP meta build system.\n# http://code.google.com/p/gyp/\n# To build try this:\n#   svn co http"
  },
  {
    "path": "src/http-parser/http_parser.h",
    "chars": 12991,
    "preview": "/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n *\n * Permission is hereby granted, free of "
  },
  {
    "path": "src/http-parser/test.c",
    "chars": 103020,
    "preview": "/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.\n *\n * Permission is hereby granted, free of "
  },
  {
    "path": "src/shrpx-unittest.cc",
    "chars": 2677,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2013 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx.cc",
    "chars": 48099,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx.h",
    "chars": 1423,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_accesslog.cc",
    "chars": 3771,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_accesslog.h",
    "chars": 1504,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_client_handler.cc",
    "chars": 10218,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_client_handler.h",
    "chars": 3067,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_config.cc",
    "chars": 22007,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_config.h",
    "chars": 8996,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_downstream.cc",
    "chars": 10747,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_downstream.h",
    "chars": 5868,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_downstream_connection.cc",
    "chars": 1654,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_downstream_connection.h",
    "chars": 2213,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_downstream_queue.cc",
    "chars": 1945,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_downstream_queue.h",
    "chars": 1624,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_error.h",
    "chars": 1412,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_http.cc",
    "chars": 5708,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_http.h",
    "chars": 2686,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_http_downstream_connection.cc",
    "chars": 15042,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_http_downstream_connection.h",
    "chars": 2281,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_https_upstream.cc",
    "chars": 23384,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_https_upstream.h",
    "chars": 2578,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_io_control.cc",
    "chars": 1863,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_io_control.h",
    "chars": 1827,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_listen_handler.cc",
    "chars": 4331,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_listen_handler.h",
    "chars": 2285,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_log.cc",
    "chars": 2920,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_log.h",
    "chars": 3354,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_spdy_downstream_connection.cc",
    "chars": 15244,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_spdy_downstream_connection.h",
    "chars": 2452,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_spdy_session.cc",
    "chars": 37684,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_spdy_session.h",
    "chars": 3792,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_spdy_upstream.cc",
    "chars": 33301,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_spdy_upstream.h",
    "chars": 2791,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_ssl.cc",
    "chars": 27878,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_ssl.h",
    "chars": 5013,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_ssl_test.cc",
    "chars": 5783,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2013 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_ssl_test.h",
    "chars": 1388,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2013 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_thread_event_receiver.cc",
    "chars": 3193,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_thread_event_receiver.h",
    "chars": 1977,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_upstream.h",
    "chars": 2181,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_worker.cc",
    "chars": 2906,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/shrpx_worker.h",
    "chars": 1598,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/spdycat.cc",
    "chars": 36355,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/spdyd.cc",
    "chars": 6402,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/spdylay_config.h",
    "chars": 1302,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/spdylay_ssl.cc",
    "chars": 22733,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/spdylay_ssl.h",
    "chars": 5475,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/timegm.c",
    "chars": 2376,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2013 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/timegm.h",
    "chars": 1483,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2013 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/util.cc",
    "chars": 4603,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "src/util.h",
    "chars": 8712,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/.gitignore",
    "chars": 99,
    "preview": "end_to_end.py.log\nend_to_end.py.trs\nfailmalloc.log\nfailmalloc.trs\nmain.log\nmain.trs\ntest-suite.log\n"
  },
  {
    "path": "tests/Makefile.am",
    "chars": 2311,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "tests/end_to_end.py",
    "chars": 2830,
    "preview": "#!/usr/bin/env python\n\"\"\"End to end tests for the utility programs.\n\nThis test assumes the utilities inside src director"
  },
  {
    "path": "tests/failmalloc.c",
    "chars": 2582,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/failmalloc_test.c",
    "chars": 14430,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/failmalloc_test.h",
    "chars": 1348,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/main.c",
    "chars": 12284,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/malloc_wrapper.c",
    "chars": 2050,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/malloc_wrapper.h",
    "chars": 2278,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_buffer_test.c",
    "chars": 4513,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_buffer_test.h",
    "chars": 1324,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_frame_test.c",
    "chars": 29134,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_frame_test.h",
    "chars": 2724,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_gzip_test.c",
    "chars": 3849,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_gzip_test.h",
    "chars": 1285,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_map_test.c",
    "chars": 5280,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_map_test.h",
    "chars": 1352,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_npn_test.c",
    "chars": 3683,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Twist Inc.\n *\n * Permission is hereby granted, free of charge, to "
  },
  {
    "path": "tests/spdylay_npn_test.h",
    "chars": 1349,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Twist Inc.\n *\n * Permission is hereby granted, free of charge, to "
  },
  {
    "path": "tests/spdylay_pq_test.c",
    "chars": 2831,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_pq_test.h",
    "chars": 1269,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_queue_test.c",
    "chars": 1803,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_queue_test.h",
    "chars": 1281,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_session_test.c",
    "chars": 99345,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_session_test.h",
    "chars": 3774,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_stream_test.c",
    "chars": 1742,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_stream_test.h",
    "chars": 1303,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_test_helper.c",
    "chars": 2967,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_test_helper.h",
    "chars": 1674,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_zlib_test.c",
    "chars": 2785,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/spdylay_zlib_test.h",
    "chars": 1319,
    "preview": "/*\n * Spdylay - SPDY Library\n *\n * Copyright (c) 2012 Tatsuhiro Tsujikawa\n *\n * Permission is hereby granted, free of ch"
  },
  {
    "path": "tests/testdata/Makefile.am",
    "chars": 1172,
    "preview": "# Spdylay - SPDY Library\n\n# Copyright (c) 2012 Tatsuhiro Tsujikawa\n\n# Permission is hereby granted, free of charge, to a"
  },
  {
    "path": "tests/testdata/cacert.pem",
    "chars": 1342,
    "preview": "-----BEGIN CERTIFICATE-----\nMIIDszCCApugAwIBAgIJAIwdWkdWObcIMA0GCSqGSIb3DQEBCwUAMHAxCzAJBgNV\nBAYTAlVTMQswCQYDVQQIDAJDQTE"
  },
  {
    "path": "tests/testdata/index.html",
    "chars": 32,
    "preview": "<html><body>small</body></html>\n"
  }
]

// ... and 2 more files (download for full content)

About this extraction

This page contains the full source code of the tatsuhiro-t/spdylay GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 202 files (1.6 MB), approximately 456.2k tokens, and a symbol index with 1077 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!